v.g.vassilev created this revision. v.g.vassilev added reviewers: hubert.reinterpretcast, lhames, uweigand. v.g.vassilev requested review of this revision.
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. Repository: rC Clang https://reviews.llvm.org/D102756 Files: clang/lib/Interpreter/IncrementalExecutor.cpp clang/lib/Interpreter/IncrementalExecutor.h clang/lib/Interpreter/Interpreter.cpp Index: clang/lib/Interpreter/Interpreter.cpp =================================================================== --- clang/lib/Interpreter/Interpreter.cpp +++ 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::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; } Index: clang/lib/Interpreter/IncrementalExecutor.h =================================================================== --- clang/lib/Interpreter/IncrementalExecutor.h +++ 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 @@ 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); Index: clang/lib/Interpreter/IncrementalExecutor.cpp =================================================================== --- clang/lib/Interpreter/IncrementalExecutor.cpp +++ 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();
Index: clang/lib/Interpreter/Interpreter.cpp =================================================================== --- clang/lib/Interpreter/Interpreter.cpp +++ 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::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; } Index: clang/lib/Interpreter/IncrementalExecutor.h =================================================================== --- clang/lib/Interpreter/IncrementalExecutor.h +++ 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 @@ 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); Index: clang/lib/Interpreter/IncrementalExecutor.cpp =================================================================== --- clang/lib/Interpreter/IncrementalExecutor.cpp +++ 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits