1343171Sdim//===----- JITTargetMachineBuilder.cpp - Build TargetMachines for JIT -----===// 2343171Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6343171Sdim// 7343171Sdim//===----------------------------------------------------------------------===// 8343171Sdim 9343171Sdim#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" 10343171Sdim 11360784Sdim#include "llvm/Support/Host.h" 12343171Sdim#include "llvm/Support/TargetRegistry.h" 13343171Sdim 14343171Sdimnamespace llvm { 15343171Sdimnamespace orc { 16343171Sdim 17343171SdimJITTargetMachineBuilder::JITTargetMachineBuilder(Triple TT) 18343171Sdim : TT(std::move(TT)) { 19343171Sdim Options.EmulatedTLS = true; 20343171Sdim Options.ExplicitEmulatedTLS = true; 21343171Sdim} 22343171Sdim 23343171SdimExpected<JITTargetMachineBuilder> JITTargetMachineBuilder::detectHost() { 24343171Sdim // FIXME: getProcessTriple is bogus. It returns the host LLVM was compiled on, 25343171Sdim // rather than a valid triple for the current process. 26360784Sdim JITTargetMachineBuilder TMBuilder((Triple(sys::getProcessTriple()))); 27360784Sdim 28360784Sdim // Retrieve host CPU name and sub-target features and add them to builder. 29360784Sdim // Relocation model, code model and codegen opt level are kept to default 30360784Sdim // values. 31360784Sdim llvm::StringMap<bool> FeatureMap; 32360784Sdim llvm::sys::getHostCPUFeatures(FeatureMap); 33360784Sdim for (auto &Feature : FeatureMap) 34360784Sdim TMBuilder.getFeatures().AddFeature(Feature.first(), Feature.second); 35360784Sdim 36360784Sdim TMBuilder.setCPU(llvm::sys::getHostCPUName()); 37360784Sdim 38360784Sdim return TMBuilder; 39343171Sdim} 40343171Sdim 41343171SdimExpected<std::unique_ptr<TargetMachine>> 42343171SdimJITTargetMachineBuilder::createTargetMachine() { 43343171Sdim 44343171Sdim std::string ErrMsg; 45343171Sdim auto *TheTarget = TargetRegistry::lookupTarget(TT.getTriple(), ErrMsg); 46343171Sdim if (!TheTarget) 47343171Sdim return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode()); 48343171Sdim 49343171Sdim auto *TM = 50343171Sdim TheTarget->createTargetMachine(TT.getTriple(), CPU, Features.getString(), 51343171Sdim Options, RM, CM, OptLevel, /*JIT*/ true); 52343171Sdim if (!TM) 53343171Sdim return make_error<StringError>("Could not allocate target machine", 54343171Sdim inconvertibleErrorCode()); 55343171Sdim 56343171Sdim return std::unique_ptr<TargetMachine>(TM); 57343171Sdim} 58343171Sdim 59343171SdimJITTargetMachineBuilder &JITTargetMachineBuilder::addFeatures( 60343171Sdim const std::vector<std::string> &FeatureVec) { 61343171Sdim for (const auto &F : FeatureVec) 62343171Sdim Features.AddFeature(F); 63343171Sdim return *this; 64343171Sdim} 65343171Sdim 66343171Sdim} // End namespace orc. 67343171Sdim} // End namespace llvm. 68