diff options
Diffstat (limited to 'llvm/lib/CodeGen/CommandFlags.cpp')
-rw-r--r-- | llvm/lib/CodeGen/CommandFlags.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp index 1eba979..c6d7827 100644 --- a/llvm/lib/CodeGen/CommandFlags.cpp +++ b/llvm/lib/CodeGen/CommandFlags.cpp @@ -18,8 +18,10 @@ #include "llvm/IR/Intrinsics.h" #include "llvm/IR/Module.h" #include "llvm/MC/MCTargetOptionsCommandFlags.h" +#include "llvm/MC/TargetRegistry.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Target/TargetMachine.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/SubtargetFeature.h" #include "llvm/TargetParser/Triple.h" @@ -732,3 +734,24 @@ void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, for (Function &F : M) setFunctionAttributes(CPU, Features, F); } + +Expected<std::unique_ptr<TargetMachine>> +codegen::createTargetMachineForTriple(StringRef TargetTriple, + CodeGenOptLevel OptLevel) { + Triple TheTriple(TargetTriple); + std::string Error; + const auto *TheTarget = + TargetRegistry::lookupTarget(codegen::getMArch(), TheTriple, Error); + if (!TheTarget) + return createStringError(inconvertibleErrorCode(), Error); + auto *Target = TheTarget->createTargetMachine( + TheTriple.getTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(), + codegen::InitTargetOptionsFromCodeGenFlags(TheTriple), + codegen::getExplicitRelocModel(), codegen::getExplicitCodeModel(), + OptLevel); + if (!Target) + return createStringError(inconvertibleErrorCode(), + Twine("could not allocate target machine for ") + + TargetTriple); + return std::unique_ptr<TargetMachine>(Target); +} |