IR JIT(IR code) { SMDiagnostic errors; string parser_errors; ParseAssemblyString(code.assembly.c_str(),master.Program,errors,Context); if(master.debug) { cerr << "Code:\n" << code.assembly << endl; } llvm::Function* entryfn = master.Engine->FindFunctionNamed("entry"); if(entryfn == NULL) nerror("ERROR: Couldn't find program entry point."); if(!errors.getMessage().empty()) { entryfn->eraseFromParent(); nerror("IR Parsed with errors: ",errors.getMessage(),"\nCode: \n",code.assembly); } if(verifyModule(*master.Program,ReturnStatusAction,&parser_errors)) { entryfn->eraseFromParent(); nerror("IR Parser Error: ",parser_errors); } master.Passes.run(*master.Program); if(master.debug) { cerr << "\nIR:" << endl; master.Program->dump(); } return code; }
VALUE llvm_module_read_assembly(VALUE self, VALUE assembly) { Check_Type(assembly, T_STRING); ParseError e; Module *module = ParseAssemblyString( StringValuePtr(assembly), LLVM_MODULE(self), e ); //TODO How do we handle errors? return Data_Wrap_Struct(cLLVMModule, NULL, NULL, module); }
void CodeGeneratorTest::ParseAssembly(const char *Assembly) { this->assembly = assembly; M = new Module("Module", getGlobalContext()); SMDiagnostic Error; bool Parsed = ParseAssemblyString(Assembly, M, Error, M->getContext()) == M; std::string errMsg; raw_string_ostream os(errMsg); Error.print("", os); if (!Parsed) { // A failure here means that the test itself is buggy. report_fatal_error(os.str().c_str()); } F = M->getFunction("test"); if (F == NULL) report_fatal_error("Test must have a function named @test"); }