xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/ExecutionEngine/Orc/JITTargetMachineBuilder.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
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