File indexing completed on 2026-05-10 08:43:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_JITTARGETMACHINEBUILDER_H
0014 #define LLVM_EXECUTIONENGINE_ORC_JITTARGETMACHINEBUILDER_H
0015
0016 #include "llvm/Support/CodeGen.h"
0017 #include "llvm/Support/Error.h"
0018 #include "llvm/Target/TargetMachine.h"
0019 #include "llvm/Target/TargetOptions.h"
0020 #include "llvm/TargetParser/SubtargetFeature.h"
0021 #include "llvm/TargetParser/Triple.h"
0022 #include <memory>
0023 #include <optional>
0024 #include <string>
0025 #include <vector>
0026
0027 namespace llvm {
0028
0029 class raw_ostream;
0030
0031 namespace orc {
0032
0033
0034 class JITTargetMachineBuilder {
0035 #ifndef NDEBUG
0036 friend class JITTargetMachineBuilderPrinter;
0037 #endif
0038 public:
0039
0040
0041
0042
0043
0044 JITTargetMachineBuilder(Triple TT);
0045
0046
0047
0048
0049
0050
0051 static Expected<JITTargetMachineBuilder> detectHost();
0052
0053
0054
0055
0056
0057
0058
0059
0060 Expected<std::unique_ptr<TargetMachine>> createTargetMachine();
0061
0062
0063
0064
0065
0066
0067 Expected<DataLayout> getDefaultDataLayoutForTarget() {
0068 auto TM = createTargetMachine();
0069 if (!TM)
0070 return TM.takeError();
0071 return (*TM)->createDataLayout();
0072 }
0073
0074
0075 JITTargetMachineBuilder &setCPU(std::string CPU) {
0076 this->CPU = std::move(CPU);
0077 return *this;
0078 }
0079
0080
0081 const std::string &getCPU() const { return CPU; }
0082
0083
0084 JITTargetMachineBuilder &setRelocationModel(std::optional<Reloc::Model> RM) {
0085 this->RM = std::move(RM);
0086 return *this;
0087 }
0088
0089
0090 const std::optional<Reloc::Model> &getRelocationModel() const { return RM; }
0091
0092
0093 JITTargetMachineBuilder &setCodeModel(std::optional<CodeModel::Model> CM) {
0094 this->CM = std::move(CM);
0095 return *this;
0096 }
0097
0098
0099 const std::optional<CodeModel::Model> &getCodeModel() const { return CM; }
0100
0101
0102 JITTargetMachineBuilder &setCodeGenOptLevel(CodeGenOptLevel OptLevel) {
0103 this->OptLevel = OptLevel;
0104 return *this;
0105 }
0106
0107
0108 JITTargetMachineBuilder &setFeatures(StringRef FeatureString) {
0109 Features = SubtargetFeatures(FeatureString);
0110 return *this;
0111 }
0112
0113
0114 JITTargetMachineBuilder &
0115 addFeatures(const std::vector<std::string> &FeatureVec);
0116
0117
0118 SubtargetFeatures &getFeatures() { return Features; }
0119
0120
0121 const SubtargetFeatures &getFeatures() const { return Features; }
0122
0123
0124
0125
0126
0127
0128
0129 JITTargetMachineBuilder &setOptions(TargetOptions Options) {
0130 this->Options = std::move(Options);
0131 return *this;
0132 }
0133
0134
0135 TargetOptions &getOptions() { return Options; }
0136
0137
0138 const TargetOptions &getOptions() const { return Options; }
0139
0140
0141 Triple &getTargetTriple() { return TT; }
0142
0143
0144 const Triple &getTargetTriple() const { return TT; }
0145
0146 private:
0147 Triple TT;
0148 std::string CPU;
0149 SubtargetFeatures Features;
0150 TargetOptions Options;
0151 std::optional<Reloc::Model> RM;
0152 std::optional<CodeModel::Model> CM;
0153 CodeGenOptLevel OptLevel = CodeGenOptLevel::Default;
0154 };
0155
0156 #ifndef NDEBUG
0157 class JITTargetMachineBuilderPrinter {
0158 public:
0159 JITTargetMachineBuilderPrinter(JITTargetMachineBuilder &JTMB,
0160 StringRef Indent)
0161 : JTMB(JTMB), Indent(Indent) {}
0162 void print(raw_ostream &OS) const;
0163
0164 friend raw_ostream &operator<<(raw_ostream &OS,
0165 const JITTargetMachineBuilderPrinter &JTMBP) {
0166 JTMBP.print(OS);
0167 return OS;
0168 }
0169
0170 private:
0171 JITTargetMachineBuilder &JTMB;
0172 StringRef Indent;
0173 };
0174 #endif
0175
0176 }
0177 }
0178
0179 #endif