From e7673d982dc7ad8f848d79d6e457bf614ec1564f Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Sun, 23 Oct 2022 13:07:52 -0700 Subject: [PATCH] [ORC] Force linking of eh-frame registration functions from LLJIT.cpp. Since aedeb8d5570, which switched to EPC-based eh-frame registrationin LLJIT, the eh-frame registration functions need to be forcibly linked into the target process. Failure to link the eh-frame registration functions triggered a test failure in https://green.lab.llvm.org/green/job/clang-stage1-RA/31497, which was fixed by forcibly linking the registration functions into that test case in saf2b2214b4 (rdar://101083784), however it has also caused some tests (e.g. the C API unit tests) that depend on successful construction of an LLJIT instance to be skipped. Moving the forcible registration into LLJIT.cpp fixes the general issue. --- .../LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp | 7 ------- llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 8 ++++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/llvm/examples/OrcV2Examples/LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp b/llvm/examples/OrcV2Examples/LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp index 32c49f6..a7cb4fc 100644 --- a/llvm/examples/OrcV2Examples/LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp +++ b/llvm/examples/OrcV2Examples/LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp @@ -37,7 +37,6 @@ #include "llvm/ExecutionEngine/Orc/LLJIT.h" #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h" -#include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/ModuleSummaryIndex.h" @@ -173,12 +172,6 @@ Expected loadModule(StringRef Path, return ThreadSafeModule(std::move(*M), std::move(TSCtx)); } -// Make sure the eh-frame registration functions get linked into the binary. -LLVM_ATTRIBUTE_USED void linkComponents() { - errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper - << (void *)&llvm_orc_deregisterEHFrameSectionWrapper; -} - int main(int Argc, char *Argv[]) { InitLLVM X(Argc, Argv); diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 342651d..b41cdd3 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -16,6 +16,7 @@ #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/Shared/OrcError.h" +#include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/IRBuilder.h" @@ -1014,5 +1015,12 @@ LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) { CODLayer->setCloneToNewContextOnEmit(true); } +// In-process LLJIT uses eh-frame section wrappers via EPC, so we need to force +// them to be linked in. +LLVM_ATTRIBUTE_USED void linkComponents() { + errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper + << (void *)&llvm_orc_deregisterEHFrameSectionWrapper; +} + } // End namespace orc. } // End namespace llvm. -- 2.7.4