int main(int argc, char *argv[]) { auto compileOnly = false; auto logLevel = 4; for(auto i = 0; i < argc; ++i) { if(std::string(argv[i]).compare("-c") == 0 || std::string(argv[i]).compare("--compile") == 0) { compileOnly = true; } if(std::string(argv[i]).find("--log") == 0) { if(argv[i][5] < '0' || argv[i][5] > '4') { std::cerr << "Bad level" << std::endl; exit(2); } logLevel = argv[i][5] - '0'; } } yyparse(); InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); CodeGenContext context; context.dclog.max_level = debug_stream::level(logLevel); createCoreFunctions(context); context.generateCode(*programBlock); if (!compileOnly) { auto val = context.runCode(); (context.llclog << val.IntVal.getSExtValue() << "\n").flush(); } return 0; }
ExecutionEngine * JIT_to_ExecutionEngine (Module * m) { InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); PassRegistry * Registry = PassRegistry::getPassRegistry(); initializeCore(*Registry); initializeCodeGen(*Registry); initializeLowerIntrinsicsPass(*Registry); std::string errMessage; EngineBuilder builder{std::unique_ptr<Module>(m)}; builder.setErrorStr(&errMessage); builder.setMCPU(sys::getHostCPUName()); TargetOptions opts = InitTargetOptionsFromCodeGenFlags(); builder.setTargetOptions(opts); CodeGenOpt::Level optLevel = CodeGenOpt::Level::None; switch (OptLevel) { case '0': optLevel = CodeGenOpt::None; break; case '1': optLevel = CodeGenOpt::Less; break; case '2': optLevel = CodeGenOpt::Default; break; case '3': optLevel = CodeGenOpt::Aggressive; break; default: errs() << OptLevel << " is an invalid optimization level.\n"; } builder.setOptLevel(optLevel); if ((strncmp(lGetSystemISA(), "avx2", 4) == 0)) { std::vector<std::string> attrs; attrs.push_back("avx2"); builder.setMAttrs(attrs); } // builder.selectTarget(); if (LLVM_UNLIKELY(DumpGeneratedIR)) { if (IROutputFilename.empty()) { m->dump(); } else { std::error_code error; llvm::raw_fd_ostream out(IROutputFilename, error, sys::fs::OpenFlags::F_None); m->print(out, nullptr); } } ExecutionEngine * engine = builder.create(); ICGrepObjectCache * cache = nullptr; if (engine == nullptr) { throw std::runtime_error("Could not create ExecutionEngine: " + errMessage); } if (EnableObjectCache) { if (ObjectCacheDir.empty()) // Default is $HOME/.cache/icgrep cache = new ICGrepObjectCache(); else cache = new ICGrepObjectCache(ObjectCacheDir); engine->setObjectCache(cache); } return engine; }