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; }
IDISA::IDISA_Builder * GetIDISA_Builder(Module * mod) { bool hasAVX2 = (strncmp(lGetSystemISA(), "avx2", 4) == 0); unsigned theBlockSize = BlockSize; // from command line if (theBlockSize == 0) { // No BlockSize override: use processor SIMD width theBlockSize = hasAVX2 ? 256 : 128; } Type * bitBlockType = VectorType::get(IntegerType::get(getGlobalContext(), 64), theBlockSize/64); int blockSize = bitBlockType->isIntegerTy() ? cast<IntegerType>(bitBlockType)->getIntegerBitWidth() : cast<VectorType>(bitBlockType)->getBitWidth(); if (blockSize >= 256) { if (hasAVX2) { return new IDISA::IDISA_AVX2_Builder(mod, bitBlockType); } else{ return new IDISA::IDISA_SSE2_Builder(mod, bitBlockType); } } else if (blockSize == 64) return new IDISA::IDISA_I64_Builder(mod, bitBlockType); return new IDISA::IDISA_SSE2_Builder(mod, bitBlockType); }