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