enum Compiler::ErrorCode Compiler::config(const CompilerConfig &pConfig) { if (pConfig.getTarget() == nullptr) { return kInvalidConfigNoTarget; } llvm::TargetMachine *new_target = (pConfig.getTarget())->createTargetMachine(pConfig.getTriple(), pConfig.getCPU(), pConfig.getFeatureString(), pConfig.getTargetOptions(), pConfig.getRelocationModel(), pConfig.getCodeModel(), pConfig.getOptimizationLevel()); if (new_target == nullptr) { return ((mTarget != nullptr) ? kErrSwitchTargetMachine : kErrCreateTargetMachine); } // Replace the old TargetMachine. delete mTarget; mTarget = new_target; // Adjust register allocation policy according to the optimization level. // createFastRegisterAllocator: fast but bad quality // createLinearScanRegisterAllocator: not so fast but good quality if ((pConfig.getOptimizationLevel() == llvm::CodeGenOpt::None)) { llvm::RegisterRegAlloc::setDefault(llvm::createFastRegisterAllocator); } else { llvm::RegisterRegAlloc::setDefault(llvm::createGreedyRegisterAllocator); } return kSuccess; }
Compiler::Compiler(const CompilerConfig &pConfig) : mTarget(nullptr), mEnableOpt(true) { const std::string &triple = pConfig.getTriple(); enum ErrorCode err = config(pConfig); if (err != kSuccess) { ALOGE("%s (%s, features: %s)", GetErrorString(err), triple.c_str(), pConfig.getFeatureString().c_str()); return; } return; }
static inline bool ConfigCompiler(RSCompilerDriver &pRSCD) { RSCompiler *RSC = pRSCD.getCompiler(); CompilerConfig *config = NULL; config = new (std::nothrow) CompilerConfig(OptTargetTriple); if (config == NULL) { llvm::errs() << "Out of memory when create the compiler configuration!\n"; return false; } // llvm3.5 has removed the auto-detect feature for x86 subtarget, // so set features explicitly in bcc. if ((config->getTriple().find("i686") != std::string::npos) || (config->getTriple().find("x86_64") != std::string::npos)) { std::vector<std::string> fv; #if defined(__SSE3__) fv.push_back("+sse3"); #endif #if defined(__SSSE3__) fv.push_back("+ssse3"); #endif #if defined(__SSE4_1__) fv.push_back("+sse4.1"); #endif #if defined(__SSE4_2__) fv.push_back("+sse4.2"); #endif if (fv.size()) { config->setFeatureString(fv); } } switch (OptOptLevel) { case '0': config->setOptimizationLevel(llvm::CodeGenOpt::None); break; case '1': config->setOptimizationLevel(llvm::CodeGenOpt::Less); break; case '2': config->setOptimizationLevel(llvm::CodeGenOpt::Default); break; case '3': default: { config->setOptimizationLevel(llvm::CodeGenOpt::Aggressive); break; } } pRSCD.setConfig(config); Compiler::ErrorCode result = RSC->config(*config); if (OptRSDebugContext) { pRSCD.setDebugContext(true); } if (result != Compiler::kSuccess) { llvm::errs() << "Failed to configure the compiler! (detail: " << Compiler::GetErrorString(result) << ")\n"; return false; } return true; }