From 29aea7781fdd665707caac5d5fb8bd7ab6f31486 Mon Sep 17 00:00:00 2001 From: lixuanwang Date: Tue, 27 May 2025 11:43:14 +0800 Subject: [PATCH] [lab3] add print support for functions, blocks and instructions --- src/pysrc/sysy/middle_ir.py | 14 +++++++++++++- src/pysrc/sysy/utils/ir_parser.py | 3 +-- src/pysrc/sysyc.py | 12 +++++++----- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/pysrc/sysy/middle_ir.py b/src/pysrc/sysy/middle_ir.py index f30a40d..d6fe352 100644 --- a/src/pysrc/sysy/middle_ir.py +++ b/src/pysrc/sysy/middle_ir.py @@ -2,14 +2,26 @@ class MiddleFunction: def __init__(self, name: str): self.name = name self.basic_blocks = [] # List[MiddleBasicBlock] - + def __repr__(self): + return f"Function({self.name}):\n" + "\n".join(str(block) for block in self.basic_blocks) + def __str__(self): + return self.__repr__() + class MiddleBasicBlock: def __init__(self, name: str): self.name = name self.instructions = [] # List[MiddleInstruction] + def __repr__(self): + return f"BasicBlock({self.name}):\n" + "\n".join(str(instr) for instr in self.instructions) + def __str__(self): + return self.__repr__() class MiddleInstruction: def __init__(self, opcode: str, operands: list, dest=None): self.opcode = opcode # e.g., 'add' self.operands = operands # e.g., ['5', '7'] self.dest = dest # e.g., '%0' + def __repr__(self): + return f"{self.dest} = {self.opcode} " + ", ".join(self.operands) if self.dest else f"{self.opcode} " + ", ".join(self.operands) + def __str__(self): + return self.__repr__() \ No newline at end of file diff --git a/src/pysrc/sysy/utils/ir_parser.py b/src/pysrc/sysy/utils/ir_parser.py index d80072a..82dea4e 100644 --- a/src/pysrc/sysy/utils/ir_parser.py +++ b/src/pysrc/sysy/utils/ir_parser.py @@ -18,8 +18,7 @@ def parse_llvm_ir(ir_text: str) -> MiddleFunction: for instr in block.instructions: opcode = instr.opcode operands = [str(op) for op in instr.operands] - # 调试输出 - print(f"Instruction: {instr}, Opcode: {opcode}, Operands: {operands}") + # 如果是有返回值的指令(如 add),第一个操作数是 dest dest = None if hasattr(instr, 'name') and instr.name: diff --git a/src/pysrc/sysyc.py b/src/pysrc/sysyc.py index 3716b7a..db62eee 100644 --- a/src/pysrc/sysyc.py +++ b/src/pysrc/sysyc.py @@ -3,8 +3,9 @@ from sysy.utils.ir_parser import parse_llvm_ir from sysy.backend.x86_emitter import X86Emitter def main(): - if len(sys.argv) != 3: - print("Usage: sysyc.py ") + if len(sys.argv) != 2: + # print("Usage: sysyc.py ") + print("Usage: sysyc.py ") sys.exit(1) # 读取 LLVM IR @@ -13,11 +14,12 @@ def main(): # 解析并生成汇编 func = parse_llvm_ir(ir_text) + print(func) asm = X86Emitter().emit_function(func) # 写入文件 - with open(sys.argv[2], 'w') as f: - f.write(asm) - + # with open(sys.argv[2], 'w') as f: + # f.write(asm) + print(asm) if __name__ == "__main__": main()