def finalize(self): self.llvm_module_ref = llvm.parse_assembly(str(self.llvm_module)) pmb = llvm.create_pass_manager_builder() pmb.opt_level = 2 pm = llvm.create_module_pass_manager() pmb.populate(pm) pm.run(self.llvm_module_ref)
def compile(self, module): """Compile the module to a relocatable object for this target.""" if os.getenv("ARTIQ_DUMP_SIG"): print("====== MODULE_SIGNATURE DUMP ======", file=sys.stderr) print(module, file=sys.stderr) if os.getenv("ARTIQ_DUMP_IR"): print("====== ARTIQ IR DUMP ======", file=sys.stderr) type_printer = types.TypePrinter() for function in module.artiq_ir: print(function.as_entity(type_printer), file=sys.stderr) llmod = module.build_llvm_ir(self) try: llparsedmod = llvm.parse_assembly(str(llmod)) llparsedmod.verify() except RuntimeError: print("====== LLVM IR DUMP (PARSE FAILED) ======", file=sys.stderr) print(str(llmod), file=sys.stderr) raise if os.getenv("ARTIQ_DUMP_LLVM"): print("====== LLVM IR DUMP ======", file=sys.stderr) print(str(llparsedmod), file=sys.stderr) llpassmgrbuilder = llvm.create_pass_manager_builder() llpassmgrbuilder.opt_level = 2 # -O2 llpassmgrbuilder.size_level = 1 # -Os llpassmgrbuilder.inlining_threshold = 75 # -Os threshold llpassmgr = llvm.create_module_pass_manager() llpassmgrbuilder.populate(llpassmgr) llpassmgr.run(llparsedmod) if os.getenv("ARTIQ_DUMP_LLVM"): print("====== LLVM IR DUMP (OPTIMIZED) ======", file=sys.stderr) print(str(llparsedmod), file=sys.stderr) lltarget = llvm.Target.from_triple(self.triple) llmachine = lltarget.create_target_machine( features=",".join(["+{}".format(f) for f in self.features]), reloc="pic", codemodel="default") if os.getenv("ARTIQ_DUMP_ASSEMBLY"): print("====== ASSEMBLY DUMP ======", file=sys.stderr) print(llmachine.emit_assembly(llparsedmod), file=sys.stderr) return llmachine.emit_object(llparsedmod)
def compile(self, module): """Compile the module to a relocatable object for this target.""" if os.getenv("ARTIQ_DUMP_SIG"): print("====== MODULE_SIGNATURE DUMP ======", file=sys.stderr) print(module, file=sys.stderr) type_printer = types.TypePrinter() _dump(os.getenv("ARTIQ_DUMP_IR"), "ARTIQ IR", ".txt", lambda: "\n".join(fn.as_entity(type_printer) for fn in module.artiq_ir)) llmod = module.build_llvm_ir(self) try: llparsedmod = llvm.parse_assembly(str(llmod)) llparsedmod.verify() except RuntimeError: _dump("", "LLVM IR (broken)", ".ll", lambda: str(llmod)) raise _dump(os.getenv("ARTIQ_DUMP_UNOPT_LLVM"), "LLVM IR (generated)", "_unopt.ll", lambda: str(llparsedmod)) llpassmgrbuilder = llvm.create_pass_manager_builder() llpassmgrbuilder.opt_level = 2 # -O2 llpassmgrbuilder.size_level = 1 # -Os llpassmgrbuilder.inlining_threshold = 75 # -Os threshold llpassmgr = llvm.create_module_pass_manager() llpassmgrbuilder.populate(llpassmgr) llpassmgr.run(llparsedmod) _dump(os.getenv("ARTIQ_DUMP_LLVM"), "LLVM IR (optimized)", ".ll", lambda: str(llparsedmod)) return llparsedmod