1*b5893f02SDimitry Andric //===----- JITTargetMachineBuilder.cpp - Build TargetMachines for JIT -----===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric // The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric
10*b5893f02SDimitry Andric #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
11*b5893f02SDimitry Andric
12*b5893f02SDimitry Andric #include "llvm/Support/TargetRegistry.h"
13*b5893f02SDimitry Andric
14*b5893f02SDimitry Andric namespace llvm {
15*b5893f02SDimitry Andric namespace orc {
16*b5893f02SDimitry Andric
JITTargetMachineBuilder(Triple TT)17*b5893f02SDimitry Andric JITTargetMachineBuilder::JITTargetMachineBuilder(Triple TT)
18*b5893f02SDimitry Andric : TT(std::move(TT)) {
19*b5893f02SDimitry Andric Options.EmulatedTLS = true;
20*b5893f02SDimitry Andric Options.ExplicitEmulatedTLS = true;
21*b5893f02SDimitry Andric }
22*b5893f02SDimitry Andric
detectHost()23*b5893f02SDimitry Andric Expected<JITTargetMachineBuilder> JITTargetMachineBuilder::detectHost() {
24*b5893f02SDimitry Andric // FIXME: getProcessTriple is bogus. It returns the host LLVM was compiled on,
25*b5893f02SDimitry Andric // rather than a valid triple for the current process.
26*b5893f02SDimitry Andric return JITTargetMachineBuilder(Triple(sys::getProcessTriple()));
27*b5893f02SDimitry Andric }
28*b5893f02SDimitry Andric
29*b5893f02SDimitry Andric Expected<std::unique_ptr<TargetMachine>>
createTargetMachine()30*b5893f02SDimitry Andric JITTargetMachineBuilder::createTargetMachine() {
31*b5893f02SDimitry Andric
32*b5893f02SDimitry Andric std::string ErrMsg;
33*b5893f02SDimitry Andric auto *TheTarget = TargetRegistry::lookupTarget(TT.getTriple(), ErrMsg);
34*b5893f02SDimitry Andric if (!TheTarget)
35*b5893f02SDimitry Andric return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
36*b5893f02SDimitry Andric
37*b5893f02SDimitry Andric auto *TM =
38*b5893f02SDimitry Andric TheTarget->createTargetMachine(TT.getTriple(), CPU, Features.getString(),
39*b5893f02SDimitry Andric Options, RM, CM, OptLevel, /*JIT*/ true);
40*b5893f02SDimitry Andric if (!TM)
41*b5893f02SDimitry Andric return make_error<StringError>("Could not allocate target machine",
42*b5893f02SDimitry Andric inconvertibleErrorCode());
43*b5893f02SDimitry Andric
44*b5893f02SDimitry Andric return std::unique_ptr<TargetMachine>(TM);
45*b5893f02SDimitry Andric }
46*b5893f02SDimitry Andric
addFeatures(const std::vector<std::string> & FeatureVec)47*b5893f02SDimitry Andric JITTargetMachineBuilder &JITTargetMachineBuilder::addFeatures(
48*b5893f02SDimitry Andric const std::vector<std::string> &FeatureVec) {
49*b5893f02SDimitry Andric for (const auto &F : FeatureVec)
50*b5893f02SDimitry Andric Features.AddFeature(F);
51*b5893f02SDimitry Andric return *this;
52*b5893f02SDimitry Andric }
53*b5893f02SDimitry Andric
54*b5893f02SDimitry Andric } // End namespace orc.
55*b5893f02SDimitry Andric } // End namespace llvm.
56