forked from NUDT-compiler/nudt-compiler-cpp
commit
0ca72ff69b
@ -1,157 +0,0 @@
|
||||
clang++ -std=c++17 -O2 -lm -L/extlibs -I/extlibs -lantlr4-runtime -Wl,-rpath=/extlibs /coursegrader/submitdata/src/main.cpp /coursegrader/submitdata/src/mir/MIRInstr.cpp /coursegrader/submitdata/src/mir/RegAlloc.cpp /coursegrader/submitdata/src/mir/MIRBasicBlock.cpp /coursegrader/submitdata/src/mir/FrameLowering.cpp /coursegrader/submitdata/src/mir/MIRFunction.cpp /coursegrader/submitdata/src/mir/Register.cpp /coursegrader/submitdata/src/mir/AsmPrinter.cpp /coursegrader/submitdata/src/mir/Lowering.cpp /coursegrader/submitdata/src/mir/MIRContext.cpp /coursegrader/submitdata/src/mir/passes/PassManager.cpp /coursegrader/submitdata/src/mir/passes/Peephole.cpp /coursegrader/submitdata/src/utils/CLI.cpp /coursegrader/submitdata/src/utils/Log.cpp /coursegrader/submitdata/src/sem/Sema.cpp /coursegrader/submitdata/src/sem/SymbolTable.cpp /coursegrader/submitdata/src/sem/ConstEval.cpp /coursegrader/submitdata/src/frontend/SysYParser.cpp /coursegrader/submitdata/src/frontend/SysYBaseListener.cpp /coursegrader/submitdata/src/frontend/SysYLexer.cpp /coursegrader/submitdata/src/frontend/SysYBaseVisitor.cpp /coursegrader/submitdata/src/frontend/SyntaxTreePrinter.cpp /coursegrader/submitdata/src/frontend/SysYVisitor.cpp /coursegrader/submitdata/src/frontend/AntlrDriver.cpp /coursegrader/submitdata/src/frontend/SysYListener.cpp /coursegrader/submitdata/src/ir/BasicBlock.cpp /coursegrader/submitdata/src/ir/GlobalValue.cpp /coursegrader/submitdata/src/ir/Function.cpp /coursegrader/submitdata/src/ir/Value.cpp /coursegrader/submitdata/src/ir/IRBuilder.cpp /coursegrader/submitdata/src/ir/Type.cpp /coursegrader/submitdata/src/ir/IRPrinter.cpp /coursegrader/submitdata/src/ir/Context.cpp /coursegrader/submitdata/src/ir/Instruction.cpp /coursegrader/submitdata/src/ir/Module.cpp /coursegrader/submitdata/src/ir/passes/LICM.cpp /coursegrader/submitdata/src/ir/passes/DCE.cpp /coursegrader/submitdata/src/ir/passes/ConstProp.cpp /coursegrader/submitdata/src/ir/passes/CFGSimplify.cpp /coursegrader/submitdata/src/ir/passes/CSE.cpp /coursegrader/submitdata/src/ir/passes/PassManager.cpp /coursegrader/submitdata/src/ir/passes/Mem2Reg.cpp /coursegrader/submitdata/src/ir/passes/ConstFold.cpp /coursegrader/submitdata/src/ir/analysis/DominatorTree.cpp /coursegrader/submitdata/src/ir/analysis/LoopInfo.cpp /coursegrader/submitdata/src/irgen/IRGenExp.cpp /coursegrader/submitdata/src/irgen/IRGenDecl.cpp /coursegrader/submitdata/src/irgen/IRGenDriver.cpp /coursegrader/submitdata/src/irgen/IRGenStmt.cpp /coursegrader/submitdata/src/irgen/IRGenFunc.cpp /coursegrader/submitdata/sylib/sylib.c -I /coursegrader/submitdata/include/frontend -I /coursegrader/submitdata/include/irgen -I /coursegrader/submitdata/include/mir -I /coursegrader/submitdata/include/sem -I /coursegrader/submitdata/include/utils -I /coursegrader/submitdata/include/ir -I /coursegrader/submitdata/src/frontend -I /coursegrader/submitdata/sylib -o /root/run/compiler
|
||||
Stdout:
|
||||
|
||||
Stderr:
|
||||
clang++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
|
||||
/coursegrader/submitdata/src/main.cpp:7:10: fatal error: 'src/frontend/AntlrDriver.h' file not found
|
||||
7 | #include "src/frontend/AntlrDriver.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/MIRInstr.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/RegAlloc.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/MIRBasicBlock.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/FrameLowering.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/MIRFunction.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/Register.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/AsmPrinter.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/Lowering.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/MIRContext.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/mir/passes/Peephole.cpp:1:10: fatal error: 'include/mir/MIR.h' file not found
|
||||
1 | #include "include/mir/MIR.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/sem/Sema.cpp:1:10: fatal error: 'include/sem/Sema.h' file not found
|
||||
1 | #include "include/sem/Sema.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/sem/SymbolTable.cpp:3:10: fatal error: 'include/sem/SymbolTable.h' file not found
|
||||
3 | #include "include/sem/SymbolTable.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/frontend/SyntaxTreePrinter.cpp:1:10: fatal error: 'src/frontend/SyntaxTreePrinter.h' file not found
|
||||
1 | #include "src/frontend/SyntaxTreePrinter.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/frontend/AntlrDriver.cpp:2:10: fatal error: 'src/frontend/AntlrDriver.h' file not found
|
||||
2 | #include "src/frontend/AntlrDriver.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/BasicBlock.cpp:10:10: fatal error: 'include/ir/IR.h' file not found
|
||||
10 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Function.cpp:4:10: fatal error: 'include/ir/IR.h' file not found
|
||||
4 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Value.cpp:4:10: fatal error: 'include/ir/IR.h' file not found
|
||||
4 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/IRBuilder.cpp:5:10: fatal error: 'include/ir/IR.h' file not found
|
||||
5 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Type.cpp:2:10: fatal error: 'include/ir/IR.h' file not found
|
||||
2 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/IRPrinter.cpp:5:10: fatal error: 'include/ir/IR.h' file not found
|
||||
5 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Context.cpp:2:10: fatal error: 'include/ir/IR.h' file not found
|
||||
2 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Instruction.cpp:4:10: fatal error: 'include/ir/IR.h' file not found
|
||||
4 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/Module.cpp:3:10: fatal error: 'include/ir/IR.h' file not found
|
||||
3 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/LICM.cpp:1:10: fatal error: 'include/ir/IR.h' file not found
|
||||
1 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/DCE.cpp:7:10: fatal error: 'include/ir/IR.h' file not found
|
||||
7 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/ConstProp.cpp:7:10: fatal error: 'include/ir/IR.h' file not found
|
||||
7 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/CFGSimplify.cpp:5:10: fatal error: 'include/ir/IR.h' file not found
|
||||
5 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/CSE.cpp:10:10: fatal error: 'include/ir/IR.h' file not found
|
||||
10 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/PassManager.cpp:3:10: fatal error: 'include/ir/IR.h' file not found
|
||||
3 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/Mem2Reg.cpp:5:10: fatal error: 'include/ir/IR.h' file not found
|
||||
5 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/passes/ConstFold.cpp:5:10: fatal error: 'include/ir/IR.h' file not found
|
||||
5 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/ir/analysis/DominatorTree.cpp:1:10: fatal error: 'include/ir/IR.h' file not found
|
||||
1 | #include "include/ir/IR.h"
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/irgen/IRGenExp.cpp:1:10: fatal error: 'include/irgen/IRGen.h' file not found
|
||||
1 | #include "include/irgen/IRGen.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/irgen/IRGenDecl.cpp:1:10: fatal error: 'include/irgen/IRGen.h' file not found
|
||||
1 | #include "include/irgen/IRGen.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/irgen/IRGenDriver.cpp:1:10: fatal error: 'include/irgen/IRGen.h' file not found
|
||||
1 | #include "include/irgen/IRGen.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/irgen/IRGenStmt.cpp:1:10: fatal error: 'include/irgen/IRGen.h' file not found
|
||||
1 | #include "include/irgen/IRGen.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
/coursegrader/submitdata/src/irgen/IRGenFunc.cpp:1:10: fatal error: 'include/irgen/IRGen.h' file not found
|
||||
1 | #include "include/irgen/IRGen.h"
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~
|
||||
1 error generated.
|
||||
@ -1,9 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <iosfwd>
|
||||
|
||||
#include "antlr4-runtime.h"
|
||||
|
||||
// 以树状缩进形式直接打印 ANTLR parse tree。
|
||||
void PrintSyntaxTree(antlr4::tree::ParseTree* tree, antlr4::Parser* parser,
|
||||
std::ostream& os);
|
||||
@ -1,414 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <initializer_list>
|
||||
#include <iosfwd>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace ir
|
||||
{
|
||||
class Module;
|
||||
}
|
||||
|
||||
namespace mir
|
||||
{
|
||||
|
||||
class MIRContext
|
||||
{
|
||||
public:
|
||||
MIRContext() = default;
|
||||
};
|
||||
|
||||
MIRContext &DefaultContext();
|
||||
|
||||
enum class PhysReg
|
||||
{
|
||||
W0,
|
||||
W1,
|
||||
W2,
|
||||
W3,
|
||||
W4,
|
||||
W5,
|
||||
W6,
|
||||
W7,
|
||||
W8,
|
||||
W9,
|
||||
W10,
|
||||
W11,
|
||||
W12,
|
||||
W13,
|
||||
W14,
|
||||
W15,
|
||||
W16,
|
||||
W17,
|
||||
W18,
|
||||
W19,
|
||||
W20,
|
||||
W21,
|
||||
W22,
|
||||
W23,
|
||||
W24,
|
||||
W25,
|
||||
W26,
|
||||
W27,
|
||||
W28,
|
||||
W29,
|
||||
W30,
|
||||
X0,
|
||||
X1,
|
||||
X2,
|
||||
X3,
|
||||
X4,
|
||||
X5,
|
||||
X6,
|
||||
X7,
|
||||
X8,
|
||||
X9,
|
||||
X10,
|
||||
X11,
|
||||
X12,
|
||||
X13,
|
||||
X14,
|
||||
X15,
|
||||
X16,
|
||||
X17,
|
||||
X18,
|
||||
X19,
|
||||
X20,
|
||||
X21,
|
||||
X22,
|
||||
X23,
|
||||
X24,
|
||||
X25,
|
||||
X26,
|
||||
X27,
|
||||
X28,
|
||||
X29,
|
||||
X30,
|
||||
S0,
|
||||
S1,
|
||||
S2,
|
||||
S3,
|
||||
S4,
|
||||
S5,
|
||||
S6,
|
||||
S7,
|
||||
S8,
|
||||
S9,
|
||||
S10,
|
||||
S11,
|
||||
S12,
|
||||
S13,
|
||||
S14,
|
||||
S15,
|
||||
S16,
|
||||
S17,
|
||||
S18,
|
||||
S19,
|
||||
S20,
|
||||
S21,
|
||||
S22,
|
||||
S23,
|
||||
S24,
|
||||
S25,
|
||||
S26,
|
||||
S27,
|
||||
S28,
|
||||
S29,
|
||||
S30,
|
||||
S31,
|
||||
XZR,
|
||||
SP,
|
||||
WZR
|
||||
};
|
||||
|
||||
const char *PhysRegName(PhysReg reg);
|
||||
|
||||
enum class VRegClass
|
||||
{
|
||||
Int,
|
||||
Float,
|
||||
Ptr
|
||||
};
|
||||
|
||||
enum class Opcode
|
||||
{
|
||||
Prologue,
|
||||
Epilogue,
|
||||
MovImm,
|
||||
LoadStack,
|
||||
StoreStack,
|
||||
LoadStackAddr,
|
||||
LoadGlobal,
|
||||
StoreGlobal,
|
||||
LoadGlobalAddr,
|
||||
LoadMem,
|
||||
StoreMem,
|
||||
AddRR,
|
||||
SubRR,
|
||||
MulRR,
|
||||
DivRR,
|
||||
ModRR,
|
||||
AndRR,
|
||||
OrRR,
|
||||
XorRR,
|
||||
ShlRR,
|
||||
ShrRR,
|
||||
AsrRR,
|
||||
Asr64RR,
|
||||
Uxtw,
|
||||
Sxtw,
|
||||
CmpRR,
|
||||
CmpImm,
|
||||
FCmpRR,
|
||||
CSet,
|
||||
Csel,
|
||||
Smull,
|
||||
Msub,
|
||||
NegRR,
|
||||
FAddRR,
|
||||
FSubRR,
|
||||
FMulRR,
|
||||
FDivRR,
|
||||
Scvtf,
|
||||
FCvtzs,
|
||||
FMovWS,
|
||||
Br,
|
||||
CondBr,
|
||||
Call,
|
||||
Ret,
|
||||
LoadAddr,
|
||||
MovReg,
|
||||
};
|
||||
|
||||
enum class CondCode
|
||||
{
|
||||
EQ,
|
||||
NE,
|
||||
LT,
|
||||
LE,
|
||||
GT,
|
||||
GE
|
||||
};
|
||||
|
||||
class Operand
|
||||
{
|
||||
public:
|
||||
enum class Kind
|
||||
{
|
||||
Reg,
|
||||
VReg,
|
||||
Imm,
|
||||
FrameIndex,
|
||||
Label,
|
||||
Symbol
|
||||
};
|
||||
|
||||
static Operand Reg(PhysReg reg);
|
||||
static Operand VReg(int id, VRegClass vreg_class);
|
||||
static Operand Imm(int value);
|
||||
static Operand FrameIndex(int index);
|
||||
static Operand Label(int label_id);
|
||||
static Operand Symbol(std::string symbol);
|
||||
|
||||
Kind GetKind() const { return kind_; }
|
||||
PhysReg GetReg() const { return reg_; }
|
||||
int GetImm() const { return imm_; }
|
||||
int GetFrameIndex() const { return imm_; }
|
||||
int GetLabel() const { return imm_; }
|
||||
const std::string &GetSymbol() const { return symbol_; }
|
||||
int GetVRegId() const { return imm_; }
|
||||
VRegClass GetVRegClass() const { return vreg_class_; }
|
||||
|
||||
private:
|
||||
Operand(Kind kind, PhysReg reg, int imm,
|
||||
VRegClass vreg_class = VRegClass::Int, std::string symbol = "");
|
||||
|
||||
Kind kind_;
|
||||
PhysReg reg_;
|
||||
int imm_;
|
||||
std::string symbol_;
|
||||
VRegClass vreg_class_;
|
||||
};
|
||||
|
||||
class MachineInstr
|
||||
{
|
||||
public:
|
||||
MachineInstr(Opcode opcode, std::vector<Operand> operands = {});
|
||||
|
||||
Opcode GetOpcode() const { return opcode_; }
|
||||
const std::vector<Operand> &GetOperands() const { return operands_; }
|
||||
std::vector<Operand> &GetOperands() { return operands_; }
|
||||
|
||||
private:
|
||||
Opcode opcode_;
|
||||
std::vector<Operand> operands_;
|
||||
};
|
||||
|
||||
struct FrameSlot
|
||||
{
|
||||
int index = 0;
|
||||
int size = 4;
|
||||
int offset = 0;
|
||||
bool is_stack_arg = false;
|
||||
bool is_callee_stack_arg = false;
|
||||
};
|
||||
|
||||
class MachineBasicBlock
|
||||
{
|
||||
public:
|
||||
explicit MachineBasicBlock(std::string name, int label_id = -1);
|
||||
|
||||
const std::string &GetName() const { return name_; }
|
||||
int GetLabelId() const { return label_id_; }
|
||||
void SetLabelId(int label_id) { label_id_ = label_id; }
|
||||
|
||||
std::vector<MachineInstr> &GetInstructions() { return instructions_; }
|
||||
const std::vector<MachineInstr> &GetInstructions() const { return instructions_; }
|
||||
|
||||
MachineInstr &Append(Opcode opcode,
|
||||
std::initializer_list<Operand> operands = {});
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
int label_id_ = -1;
|
||||
std::vector<MachineInstr> instructions_;
|
||||
};
|
||||
|
||||
class MachineFunction
|
||||
{
|
||||
public:
|
||||
explicit MachineFunction(std::string name);
|
||||
|
||||
const std::string &GetName() const { return name_; }
|
||||
|
||||
MachineBasicBlock &GetEntry() { return *entry_; }
|
||||
const MachineBasicBlock &GetEntry() const { return *entry_; }
|
||||
|
||||
MachineBasicBlock *GetEntryPtr() { return entry_; }
|
||||
const MachineBasicBlock *GetEntryPtr() const { return entry_; }
|
||||
|
||||
MachineBasicBlock &CreateBlock(std::string name);
|
||||
MachineBasicBlock *FindBlock(const std::string &name);
|
||||
const MachineBasicBlock *FindBlock(const std::string &name) const;
|
||||
|
||||
std::vector<std::unique_ptr<MachineBasicBlock>> &GetBlocks()
|
||||
{
|
||||
return blocks_;
|
||||
}
|
||||
const std::vector<std::unique_ptr<MachineBasicBlock>> &GetBlocks() const
|
||||
{
|
||||
return blocks_;
|
||||
}
|
||||
|
||||
int CreateLabel();
|
||||
|
||||
int CreateFrameIndex(int size = 4);
|
||||
int CreateStackArgFrameIndex(int size = 4);
|
||||
int CreateCalleeStackArgFrameIndex(int size = 4);
|
||||
FrameSlot &GetFrameSlot(int index);
|
||||
const FrameSlot &GetFrameSlot(int index) const;
|
||||
const std::vector<FrameSlot> &GetFrameSlots() const { return frame_slots_; }
|
||||
std::vector<FrameSlot> &GetFrameSlots() { return frame_slots_; }
|
||||
|
||||
int GetFrameSize() const { return frame_size_; }
|
||||
void SetFrameSize(int size) { frame_size_ = size; }
|
||||
|
||||
int CreateVReg(VRegClass vreg_class);
|
||||
VRegClass GetVRegClass(int vreg_id) const;
|
||||
int GetNumVRegs() const { return static_cast<int>(vreg_classes_.size()); }
|
||||
|
||||
void AddCalleeSavedReg(PhysReg reg);
|
||||
const std::vector<PhysReg> &GetCalleeSavedRegs() const { return callee_saved_regs_; }
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
std::vector<std::unique_ptr<MachineBasicBlock>> blocks_;
|
||||
MachineBasicBlock *entry_ = nullptr;
|
||||
|
||||
std::vector<FrameSlot> frame_slots_;
|
||||
int frame_size_ = 0;
|
||||
int next_label_id_ = 0;
|
||||
|
||||
std::vector<VRegClass> vreg_classes_;
|
||||
std::vector<PhysReg> callee_saved_regs_;
|
||||
};
|
||||
|
||||
struct MachineGlobal
|
||||
{
|
||||
enum class Kind
|
||||
{
|
||||
I32Scalar,
|
||||
I32Array
|
||||
};
|
||||
|
||||
std::string name;
|
||||
Kind kind = Kind::I32Scalar;
|
||||
int init_value = 0;
|
||||
size_t array_size = 0;
|
||||
std::vector<int> init_values;
|
||||
};
|
||||
|
||||
class MachineModule
|
||||
{
|
||||
public:
|
||||
MachineModule() = default;
|
||||
|
||||
MachineFunction &CreateFunction(std::string name);
|
||||
MachineFunction *GetFunction(const std::string &name);
|
||||
const MachineFunction *GetFunction(const std::string &name) const;
|
||||
|
||||
std::vector<std::unique_ptr<MachineFunction>> &GetFunctions()
|
||||
{
|
||||
return functions_;
|
||||
}
|
||||
const std::vector<std::unique_ptr<MachineFunction>> &GetFunctions() const
|
||||
{
|
||||
return functions_;
|
||||
}
|
||||
|
||||
void AddGlobalI32(std::string name, int init_value)
|
||||
{
|
||||
MachineGlobal g;
|
||||
g.name = std::move(name);
|
||||
g.kind = MachineGlobal::Kind::I32Scalar;
|
||||
g.init_value = init_value;
|
||||
globals_.push_back(std::move(g));
|
||||
}
|
||||
|
||||
void AddGlobalArrayI32(std::string name, size_t array_size,
|
||||
std::vector<int> init_values = {})
|
||||
{
|
||||
MachineGlobal g;
|
||||
g.name = std::move(name);
|
||||
g.kind = MachineGlobal::Kind::I32Array;
|
||||
g.array_size = array_size;
|
||||
g.init_values = std::move(init_values);
|
||||
globals_.push_back(std::move(g));
|
||||
}
|
||||
|
||||
std::vector<MachineGlobal> &GetGlobals() { return globals_; }
|
||||
const std::vector<MachineGlobal> &GetGlobals() const { return globals_; }
|
||||
|
||||
private:
|
||||
std::vector<std::unique_ptr<MachineFunction>> functions_;
|
||||
std::vector<MachineGlobal> globals_;
|
||||
};
|
||||
|
||||
std::unique_ptr<MachineModule> LowerModuleToMIR(const ir::Module &module);
|
||||
std::unique_ptr<MachineFunction> LowerToMIR(const ir::Module &module);
|
||||
|
||||
void RunRegAlloc(MachineFunction &function);
|
||||
void RunRegAlloc(MachineModule &module);
|
||||
|
||||
void RunFrameLowering(MachineFunction &function);
|
||||
void RunFrameLowering(MachineModule &module);
|
||||
|
||||
void RunPeephole(MachineFunction &function);
|
||||
void RunPeephole(MachineModule &module);
|
||||
|
||||
void PrintAsm(const MachineFunction &function, std::ostream &os);
|
||||
void PrintAsm(const MachineModule &module, std::ostream &os);
|
||||
|
||||
} // namespace mir
|
||||
@ -1,92 +0,0 @@
|
||||
// 基于语法树的语义检查与名称绑定。
|
||||
#pragma once
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#include "SysYParser.h"
|
||||
|
||||
class SemanticContext {
|
||||
public:
|
||||
void BindVarUse(SysYParser::LValContext* use,
|
||||
SysYParser::VarDefContext* decl) {
|
||||
var_uses_[use] = decl;
|
||||
}
|
||||
|
||||
SysYParser::VarDefContext* ResolveVarUse(
|
||||
const SysYParser::LValContext* use) const {
|
||||
auto it = var_uses_.find(use);
|
||||
return it == var_uses_.end() ? nullptr : it->second;
|
||||
}
|
||||
|
||||
void BindConstArrayUse(SysYParser::LValContext* use,
|
||||
SysYParser::ConstDefContext* decl) {
|
||||
const_array_uses_[use] = decl;
|
||||
}
|
||||
|
||||
SysYParser::ConstDefContext* ResolveConstArrayUse(
|
||||
const SysYParser::LValContext* use) const {
|
||||
auto it = const_array_uses_.find(use);
|
||||
return it == const_array_uses_.end() ? nullptr : it->second;
|
||||
}
|
||||
|
||||
void BindConstScalarUse(SysYParser::LValContext* use,
|
||||
SysYParser::ConstDefContext* decl) {
|
||||
const_scalar_uses_[use] = decl;
|
||||
}
|
||||
|
||||
SysYParser::ConstDefContext* ResolveConstScalarUse(
|
||||
const SysYParser::LValContext* use) const {
|
||||
auto it = const_scalar_uses_.find(use);
|
||||
return it == const_scalar_uses_.end() ? nullptr : it->second;
|
||||
}
|
||||
|
||||
void BindConstUse(SysYParser::LValContext* use, int value) {
|
||||
const_uses_[use] = value;
|
||||
}
|
||||
|
||||
const int* ResolveConstUse(const SysYParser::LValContext* use) const {
|
||||
auto it = const_uses_.find(use);
|
||||
return it == const_uses_.end() ? nullptr : &it->second;
|
||||
}
|
||||
|
||||
void BindConstFloatUse(SysYParser::LValContext* use, double value) {
|
||||
const_float_uses_[use] = value;
|
||||
}
|
||||
|
||||
const double* ResolveConstFloatUse(const SysYParser::LValContext* use) const {
|
||||
auto it = const_float_uses_.find(use);
|
||||
return it == const_float_uses_.end() ? nullptr : &it->second;
|
||||
}
|
||||
|
||||
void BindCallUse(SysYParser::UnaryExpContext* call,
|
||||
SysYParser::FuncDefContext* decl) {
|
||||
call_uses_[call] = decl;
|
||||
}
|
||||
|
||||
SysYParser::FuncDefContext* ResolveCallUse(
|
||||
const SysYParser::UnaryExpContext* call) const {
|
||||
auto it = call_uses_.find(call);
|
||||
return it == call_uses_.end() ? nullptr : it->second;
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_map<const SysYParser::LValContext*,
|
||||
SysYParser::VarDefContext*>
|
||||
var_uses_;
|
||||
std::unordered_map<const SysYParser::LValContext*, int> const_uses_;
|
||||
std::unordered_map<const SysYParser::LValContext*, double> const_float_uses_;
|
||||
std::unordered_map<const SysYParser::LValContext*,
|
||||
SysYParser::ConstDefContext*>
|
||||
const_array_uses_;
|
||||
std::unordered_map<const SysYParser::LValContext*,
|
||||
SysYParser::ConstDefContext*>
|
||||
const_scalar_uses_;
|
||||
std::unordered_map<const SysYParser::UnaryExpContext*,
|
||||
SysYParser::FuncDefContext*>
|
||||
call_uses_;
|
||||
};
|
||||
|
||||
// 目前仅检查:
|
||||
// - 变量先声明后使用
|
||||
// - 局部变量不允许重复定义
|
||||
SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit);
|
||||
@ -1,22 +0,0 @@
|
||||
// 极简符号表:记录局部变量定义点。
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include "SysYParser.h"
|
||||
|
||||
class SymbolTable {
|
||||
public:
|
||||
void EnterScope();
|
||||
void ExitScope();
|
||||
void Add(const std::string& name, SysYParser::VarDefContext* decl);
|
||||
bool ContainsInCurrent(const std::string& name) const;
|
||||
bool Contains(const std::string& name) const;
|
||||
SysYParser::VarDefContext* Lookup(const std::string& name) const;
|
||||
|
||||
private:
|
||||
std::vector<std::unordered_map<std::string, SysYParser::VarDefContext*>>
|
||||
scopes_;
|
||||
};
|
||||
@ -1,17 +0,0 @@
|
||||
// 命令行解析:支持比赛要求的 -S -o -O1 格式
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
struct CLIOptions {
|
||||
std::string input;
|
||||
std::string output; // -o 指定的输出文件路径
|
||||
bool emit_parse_tree = false;
|
||||
bool emit_ir = false;
|
||||
bool emit_asm = false;
|
||||
bool show_help = false;
|
||||
bool optimize = false; // -O 或 -O1
|
||||
int opt_level = 0; // 优化级别: 0, 1, 2, 3
|
||||
};
|
||||
|
||||
CLIOptions ParseCLI(int argc, char** argv);
|
||||
@ -1,20 +0,0 @@
|
||||
// 轻量日志接口。
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <exception>
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
|
||||
void LogInfo(std::string_view msg, std::ostream& os);
|
||||
void LogError(std::string_view msg, std::ostream& os);
|
||||
|
||||
std::string FormatError(std::string_view stage, std::string_view msg);
|
||||
std::string FormatErrorAt(std::string_view stage, std::size_t line,
|
||||
std::size_t column, std::string_view msg);
|
||||
bool HasErrorPrefix(std::string_view msg, std::string_view stage);
|
||||
void PrintException(std::ostream& os, const std::exception& ex);
|
||||
|
||||
// 打印命令行帮助信息(用于 `compiler --help`)。
|
||||
void PrintHelp(std::ostream& os);
|
||||
Loading…
Reference in new issue