void Codegen::createPasses() { llvm::TargetMachine *tm = targetMachine(); // llvm::DataLayout *dl = new llvm::DataLayout(&llvmModule()); modulePasses = new llvm::PassManager(); // modulePasses->add(dl); functionPasses = new llvm::FunctionPassManager(&llvmModule()); // functionPasses->add(dl); tm->addAnalysisPasses(*modulePasses); tm->addAnalysisPasses(*functionPasses); llvm::PassManagerBuilder pmBuilder; pmBuilder.OptLevel = options.optLevel; llvm::Triple targetTriple(llvmModule().getTargetTriple()); pmBuilder.LibraryInfo = new llvm::TargetLibraryInfo(targetTriple); if (nativeEnabled()) { codegenPasses = new llvm::PassManager(); // codegenPasses->add(dl); //codegenPasses->add(pmBuilder.LibraryInfo); tm->addAnalysisPasses(*codegenPasses); } unsigned inlineThreshold = 225; if (options.optLevel > 2) { inlineThreshold = 275; modulePasses->add(llvm::createStripSymbolsPass(true)); } pmBuilder.Inliner = llvm::createFunctionInliningPass(inlineThreshold); pmBuilder.populateFunctionPassManager(*functionPasses); pmBuilder.populateModulePassManager(*modulePasses); }
int main(int argc, const char * argv[]) { // Usage Message (TODO: Improve) if (argc < 3) { std::cerr << "Usage: " << argv[0] << " <FileName>\n" << "Compiles the file given by <FileName>\n"; return 1; } // Read in the file passed as the first argument std::ifstream fileStream; fileStream.open(argv[1]); // We'll output to the file passed in as the second argument std::error_code ec; auto openflags = llvm::sys::fs::F_None; auto out = std::make_unique<llvm::tool_output_file>(argv[2], ec, openflags); if (ec) { std::cerr << argv[0] << ": " << ec.message() << "\n"; return 1; } // Parse it! auto lex = Lexer(&fileStream); auto stmts = parse(&lex); // std::cout << "Result of parsing: \n"; // for (auto &stmt : stmts) { // std::cout << *stmt << ";\n"; // } auto prgm = Program(); prgm.addItems(stmts); prgm.finalize(); auto mod = prgm.module; /* DEBUG */ // mod->dump(); llvm::InitializeNativeTarget(); llvm::InitializeNativeTargetAsmPrinter(); llvm::InitializeNativeTargetAsmParser(); llvm::PassRegistry *registry = llvm::PassRegistry::getPassRegistry(); llvm::initializeCore(*registry); llvm::initializeCodeGen(*registry); llvm::initializeLoopStrengthReducePass(*registry); llvm::initializeLowerIntrinsicsPass(*registry); llvm::initializeUnreachableBlockElimPass(*registry); llvm::Triple targetTriple(mod->getTargetTriple()); if (targetTriple.getTriple().empty()) { targetTriple.setTriple(llvm::sys::getDefaultTargetTriple()); } std::cout << "Target Triple: " << targetTriple.getTriple() << "\n"; std::string error; const llvm::Target *target = llvm::TargetRegistry::lookupTarget("", targetTriple, error); if (! target) { std::cerr << argv[0] << ": " << error; return 1; } auto optLvl = llvm::CodeGenOpt::Default; switch ('0') { // TEmporary default: std::cerr << argv[0] << ": invalid optimization level.\n"; return 1; case ' ': break; case '0': optLvl = llvm::CodeGenOpt::None; break; case '1': optLvl = llvm::CodeGenOpt::Less; break; case '2': optLvl = llvm::CodeGenOpt::Default; break; case '3': optLvl = llvm::CodeGenOpt::Aggressive; break; } // llvm::TargetOptions options; // TODO: llc line 268 std::unique_ptr<llvm::TargetMachine> targetMachine(target->createTargetMachine(targetTriple.getTriple(), llvm::sys::getHostCPUName(), "", llvm::TargetOptions(), llvm::Reloc::Default, llvm::CodeModel::Default, optLvl)); assert(targetMachine && "Could not allocate target machine!"); llvm::PassManager passmanager; llvm::TargetLibraryInfo *TLI = new llvm::TargetLibraryInfo(targetTriple); passmanager.add(TLI); if (const llvm::DataLayout *datalayout = targetMachine->getSubtargetImpl()->getDataLayout()) mod->setDataLayout(datalayout); llvm::formatted_raw_ostream ostream(out->os()); // Ask the target to add backend passes as necessary. if (targetMachine->addPassesToEmitFile(passmanager, ostream, llvm::TargetMachine::CGFT_ObjectFile)) { std::cerr << argv[0] << ": target does not support generation of this" << " file type!\n"; return 1; } passmanager.run(*mod); out->keep(); return 0; }