17330f729Sjoerg //===----- JITTargetMachineBuilder.cpp - Build TargetMachines for JIT -----===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg
97330f729Sjoerg #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
107330f729Sjoerg
117330f729Sjoerg #include "llvm/Support/Host.h"
127330f729Sjoerg #include "llvm/Support/TargetRegistry.h"
13*82d56013Sjoerg #include "llvm/Support/raw_ostream.h"
147330f729Sjoerg
157330f729Sjoerg namespace llvm {
167330f729Sjoerg namespace orc {
177330f729Sjoerg
JITTargetMachineBuilder(Triple TT)187330f729Sjoerg JITTargetMachineBuilder::JITTargetMachineBuilder(Triple TT)
197330f729Sjoerg : TT(std::move(TT)) {
207330f729Sjoerg Options.EmulatedTLS = true;
217330f729Sjoerg Options.ExplicitEmulatedTLS = true;
227330f729Sjoerg }
237330f729Sjoerg
detectHost()247330f729Sjoerg Expected<JITTargetMachineBuilder> JITTargetMachineBuilder::detectHost() {
257330f729Sjoerg // FIXME: getProcessTriple is bogus. It returns the host LLVM was compiled on,
267330f729Sjoerg // rather than a valid triple for the current process.
277330f729Sjoerg JITTargetMachineBuilder TMBuilder((Triple(sys::getProcessTriple())));
287330f729Sjoerg
297330f729Sjoerg // Retrieve host CPU name and sub-target features and add them to builder.
307330f729Sjoerg // Relocation model, code model and codegen opt level are kept to default
317330f729Sjoerg // values.
327330f729Sjoerg llvm::StringMap<bool> FeatureMap;
337330f729Sjoerg llvm::sys::getHostCPUFeatures(FeatureMap);
347330f729Sjoerg for (auto &Feature : FeatureMap)
35*82d56013Sjoerg TMBuilder.getFeatures().AddFeature(Feature.first(), Feature.second);
367330f729Sjoerg
37*82d56013Sjoerg TMBuilder.setCPU(std::string(llvm::sys::getHostCPUName()));
387330f729Sjoerg
397330f729Sjoerg return TMBuilder;
407330f729Sjoerg }
417330f729Sjoerg
427330f729Sjoerg Expected<std::unique_ptr<TargetMachine>>
createTargetMachine()437330f729Sjoerg JITTargetMachineBuilder::createTargetMachine() {
447330f729Sjoerg
457330f729Sjoerg std::string ErrMsg;
467330f729Sjoerg auto *TheTarget = TargetRegistry::lookupTarget(TT.getTriple(), ErrMsg);
477330f729Sjoerg if (!TheTarget)
487330f729Sjoerg return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
497330f729Sjoerg
507330f729Sjoerg auto *TM =
517330f729Sjoerg TheTarget->createTargetMachine(TT.getTriple(), CPU, Features.getString(),
527330f729Sjoerg Options, RM, CM, OptLevel, /*JIT*/ true);
537330f729Sjoerg if (!TM)
547330f729Sjoerg return make_error<StringError>("Could not allocate target machine",
557330f729Sjoerg inconvertibleErrorCode());
567330f729Sjoerg
577330f729Sjoerg return std::unique_ptr<TargetMachine>(TM);
587330f729Sjoerg }
597330f729Sjoerg
addFeatures(const std::vector<std::string> & FeatureVec)607330f729Sjoerg JITTargetMachineBuilder &JITTargetMachineBuilder::addFeatures(
617330f729Sjoerg const std::vector<std::string> &FeatureVec) {
627330f729Sjoerg for (const auto &F : FeatureVec)
637330f729Sjoerg Features.AddFeature(F);
647330f729Sjoerg return *this;
657330f729Sjoerg }
667330f729Sjoerg
67*82d56013Sjoerg #ifndef NDEBUG
print(raw_ostream & OS) const68*82d56013Sjoerg void JITTargetMachineBuilderPrinter::print(raw_ostream &OS) const {
69*82d56013Sjoerg OS << Indent << "{\n"
70*82d56013Sjoerg << Indent << " Triple = \"" << JTMB.TT.str() << "\"\n"
71*82d56013Sjoerg << Indent << " CPU = \"" << JTMB.CPU << "\"\n"
72*82d56013Sjoerg << Indent << " Features = \"" << JTMB.Features.getString() << "\"\n"
73*82d56013Sjoerg << Indent << " Options = <not-printable>\n"
74*82d56013Sjoerg << Indent << " Relocation Model = ";
75*82d56013Sjoerg
76*82d56013Sjoerg if (JTMB.RM) {
77*82d56013Sjoerg switch (*JTMB.RM) {
78*82d56013Sjoerg case Reloc::Static:
79*82d56013Sjoerg OS << "Static";
80*82d56013Sjoerg break;
81*82d56013Sjoerg case Reloc::PIC_:
82*82d56013Sjoerg OS << "PIC_";
83*82d56013Sjoerg break;
84*82d56013Sjoerg case Reloc::DynamicNoPIC:
85*82d56013Sjoerg OS << "DynamicNoPIC";
86*82d56013Sjoerg break;
87*82d56013Sjoerg case Reloc::ROPI:
88*82d56013Sjoerg OS << "ROPI";
89*82d56013Sjoerg break;
90*82d56013Sjoerg case Reloc::RWPI:
91*82d56013Sjoerg OS << "RWPI";
92*82d56013Sjoerg break;
93*82d56013Sjoerg case Reloc::ROPI_RWPI:
94*82d56013Sjoerg OS << "ROPI_RWPI";
95*82d56013Sjoerg break;
96*82d56013Sjoerg }
97*82d56013Sjoerg } else
98*82d56013Sjoerg OS << "unspecified (will use target default)";
99*82d56013Sjoerg
100*82d56013Sjoerg OS << "\n"
101*82d56013Sjoerg << Indent << " Code Model = ";
102*82d56013Sjoerg
103*82d56013Sjoerg if (JTMB.CM) {
104*82d56013Sjoerg switch (*JTMB.CM) {
105*82d56013Sjoerg case CodeModel::Tiny:
106*82d56013Sjoerg OS << "Tiny";
107*82d56013Sjoerg break;
108*82d56013Sjoerg case CodeModel::Small:
109*82d56013Sjoerg OS << "Small";
110*82d56013Sjoerg break;
111*82d56013Sjoerg case CodeModel::Kernel:
112*82d56013Sjoerg OS << "Kernel";
113*82d56013Sjoerg break;
114*82d56013Sjoerg case CodeModel::Medium:
115*82d56013Sjoerg OS << "Medium";
116*82d56013Sjoerg break;
117*82d56013Sjoerg case CodeModel::Large:
118*82d56013Sjoerg OS << "Large";
119*82d56013Sjoerg break;
120*82d56013Sjoerg }
121*82d56013Sjoerg } else
122*82d56013Sjoerg OS << "unspecified (will use target default)";
123*82d56013Sjoerg
124*82d56013Sjoerg OS << "\n"
125*82d56013Sjoerg << Indent << " Optimization Level = ";
126*82d56013Sjoerg switch (JTMB.OptLevel) {
127*82d56013Sjoerg case CodeGenOpt::None:
128*82d56013Sjoerg OS << "None";
129*82d56013Sjoerg break;
130*82d56013Sjoerg case CodeGenOpt::Less:
131*82d56013Sjoerg OS << "Less";
132*82d56013Sjoerg break;
133*82d56013Sjoerg case CodeGenOpt::Default:
134*82d56013Sjoerg OS << "Default";
135*82d56013Sjoerg break;
136*82d56013Sjoerg case CodeGenOpt::Aggressive:
137*82d56013Sjoerg OS << "Aggressive";
138*82d56013Sjoerg break;
139*82d56013Sjoerg }
140*82d56013Sjoerg
141*82d56013Sjoerg OS << "\n" << Indent << "}\n";
142*82d56013Sjoerg }
143*82d56013Sjoerg #endif // NDEBUG
144*82d56013Sjoerg
1457330f729Sjoerg } // End namespace orc.
1467330f729Sjoerg } // End namespace llvm.
147