Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/JITTargetMachineBuilder.cpp
35266 views
//===----- JITTargetMachineBuilder.cpp - Build TargetMachines for JIT -----===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"910#include "llvm/ADT/StringMap.h"11#include "llvm/MC/TargetRegistry.h"12#include "llvm/Support/raw_ostream.h"13#include "llvm/TargetParser/Host.h"1415namespace llvm {16namespace orc {1718JITTargetMachineBuilder::JITTargetMachineBuilder(Triple TT)19: TT(std::move(TT)) {20Options.EmulatedTLS = true;21Options.UseInitArray = true;22}2324Expected<JITTargetMachineBuilder> JITTargetMachineBuilder::detectHost() {25JITTargetMachineBuilder TMBuilder((Triple(sys::getProcessTriple())));2627// Retrieve host CPU name and sub-target features and add them to builder.28// Relocation model, code model and codegen opt level are kept to default29// values.30for (const auto &Feature : llvm::sys::getHostCPUFeatures())31TMBuilder.getFeatures().AddFeature(Feature.first(), Feature.second);3233TMBuilder.setCPU(std::string(llvm::sys::getHostCPUName()));3435return TMBuilder;36}3738Expected<std::unique_ptr<TargetMachine>>39JITTargetMachineBuilder::createTargetMachine() {4041std::string ErrMsg;42auto *TheTarget = TargetRegistry::lookupTarget(TT.getTriple(), ErrMsg);43if (!TheTarget)44return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());4546if (!TheTarget->hasJIT())47return make_error<StringError>("Target has no JIT support",48inconvertibleErrorCode());4950auto *TM =51TheTarget->createTargetMachine(TT.getTriple(), CPU, Features.getString(),52Options, RM, CM, OptLevel, /*JIT*/ true);53if (!TM)54return make_error<StringError>("Could not allocate target machine",55inconvertibleErrorCode());5657return std::unique_ptr<TargetMachine>(TM);58}5960JITTargetMachineBuilder &JITTargetMachineBuilder::addFeatures(61const std::vector<std::string> &FeatureVec) {62for (const auto &F : FeatureVec)63Features.AddFeature(F);64return *this;65}6667#ifndef NDEBUG68void JITTargetMachineBuilderPrinter::print(raw_ostream &OS) const {69OS << Indent << "{\n"70<< Indent << " Triple = \"" << JTMB.TT.str() << "\"\n"71<< Indent << " CPU = \"" << JTMB.CPU << "\"\n"72<< Indent << " Features = \"" << JTMB.Features.getString() << "\"\n"73<< Indent << " Options = <not-printable>\n"74<< Indent << " Relocation Model = ";7576if (JTMB.RM) {77switch (*JTMB.RM) {78case Reloc::Static:79OS << "Static";80break;81case Reloc::PIC_:82OS << "PIC_";83break;84case Reloc::DynamicNoPIC:85OS << "DynamicNoPIC";86break;87case Reloc::ROPI:88OS << "ROPI";89break;90case Reloc::RWPI:91OS << "RWPI";92break;93case Reloc::ROPI_RWPI:94OS << "ROPI_RWPI";95break;96}97} else98OS << "unspecified (will use target default)";99100OS << "\n"101<< Indent << " Code Model = ";102103if (JTMB.CM) {104switch (*JTMB.CM) {105case CodeModel::Tiny:106OS << "Tiny";107break;108case CodeModel::Small:109OS << "Small";110break;111case CodeModel::Kernel:112OS << "Kernel";113break;114case CodeModel::Medium:115OS << "Medium";116break;117case CodeModel::Large:118OS << "Large";119break;120}121} else122OS << "unspecified (will use target default)";123124OS << "\n"125<< Indent << " Optimization Level = ";126switch (JTMB.OptLevel) {127case CodeGenOptLevel::None:128OS << "None";129break;130case CodeGenOptLevel::Less:131OS << "Less";132break;133case CodeGenOptLevel::Default:134OS << "Default";135break;136case CodeGenOptLevel::Aggressive:137OS << "Aggressive";138break;139}140141OS << "\n" << Indent << "}\n";142}143#endif // NDEBUG144145} // End namespace orc.146} // End namespace llvm.147148149