Author: Vassil Vassilev Date: 2021-05-21T08:16:42Z New Revision: 49f9532165f0cc0485a7da84662ebf63d155652c
URL: https://github.com/llvm/llvm-project/commit/49f9532165f0cc0485a7da84662ebf63d155652c DIFF: https://github.com/llvm/llvm-project/commit/49f9532165f0cc0485a7da84662ebf63d155652c.diff LOG: [clang-repl] Tell the LLJIT the exact target triple we use. Some systems use a different data layout. For instance, s390x the layout of machines with vector registers is different from the ones without. In such cases, the JIT will automatically detect the vector registers and go out of sync. This patch tells the JIT what is the target triple of the generated code so that both ends are in sync. Discussion available in https://reviews.llvm.org/D96033. Thanks to @uweigand for helping understand the issue. Differential revision https://reviews.llvm.org/D102756 Added: Modified: clang/lib/Interpreter/IncrementalExecutor.cpp clang/lib/Interpreter/IncrementalExecutor.h clang/lib/Interpreter/Interpreter.cpp Removed: ################################################################################ diff --git a/clang/lib/Interpreter/IncrementalExecutor.cpp b/clang/lib/Interpreter/IncrementalExecutor.cpp index f999e5eceaede..9a368d9122bcf 100644 --- a/clang/lib/Interpreter/IncrementalExecutor.cpp +++ b/clang/lib/Interpreter/IncrementalExecutor.cpp @@ -26,12 +26,14 @@ namespace clang { IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, - llvm::Error &Err) + llvm::Error &Err, + const llvm::Triple &Triple) : TSCtx(TSC) { using namespace llvm::orc; llvm::ErrorAsOutParameter EAO(&Err); - if (auto JitOrErr = LLJITBuilder().create()) + auto JTMB = JITTargetMachineBuilder(Triple); + if (auto JitOrErr = LLJITBuilder().setJITTargetMachineBuilder(JTMB).create()) Jit = std::move(*JitOrErr); else { Err = JitOrErr.takeError(); diff --git a/clang/lib/Interpreter/IncrementalExecutor.h b/clang/lib/Interpreter/IncrementalExecutor.h index c4e33a390942f..b4c6ddec10472 100644 --- a/clang/lib/Interpreter/IncrementalExecutor.h +++ b/clang/lib/Interpreter/IncrementalExecutor.h @@ -14,6 +14,7 @@ #define LLVM_CLANG_LIB_INTERPRETER_INCREMENTALEXECUTOR_H #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Triple.h" #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include <memory> @@ -34,7 +35,8 @@ class IncrementalExecutor { llvm::orc::ThreadSafeContext &TSCtx; public: - IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, llvm::Error &Err); + IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, llvm::Error &Err, + const llvm::Triple &Triple); ~IncrementalExecutor(); llvm::Error addModule(std::unique_ptr<llvm::Module> M); diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 79acb5bd68982..711a5e9ff0168 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -16,6 +16,7 @@ #include "IncrementalExecutor.h" #include "IncrementalParser.h" +#include "clang/AST/ASTContext.h" #include "clang/Basic/TargetInfo.h" #include "clang/CodeGen/ModuleBuilder.h" #include "clang/CodeGen/ObjectFilePCHContainerOperations.h" @@ -204,8 +205,11 @@ llvm::Expected<Transaction &> Interpreter::Parse(llvm::StringRef Code) { llvm::Error Interpreter::Execute(Transaction &T) { assert(T.TheModule); if (!IncrExecutor) { + const llvm::Triple &Triple = + getCompilerInstance()->getASTContext().getTargetInfo().getTriple(); llvm::Error Err = llvm::Error::success(); - IncrExecutor = std::make_unique<IncrementalExecutor>(*TSCtx, Err); + IncrExecutor = std::make_unique<IncrementalExecutor>(*TSCtx, Err, Triple); + if (Err) return Err; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits