123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- JITTargetMachineBuilder.h - Build TargetMachines for JIT -*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // A utitily for building TargetMachines for JITs.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_EXECUTIONENGINE_ORC_JITTARGETMACHINEBUILDER_H
- #define LLVM_EXECUTIONENGINE_ORC_JITTARGETMACHINEBUILDER_H
- #include "llvm/ADT/Optional.h"
- #include "llvm/ADT/Triple.h"
- #include "llvm/MC/SubtargetFeature.h"
- #include "llvm/Support/CodeGen.h"
- #include "llvm/Support/Error.h"
- #include "llvm/Target/TargetMachine.h"
- #include "llvm/Target/TargetOptions.h"
- #include <memory>
- #include <string>
- #include <vector>
- namespace llvm {
- class raw_ostream;
- namespace orc {
- /// A utility class for building TargetMachines for JITs.
- class JITTargetMachineBuilder {
- public:
- /// Create a JITTargetMachineBuilder based on the given triple.
- ///
- /// Note: TargetOptions is default-constructed, then EmulatedTLS and
- /// ExplicitEmulatedTLS are set to true. If EmulatedTLS is not
- /// required, these values should be reset before calling
- /// createTargetMachine.
- JITTargetMachineBuilder(Triple TT);
- /// Create a JITTargetMachineBuilder for the host system.
- ///
- /// Note: TargetOptions is default-constructed, then EmulatedTLS and
- /// ExplicitEmulatedTLS are set to true. If EmulatedTLS is not
- /// required, these values should be reset before calling
- /// createTargetMachine.
- static Expected<JITTargetMachineBuilder> detectHost();
- /// Create a TargetMachine.
- ///
- /// This operation will fail if the requested target is not registered,
- /// in which case see llvm/Support/TargetSelect.h. To JIT IR the Target and
- /// the target's AsmPrinter must both be registered. To JIT assembly
- /// (including inline and module level assembly) the target's AsmParser must
- /// also be registered.
- Expected<std::unique_ptr<TargetMachine>> createTargetMachine();
- /// Get the default DataLayout for the target.
- ///
- /// Note: This is reasonably expensive, as it creates a temporary
- /// TargetMachine instance under the hood. It is only suitable for use during
- /// JIT setup.
- Expected<DataLayout> getDefaultDataLayoutForTarget() {
- auto TM = createTargetMachine();
- if (!TM)
- return TM.takeError();
- return (*TM)->createDataLayout();
- }
- /// Set the CPU string.
- JITTargetMachineBuilder &setCPU(std::string CPU) {
- this->CPU = std::move(CPU);
- return *this;
- }
- /// Set the relocation model.
- JITTargetMachineBuilder &setRelocationModel(Optional<Reloc::Model> RM) {
- this->RM = std::move(RM);
- return *this;
- }
- /// Get the relocation model.
- const Optional<Reloc::Model> &getRelocationModel() const { return RM; }
- /// Set the code model.
- JITTargetMachineBuilder &setCodeModel(Optional<CodeModel::Model> CM) {
- this->CM = std::move(CM);
- return *this;
- }
- /// Get the code model.
- const Optional<CodeModel::Model> &getCodeModel() const { return CM; }
- /// Set the LLVM CodeGen optimization level.
- JITTargetMachineBuilder &setCodeGenOptLevel(CodeGenOpt::Level OptLevel) {
- this->OptLevel = OptLevel;
- return *this;
- }
- /// Set subtarget features.
- JITTargetMachineBuilder &setFeatures(StringRef FeatureString) {
- Features = SubtargetFeatures(FeatureString);
- return *this;
- }
- /// Add subtarget features.
- JITTargetMachineBuilder &
- addFeatures(const std::vector<std::string> &FeatureVec);
- /// Access subtarget features.
- SubtargetFeatures &getFeatures() { return Features; }
- /// Access subtarget features.
- const SubtargetFeatures &getFeatures() const { return Features; }
- /// Set TargetOptions.
- ///
- /// Note: This operation will overwrite any previously configured options,
- /// including EmulatedTLS and ExplicitEmulatedTLS which
- /// the JITTargetMachineBuilder sets by default. Clients are responsible
- /// for re-enabling these overwritten options.
- JITTargetMachineBuilder &setOptions(TargetOptions Options) {
- this->Options = std::move(Options);
- return *this;
- }
- /// Access TargetOptions.
- TargetOptions &getOptions() { return Options; }
- /// Access TargetOptions.
- const TargetOptions &getOptions() const { return Options; }
- /// Access Triple.
- Triple &getTargetTriple() { return TT; }
- /// Access Triple.
- const Triple &getTargetTriple() const { return TT; }
- #ifndef NDEBUG
- /// Debug-dump a JITTargetMachineBuilder.
- friend raw_ostream &operator<<(raw_ostream &OS,
- const JITTargetMachineBuilder &JTMB);
- #endif
- private:
- Triple TT;
- std::string CPU;
- SubtargetFeatures Features;
- TargetOptions Options;
- Optional<Reloc::Model> RM;
- Optional<CodeModel::Model> CM;
- CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
- };
- } // end namespace orc
- } // end namespace llvm
- #endif // LLVM_EXECUTIONENGINE_ORC_JITTARGETMACHINEBUILDER_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|