Mx Compiler
Published:
This huge project is assigned in MS208 course. We built a compiler from scratch, from the backend to the frontend (antlr4 used for parsing) and added multiple optimizing strategies to reach the -O1
baseline. It was really an Odyssey both for mind and body.
The tutorial repo is here. And my code is here.
The bloated project structure looks like this:
.
├── ast
│ ├── ArrayTypeNode.java
│ ├── AssignExprNode.java
│ ├── ASTNode.java
│ ├── ASTVisitor.java
│ ├── BinaryExprNode.java
│ ├── BlockStmtNode.java
│ ├── BoolLiteralNode.java
│ ├── BreakStmtNode.java
│ ├── ClassDefNode.java
│ ├── ContinueStmtNode.java
│ ├── ExprNode.java
│ ├── ForStmtNode.java
│ ├── FuncCallExprNode.java
│ ├── FuncDefNode.java
│ ├── IdExprNode.java
│ ├── IfStmtNode.java
│ ├── IntLiteralNode.java
│ ├── LiteralExprNode.java
│ ├── MemberExprNode.java
│ ├── MethodExprNode.java
│ ├── NewExprNode.java
│ ├── NullLiteralNode.java
│ ├── PrefixExprNode.java
│ ├── ProgramNode.java
│ ├── ProgramUnitNode.java
│ ├── ReturnStmtNode.java
│ ├── SimpleStmtNode.java
│ ├── SingleTypeNode.java
│ ├── StmtNode.java
│ ├── StringLiteralNode.java
│ ├── SubscriptExprNode.java
│ ├── SuffixExprNode.java
│ ├── ThisExprNode.java
│ ├── TypeNode.java
│ ├── VarDefStmtNode.java
│ ├── VarListNode.java
│ ├── VarNode.java
│ ├── VoidTypeNode.java
│ └── WhileStmtNode.java
├── backend
│ ├── BugEmitter.java
│ ├── CodeEmitter.java
│ ├── InstSelector.java
│ ├── LivenessAnalysis.java
│ ├── RegAllocator.java
│ ├── RegAllocator_origin.java
│ ├── RegisterAllocator.java
│ └── StackOverFlow.java
├── frontend
│ ├── ASTBuilder.java
│ └── SemanticChecker.java
├── ir
│ ├── AvoidDupNames.java
│ ├── Block.java
│ ├── CFGSimplifier.java
│ ├── Dominancer.java
│ ├── Function.java
│ ├── instruction
│ │ ├── AllocaInst.java
│ │ ├── BinaryInst.java
│ │ ├── BitcastToInst.java
│ │ ├── BrInst.java
│ │ ├── CallInst.java
│ │ ├── GetElementPtrInst.java
│ │ ├── IcmpInst.java
│ │ ├── Inst.java
│ │ ├── LoadInst.java
│ │ ├── MoveInst.java
│ │ ├── PhiInst.java
│ │ ├── RetInst.java
│ │ ├── StoreInst.java
│ │ └── TerminalInst.java
│ ├── IRBuilder.java
│ ├── IRPass.java
│ ├── IRPrinter.java
│ ├── IRTypeTable.java
│ ├── IRVisitor.java
│ ├── Module.java
│ ├── operand
│ │ ├── Constant.java
│ │ ├── ConstBool.java
│ │ ├── ConstInt.java
│ │ ├── ConstNull.java
│ │ ├── ConstString.java
│ │ ├── GlobalVar.java
│ │ ├── Operand.java
│ │ ├── Parameter.java
│ │ └── Register.java
│ ├── ResolveAlloca.java
│ ├── ResolvePhi.java
│ ├── SymbolTable.java
│ └── type
│ ├── ArrayType.java
│ ├── IntType.java
│ ├── IRType.java
│ ├── PointerType.java
│ ├── StructType.java
│ └── VoidType.java
├── Main.java
├── optimize
│ ├── ADCE.java
│ ├── CSE.java
│ ├── Inliner.java
│ ├── InstCombiner.java
│ ├── LICM.java
│ ├── Loop.java
│ ├── LoopTreeConstructor.java
│ ├── MemCSE.java
│ ├── Optimization.java
│ ├── ReverseDominancer.java
│ ├── SCCP.java
│ └── SillyEffectChecker.java
├── parser
│ ├── Mx.g4
│ ├── Mx.interp
│ ├── Mx.tokens
│ ├── MxBaseListener.java
│ ├── MxBaseVisitor.java
│ ├── MxLexer.interp
│ ├── MxLexer.java
│ ├── MxLexer.tokens
│ ├── MxListener.java
│ ├── MxParser.java
│ └── MxVisitor.java
├── riscv
│ ├── ASMBlock.java
│ ├── ASMFunction.java
│ ├── ASMModule.java
│ ├── ASMVisitor.java
│ ├── instuctions
│ │ ├── ASMInst.java
│ │ ├── Binary.java
│ │ ├── Br.java
│ │ ├── Bz.java
│ │ ├── Call.java
│ │ ├── IBinary.java
│ │ ├── Jp.java
│ │ ├── La.java
│ │ ├── Ld.java
│ │ ├── Li.java
│ │ ├── Lui.java
│ │ ├── Move.java
│ │ ├── RBinary.java
│ │ ├── Ret.java
│ │ ├── St.java
│ │ └── Unary.java
│ ├── operands
│ │ ├── Address.java
│ │ ├── ASMOperand.java
│ │ ├── BaseOffsetAddr.java
│ │ ├── GlobalVar.java
│ │ ├── Immediate.java
│ │ ├── IntImm.java
│ │ ├── register
│ │ │ ├── PhysicalRegister.java
│ │ │ ├── Register.java
│ │ │ └── VirtualRegister.java
│ │ ├── RelocationImm.java
│ │ └── StackAddr.java
│ ├── StackFrame.java
│ └── SymbolTable.java
└── util
├── entity
│ ├── Entity.java
│ ├── FuncEntity.java
│ └── VarEntity.java
├── error
│ ├── Error.java
│ ├── IRBuildingError.java
│ ├── SemanticError.java
│ └── SyntaxError.java
├── MxErrorListener.java
├── Pair.java
├── Position.java
├── Scope.java
├── SymbolTable.java
└── type
├── ArrayType.java
├── BasicType.java
├── BoolType.java
├── ClassType.java
├── IntType.java
├── NullType.java
├── StringType.java
├── Type.java
├── TypeTable.java
└── VoidType.java