[llvm] 6073dd9 - Revert "[ORC] Introduce LazyReexportsManager, JITLinkTrampolines, … (#118923)"
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 7 03:16:09 PST 2024
Author: Lang Hames
Date: 2024-12-07T22:15:27+11:00
New Revision: 6073dd923b82a526803d1f85f3531bc0a0721a88
URL: https://github.com/llvm/llvm-project/commit/6073dd923b82a526803d1f85f3531bc0a0721a88
DIFF: https://github.com/llvm/llvm-project/commit/6073dd923b82a526803d1f85f3531bc0a0721a88.diff
LOG: Revert "[ORC] Introduce LazyReexportsManager, JITLinkTrampolines, … (#118923)"
This reverts commit 570ecdcf8b44aec853ce381a5f6b77222b041afa while I investigate
bot failures, e.g. https://lab.llvm.org/buildbot/#/builders/17/builds/4446.
Added:
compiler-rt/test/orc/TestCases/Generic/orc-rt-executor-usage.test
llvm/test/ExecutionEngine/JITLink/Generic/Inputs/foo-ret-42.ll
llvm/test/ExecutionEngine/JITLink/Generic/Inputs/var-x-42.ll
llvm/test/ExecutionEngine/JITLink/Generic/lazy-link.ll
Modified:
compiler-rt/lib/orc/CMakeLists.txt
compiler-rt/test/orc/lit.cfg.py
llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
llvm/include/llvm/ExecutionEngine/Orc/Core.h
llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h
llvm/include/llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h
llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h
llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h
llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
llvm/lib/ExecutionEngine/Orc/Core.cpp
llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp
llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp
llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.h
Removed:
compiler-rt/lib/orc/sysv_reentry.arm64.S
compiler-rt/lib/orc/sysv_resolve.cpp
compiler-rt/test/orc/TestCases/Generic/Inputs/foo-ret-42.ll
compiler-rt/test/orc/TestCases/Generic/Inputs/var-x-42.ll
compiler-rt/test/orc/TestCases/Generic/lazy-link.ll
llvm/include/llvm/ExecutionEngine/Orc/JITLinkLazyCallThroughManager.h
llvm/include/llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h
llvm/lib/ExecutionEngine/Orc/JITLinkReentryTrampolines.cpp
################################################################################
diff --git a/compiler-rt/lib/orc/CMakeLists.txt b/compiler-rt/lib/orc/CMakeLists.txt
index f1ddf91bd8d1d3..36f4349a240e34 100644
--- a/compiler-rt/lib/orc/CMakeLists.txt
+++ b/compiler-rt/lib/orc/CMakeLists.txt
@@ -51,7 +51,6 @@ if (APPLE)
set(ORC_ASM_SOURCES
macho_tlv.x86-64.S
macho_tlv.arm64.S
- sysv_reentry.arm64.S
)
set(ORC_IMPL_HEADERS
@@ -62,7 +61,6 @@ if (APPLE)
set(ORC_SOURCES
${ORC_COMMON_SOURCES}
macho_platform.cpp
- sysv_resolve.cpp
)
add_compiler_rt_object_libraries(RTOrc
diff --git a/compiler-rt/lib/orc/sysv_reentry.arm64.S b/compiler-rt/lib/orc/sysv_reentry.arm64.S
deleted file mode 100644
index b831adec09b249..00000000000000
--- a/compiler-rt/lib/orc/sysv_reentry.arm64.S
+++ /dev/null
@@ -1,102 +0,0 @@
-//===-- sysv_reentry.arm64.s ------------------------------------*- ASM -*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of the ORC runtime support library.
-//
-//===----------------------------------------------------------------------===//
-
-// The content of this file is arm64-only
-#if defined(__arm64__) || defined(__aarch64__)
-
- .text
-
- // Saves GPRs, calls __orc_rt_sysv_resolve
- .globl __orc_rt_sysv_reentry
-__orc_rt_sysv_reentry:
- // Save register state, set up new stack frome.
- stp x27, x28, [sp, #-16]!
- stp x25, x26, [sp, #-16]!
- stp x23, x24, [sp, #-16]!
- stp x21, x22, [sp, #-16]!
- stp x19, x20, [sp, #-16]!
- stp x14, x15, [sp, #-16]!
- stp x12, x13, [sp, #-16]!
- stp x10, x11, [sp, #-16]!
- stp x8, x9, [sp, #-16]!
- stp x6, x7, [sp, #-16]!
- stp x4, x5, [sp, #-16]!
- stp x2, x3, [sp, #-16]!
- stp x0, x1, [sp, #-16]!
- stp q30, q31, [sp, #-32]!
- stp q28, q29, [sp, #-32]!
- stp q26, q27, [sp, #-32]!
- stp q24, q25, [sp, #-32]!
- stp q22, q23, [sp, #-32]!
- stp q20, q21, [sp, #-32]!
- stp q18, q19, [sp, #-32]!
- stp q16, q17, [sp, #-32]!
- stp q14, q15, [sp, #-32]!
- stp q12, q13, [sp, #-32]!
- stp q10, q11, [sp, #-32]!
- stp q8, q9, [sp, #-32]!
- stp q6, q7, [sp, #-32]!
- stp q4, q5, [sp, #-32]!
- stp q2, q3, [sp, #-32]!
- stp q0, q1, [sp, #-32]!
-
- // Look up the return address and subtract 8 from it (on the
- // assumption that it's a standard arm64 reentry trampoline) to get
- // back the trampoline's address.
- sub x0, x30, #8
-
- // Call __orc_rt_sysv_resolve to look up the implementation
- // corresponding to the calling stub, then store this in x17 (which
- // we'll return to below.
-#if !defined(__APPLE__)
- bl __orc_rt_sysv_resolve
-#else
- bl ___orc_rt_sysv_resolve
-#endif
- mov x17, x0
-
- // Restore the register state.
- ldp q0, q1, [sp], #32
- ldp q2, q3, [sp], #32
- ldp q4, q5, [sp], #32
- ldp q6, q7, [sp], #32
- ldp q8, q9, [sp], #32
- ldp q10, q11, [sp], #32
- ldp q12, q13, [sp], #32
- ldp q14, q15, [sp], #32
- ldp q16, q17, [sp], #32
- ldp q18, q19, [sp], #32
- ldp q20, q21, [sp], #32
- ldp q22, q23, [sp], #32
- ldp q24, q25, [sp], #32
- ldp q26, q27, [sp], #32
- ldp q28, q29, [sp], #32
- ldp q30, q31, [sp], #32
- ldp x0, x1, [sp], #16
- ldp x2, x3, [sp], #16
- ldp x4, x5, [sp], #16
- ldp x6, x7, [sp], #16
- ldp x8, x9, [sp], #16
- ldp x10, x11, [sp], #16
- ldp x12, x13, [sp], #16
- ldp x14, x15, [sp], #16
- ldp x19, x20, [sp], #16
- ldp x21, x22, [sp], #16
- ldp x23, x24, [sp], #16
- ldp x25, x26, [sp], #16
- ldp x27, x28, [sp], #16
- ldp x29, x30, [sp], #16
-
- // Return to the function implementation (rather than the stub).
- ret x17
-
-#endif // defined(__arm64__) || defined(__aarch64__)
diff --git a/compiler-rt/lib/orc/sysv_resolve.cpp b/compiler-rt/lib/orc/sysv_resolve.cpp
deleted file mode 100644
index 8e3c2ca750d75d..00000000000000
--- a/compiler-rt/lib/orc/sysv_resolve.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-//===- sysv_resolve.cpp ---------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains a generic "resolver" function compatible with the SysV
-// ABI.
-//
-//===----------------------------------------------------------------------===//
-
-#include "executor_symbol_def.h"
-#include "jit_dispatch.h"
-#include "wrapper_function_utils.h"
-
-#include <stdio.h>
-
-#define DEBUG_TYPE "sysv_resolve"
-
-using namespace orc_rt;
-
-// Declare function tags for functions in the JIT process.
-ORC_RT_JIT_DISPATCH_TAG(__orc_rt_resolve_tag)
-
-// FIXME: Make this configurable via an alias.
-static void __orc_rt_sysv_fail(void *Caller, const char *ErrMsg) {
- fprintf(stderr, "error resolving implementation for stub %p: %s\n", Caller,
- ErrMsg);
- abort();
-}
-
-extern "C" ORC_RT_HIDDEN void *__orc_rt_sysv_resolve(void *Caller) {
- Expected<ExecutorSymbolDef> Result((ExecutorSymbolDef()));
- if (auto Err = WrapperFunction<SPSExpected<SPSExecutorSymbolDef>(
- SPSExecutorAddr)>::call(JITDispatch(&__orc_rt_resolve_tag), Result,
- ExecutorAddr::fromPtr(Caller))) {
- __orc_rt_sysv_fail(Caller, toString(std::move(Err)).c_str());
- return nullptr; // Unreachable.
- }
-
- if (!Result) {
- __orc_rt_sysv_fail(Caller, toString(Result.takeError()).c_str());
- return nullptr; // Unreachable.
- }
-
- return Result->getAddress().toPtr<void *>();
-}
diff --git a/compiler-rt/test/orc/TestCases/Generic/orc-rt-executor-usage.test b/compiler-rt/test/orc/TestCases/Generic/orc-rt-executor-usage.test
new file mode 100644
index 00000000000000..951688d7961d4b
--- /dev/null
+++ b/compiler-rt/test/orc/TestCases/Generic/orc-rt-executor-usage.test
@@ -0,0 +1,6 @@
+// Test that the orc-remote-executor tool errors out as expected when called
+// with no arguments.
+//
+// RUN: not %orc_rt_executor 2>&1 | FileCheck %s
+
+// CHECK: usage: orc-rt-executor [help] [<mode>] <program arguments>...
diff --git a/compiler-rt/test/orc/lit.cfg.py b/compiler-rt/test/orc/lit.cfg.py
index 7a6eb4e7de3256..6dfa94b11cc9d9 100644
--- a/compiler-rt/test/orc/lit.cfg.py
+++ b/compiler-rt/test/orc/lit.cfg.py
@@ -16,11 +16,6 @@
host_arch_compatible = True
if host_arch_compatible:
config.available_features.add("host-arch-compatible")
-
-# If the target OS hasn't been set then assume host.
-if not config.target_os:
- config.target_os = config.host_os
-
config.test_target_is_host_executable = (
config.target_os == config.host_os and host_arch_compatible
)
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
index 1fa957178a122e..db440c378d24ff 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
@@ -755,32 +755,6 @@ inline Symbol &createAnonymousPointerJumpStub(LinkGraph &G,
sizeof(PointerJumpStubContent), true, false);
}
-/// AArch64 reentry trampoline.
-///
-/// Contains the instruction sequence for a trampoline that stores its return
-/// address on the stack and passes its own address in x0:
-/// STP x29, x30, [sp, #-16]!
-/// BL <reentry-symbol>
-extern const char ReentryTrampolineContent[8];
-
-/// Create a block of N reentry trampolines.
-inline Block &createReentryTrampolineBlock(LinkGraph &G,
- Section &TrampolineSection,
- Symbol &ReentrySymbol) {
- auto &B = G.createContentBlock(TrampolineSection, ReentryTrampolineContent,
- orc::ExecutorAddr(~uint64_t(7)), 4, 0);
- B.addEdge(Branch26PCRel, 4, ReentrySymbol, 0);
- return B;
-}
-
-inline Symbol &createAnonymousReentryTrampoline(LinkGraph &G,
- Section &TrampolineSection,
- Symbol &ReentrySymbol) {
- return G.addAnonymousSymbol(
- createReentryTrampolineBlock(G, TrampolineSection, ReentrySymbol), 0,
- sizeof(ReentryTrampolineContent), true, false);
-}
-
/// Global Offset Table Builder.
class GOTTableManager : public TableManager<GOTTableManager> {
public:
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index 9e3e46285c4085..e892005c53d8ec 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -51,26 +51,6 @@ enum class SymbolState : uint8_t;
using ResourceTrackerSP = IntrusiveRefCntPtr<ResourceTracker>;
using JITDylibSP = IntrusiveRefCntPtr<JITDylib>;
-/// A definition of a Symbol within a JITDylib.
-class SymbolInstance {
-public:
- using LookupAsyncOnCompleteFn =
- unique_function<void(Expected<ExecutorSymbolDef>)>;
-
- SymbolInstance(JITDylibSP JD, SymbolStringPtr Name)
- : JD(std::move(JD)), Name(std::move(Name)) {}
-
- const JITDylib &getJITDylib() const { return *JD; }
- const SymbolStringPtr &getName() const { return Name; }
-
- Expected<ExecutorSymbolDef> lookup() const;
- void lookupAsync(LookupAsyncOnCompleteFn OnComplete) const;
-
-private:
- JITDylibSP JD;
- SymbolStringPtr Name;
-};
-
using ResourceKey = uintptr_t;
/// API to remove / transfer ownership of JIT resources.
@@ -570,9 +550,6 @@ class MaterializationResponsibility {
/// emitted or notified of an error.
~MaterializationResponsibility();
- /// Return the ResourceTracker associated with this instance.
- const ResourceTrackerSP &getResourceTracker() const { return RT; }
-
/// Runs the given callback under the session lock, passing in the associated
/// ResourceKey. This is the safe way to associate resources with trackers.
template <typename Func> Error withResourceKeyDo(Func &&F) const {
@@ -1771,10 +1748,6 @@ class ExecutionSession {
JITDispatchHandlers;
};
-inline Expected<ExecutorSymbolDef> SymbolInstance::lookup() const {
- return JD->getExecutionSession().lookup({JD.get()}, Name);
-}
-
template <typename Func> Error ResourceTracker::withResourceKeyDo(Func &&F) {
return getJITDylib().getExecutionSession().runSessionLocked([&]() -> Error {
if (isDefunct())
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkLazyCallThroughManager.h b/llvm/include/llvm/ExecutionEngine/Orc/JITLinkLazyCallThroughManager.h
deleted file mode 100644
index 19075c76a6073a..00000000000000
--- a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkLazyCallThroughManager.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//===- JITLinkLazyCallThroughManager.h - JITLink based laziness -*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Redirectable Symbol Manager implementation using JITLink
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKLAZYCALLTHROUGHMANAGER_H
-#define LLVM_EXECUTIONENGINE_ORC_JITLINKLAZYCALLTHROUGHMANAGER_H
-
-#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
-#include "llvm/ExecutionEngine/Orc/RedirectionManager.h"
-#include "llvm/Support/StringSaver.h"
-
-#include <atomic>
-
-namespace llvm {
-namespace orc {} // namespace orc
-} // namespace llvm
-
-#endif // LLVM_EXECUTIONENGINE_ORC_JITLINKLAZYCALLTHROUGHMANAGER_H
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h b/llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h
index 83339e56cfa5f7..81d1d154d56008 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h
@@ -39,6 +39,12 @@ class JITLinkRedirectableSymbolManager : public RedirectableSymbolManager {
ObjLinkingLayer, AnonymousPtrCreator, PtrJumpStubCreator));
}
+ void emitRedirectableSymbols(std::unique_ptr<MaterializationResponsibility> R,
+ SymbolMap InitialDests) override;
+
+ Error redirect(JITDylib &JD, const SymbolMap &NewDests) override;
+
+private:
JITLinkRedirectableSymbolManager(
ObjectLinkingLayer &ObjLinkingLayer,
jitlink::AnonymousPointerCreator &AnonymousPtrCreator,
@@ -47,14 +53,6 @@ class JITLinkRedirectableSymbolManager : public RedirectableSymbolManager {
AnonymousPtrCreator(std::move(AnonymousPtrCreator)),
PtrJumpStubCreator(std::move(PtrJumpStubCreator)) {}
- ObjectLinkingLayer &getObjectLinkingLayer() const { return ObjLinkingLayer; }
-
- void emitRedirectableSymbols(std::unique_ptr<MaterializationResponsibility> R,
- SymbolMap InitialDests) override;
-
- Error redirect(JITDylib &JD, const SymbolMap &NewDests) override;
-
-private:
ObjectLinkingLayer &ObjLinkingLayer;
jitlink::AnonymousPointerCreator AnonymousPtrCreator;
jitlink::PointerJumpStubCreator PtrJumpStubCreator;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h b/llvm/include/llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h
deleted file mode 100644
index 673019b748b3b2..00000000000000
--- a/llvm/include/llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//===- JITLinkReentryTrampolines.h -- JITLink-based trampolines -*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Emit reentry trampolines via JITLink.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
-#define LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
-
-#include "llvm/ADT/FunctionExtras.h"
-#include "llvm/ExecutionEngine/Orc/Core.h"
-#include "llvm/ExecutionEngine/Orc/LazyReexports.h"
-#include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h"
-#include "llvm/Support/Error.h"
-
-namespace llvm::jitlink {
-class Block;
-class LinkGraph;
-class Section;
-class Symbol;
-} // namespace llvm::jitlink
-
-namespace llvm::orc {
-
-class ObjectLinkingLayer;
-class RedirectableSymbolManager;
-
-/// Produces trampolines on request using JITLink.
-class JITLinkReentryTrampolines {
-public:
- using EmitTrampolineFn = unique_function<jitlink::Symbol &(
- jitlink::LinkGraph &G, jitlink::Section &Sec,
- jitlink::Symbol &ReentrySym)>;
- using OnTrampolinesReadyFn = unique_function<void(
- Expected<std::vector<ExecutorSymbolDef>> EntryAddrs)>;
-
- /// Create trampolines using the default reentry trampoline function for
- /// the session triple.
- static Expected<std::unique_ptr<JITLinkReentryTrampolines>>
- Create(ObjectLinkingLayer &ObjLinkingLayer);
-
- JITLinkReentryTrampolines(ObjectLinkingLayer &ObjLinkingLayer,
- EmitTrampolineFn EmitTrampoline);
- JITLinkReentryTrampolines(JITLinkReentryTrampolines &&) = delete;
- JITLinkReentryTrampolines &operator=(JITLinkReentryTrampolines &&) = delete;
-
- void emit(ResourceTrackerSP RT, size_t NumTrampolines,
- OnTrampolinesReadyFn OnTrampolinesReady);
-
-private:
- class TrampolineAddrScraperPlugin;
-
- ObjectLinkingLayer &ObjLinkingLayer;
- TrampolineAddrScraperPlugin *TrampolineAddrScraper = nullptr;
- EmitTrampolineFn EmitTrampoline;
- std::atomic<size_t> ReentryGraphIdx{0};
-};
-
-Expected<std::unique_ptr<LazyReexportsManager>>
-createJITLinkLazyReexportsManager(ObjectLinkingLayer &ObjLinkingLayer,
- RedirectableSymbolManager &RSMgr,
- JITDylib &PlatformJD);
-
-} // namespace llvm::orc
-
-#endif // LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h
index 96223d71e4f6ae..800f6773f16f55 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h
@@ -18,13 +18,14 @@
namespace llvm::orc {
class ObjectLinkingLayer;
-class LazyReexportsManager;
+class LazyCallThroughManager;
class RedirectableSymbolManager;
class LazyObjectLinkingLayer : public ObjectLayer {
public:
LazyObjectLinkingLayer(ObjectLinkingLayer &BaseLayer,
- LazyReexportsManager &LRMgr);
+ LazyCallThroughManager &LCTMgr,
+ RedirectableSymbolManager &RSMgr);
llvm::Error add(llvm::orc::ResourceTrackerSP RT,
std::unique_ptr<llvm::MemoryBuffer> O,
@@ -37,7 +38,8 @@ class LazyObjectLinkingLayer : public ObjectLayer {
class RenamerPlugin;
ObjectLinkingLayer &BaseLayer;
- LazyReexportsManager &LRMgr;
+ LazyCallThroughManager &LCTMgr;
+ RedirectableSymbolManager &RSMgr;
};
} // namespace llvm::orc
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h
index 0dcf646b12dd81..6a43cb6fb6ca97 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h
@@ -173,70 +173,6 @@ lazyReexports(LazyCallThroughManager &LCTManager,
LCTManager, RSManager, SourceJD, std::move(CallableAliases), SrcJDLoc);
}
-class LazyReexportsManager {
-
- friend std::unique_ptr<MaterializationUnit>
- lazyReexports(LazyReexportsManager &, SymbolAliasMap);
-
-public:
- using OnTrampolinesReadyFn = unique_function<void(
- Expected<std::vector<ExecutorSymbolDef>> EntryAddrs)>;
- using EmitTrampolinesFn =
- unique_function<void(ResourceTrackerSP RT, size_t NumTrampolines,
- OnTrampolinesReadyFn OnTrampolinesReady)>;
-
- /// Create a LazyReexportsManager that uses the ORC runtime for reentry.
- /// This will work both in-process and out-of-process.
- static Expected<std::unique_ptr<LazyReexportsManager>>
- Create(EmitTrampolinesFn EmitTrampolines, RedirectableSymbolManager &RSMgr,
- JITDylib &PlatformJD);
-
- LazyReexportsManager(LazyReexportsManager &&) = delete;
- LazyReexportsManager &operator=(LazyReexportsManager &&) = delete;
-
-private:
- struct CallThroughInfo {
- SymbolStringPtr Name;
- SymbolStringPtr BodyName;
- JITDylibSP JD;
- };
-
- class MU;
- class Plugin;
-
- using ResolveSendResultFn =
- unique_function<void(Expected<ExecutorSymbolDef>)>;
-
- LazyReexportsManager(EmitTrampolinesFn EmitTrampolines,
- RedirectableSymbolManager &RSMgr, JITDylib &PlatformJD,
- Error &Err);
-
- std::unique_ptr<MaterializationUnit>
- createLazyReexports(SymbolAliasMap Reexports);
-
- void emitReentryTrampolines(std::unique_ptr<MaterializationResponsibility> MR,
- SymbolAliasMap Reexports);
- void emitRedirectableSymbols(
- std::unique_ptr<MaterializationResponsibility> MR,
- SymbolAliasMap Reexports,
- Expected<std::vector<ExecutorSymbolDef>> ReentryPoints);
- void resolve(ResolveSendResultFn SendResult, ExecutorAddr ReentryStubAddr);
-
- EmitTrampolinesFn EmitTrampolines;
- RedirectableSymbolManager &RSMgr;
-
- std::mutex M;
- DenseMap<ExecutorAddr, CallThroughInfo> CallThroughs;
-};
-
-/// Define lazy-reexports based on the given SymbolAliasMap. Each lazy re-export
-/// is a callable symbol that will look up and dispatch to the given aliasee on
-/// first call. All subsequent calls will go directly to the aliasee.
-inline std::unique_ptr<MaterializationUnit>
-lazyReexports(LazyReexportsManager &LRM, SymbolAliasMap Reexports) {
- return LRM.createLazyReexports(std::move(Reexports));
-}
-
} // End namespace orc
} // End namespace llvm
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
index 1f11d9f61f6a19..19f935d6658234 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
@@ -176,11 +176,6 @@ class MachOPlatform : public Platform {
static ArrayRef<std::pair<const char *, const char *>>
standardRuntimeUtilityAliases();
- /// Returns a list of aliases required to enable lazy compilation via the
- /// ORC runtime.
- static ArrayRef<std::pair<const char *, const char *>>
- standardLazyCompilationAliases();
-
private:
using SymbolTableVector = SmallVector<
std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h b/llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h
index f3d4c769387785..a1a5ffcf340669 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h
@@ -23,7 +23,6 @@ namespace orc {
class RedirectionManager {
public:
virtual ~RedirectionManager() = default;
-
/// Change the redirection destination of given symbols to new destination
/// symbols.
virtual Error redirect(JITDylib &JD, const SymbolMap &NewDests) = 0;
diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
index 968ed217d8a963..a79dbd5e4494f4 100644
--- a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
@@ -29,11 +29,6 @@ const char PointerJumpStubContent[12] = {
0x00, 0x02, 0x1f, (char)0xd6u // BR x16
};
-const char ReentryTrampolineContent[8] = {
- (char)0xfd, 0x7b, (char)0xbf, (char)0xa9, // STP x30, [sp, #-8]
- 0x00, 0x00, 0x00, (char)0x94 // BL
-};
-
const char *getEdgeKindName(Edge::Kind R) {
switch (R) {
case Pointer64:
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index 5615ad94006d3b..ebfbeb990180fd 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -29,7 +29,6 @@ add_llvm_component_library(LLVMOrcJIT
IRTransformLayer.cpp
IRPartitionLayer.cpp
JITTargetMachineBuilder.cpp
- JITLinkReentryTrampolines.cpp
LazyObjectLinkingLayer.cpp
LazyReexports.cpp
Layer.cpp
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index e48548a8a7e49f..3547eabdd0ae73 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -178,27 +178,6 @@ void UnexpectedSymbolDefinitions::log(raw_ostream &OS) const {
<< ": " << Symbols;
}
-void SymbolInstance::lookupAsync(LookupAsyncOnCompleteFn OnComplete) const {
- JD->getExecutionSession().lookup(
- LookupKind::Static, {{JD.get(), JITDylibLookupFlags::MatchAllSymbols}},
- SymbolLookupSet(Name), SymbolState::Ready,
- [OnComplete = std::move(OnComplete)
-#ifndef NDEBUG
- ,
- Name = this->Name // Captured for the assert below only.
-#endif // NDEBUG
- ](Expected<SymbolMap> Result) mutable {
- if (Result) {
- assert(Result->size() == 1 && "Unexpected number of results");
- assert(Result->count(Name) &&
- "Result does not contain expected symbol");
- OnComplete(Result->begin()->second);
- } else
- OnComplete(Result.takeError());
- },
- NoDependenciesToRegister);
-}
-
AsynchronousSymbolQuery::AsynchronousSymbolQuery(
const SymbolLookupSet &Symbols, SymbolState RequiredState,
SymbolsResolvedCallback NotifyComplete)
diff --git a/llvm/lib/ExecutionEngine/Orc/JITLinkReentryTrampolines.cpp b/llvm/lib/ExecutionEngine/Orc/JITLinkReentryTrampolines.cpp
deleted file mode 100644
index 90d2b857f1a4ae..00000000000000
--- a/llvm/lib/ExecutionEngine/Orc/JITLinkReentryTrampolines.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-//===----- JITLinkReentryTrampolines.cpp -- JITLink-based trampoline- -----===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h"
-
-#include "llvm/ExecutionEngine/JITLink/aarch64.h"
-#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
-
-#include <memory>
-
-#define DEBUG_TYPE "orc"
-
-using namespace llvm;
-using namespace llvm::jitlink;
-
-namespace {
-constexpr StringRef ReentryFnName = "__orc_rt_reentry";
-constexpr StringRef ReentrySectionName = "__orc_stubs";
-} // namespace
-
-namespace llvm::orc {
-
-class JITLinkReentryTrampolines::TrampolineAddrScraperPlugin
- : public ObjectLinkingLayer::Plugin {
-public:
- void modifyPassConfig(MaterializationResponsibility &MR,
- jitlink::LinkGraph &G,
- jitlink::PassConfiguration &Config) override {
- Config.PreFixupPasses.push_back(
- [this](LinkGraph &G) { return recordTrampolineAddrs(G); });
- }
-
- Error notifyFailed(MaterializationResponsibility &MR) override {
- return Error::success();
- }
-
- Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {
- return Error::success();
- }
-
- void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
- ResourceKey SrcKey) override {}
-
- void registerGraph(LinkGraph &G,
- std::shared_ptr<std::vector<ExecutorSymbolDef>> Addrs) {
- std::lock_guard<std::mutex> Lock(M);
- assert(!PendingAddrs.count(&G) && "Duplicate registration");
- PendingAddrs[&G] = std::move(Addrs);
- }
-
- Error recordTrampolineAddrs(LinkGraph &G) {
- std::shared_ptr<std::vector<ExecutorSymbolDef>> Addrs;
- {
- std::lock_guard<std::mutex> Lock(M);
- auto I = PendingAddrs.find(&G);
- if (I == PendingAddrs.end())
- return Error::success();
- Addrs = std::move(I->second);
- PendingAddrs.erase(I);
- }
-
- auto *Sec = G.findSectionByName(ReentrySectionName);
- assert(Sec && "Reentry graph missing reentry section");
- assert(!Sec->empty() && "Reentry graph is empty");
-
- for (auto *Sym : Sec->symbols())
- if (!Sym->hasName())
- Addrs->push_back({Sym->getAddress(), JITSymbolFlags()});
-
- return Error::success();
- }
-
-private:
- std::mutex M;
- DenseMap<LinkGraph *, std::shared_ptr<std::vector<ExecutorSymbolDef>>>
- PendingAddrs;
-};
-
-Expected<std::unique_ptr<JITLinkReentryTrampolines>>
-JITLinkReentryTrampolines::Create(ObjectLinkingLayer &ObjLinkingLayer) {
-
- EmitTrampolineFn EmitTrampoline;
-
- switch (ObjLinkingLayer.getExecutionSession().getTargetTriple().getArch()) {
- case Triple::aarch64:
- EmitTrampoline = aarch64::createAnonymousReentryTrampoline;
- break;
- default:
- return make_error<StringError>("Architecture not supported",
- inconvertibleErrorCode());
- }
-
- return std::make_unique<JITLinkReentryTrampolines>(ObjLinkingLayer,
- std::move(EmitTrampoline));
-}
-
-JITLinkReentryTrampolines::JITLinkReentryTrampolines(
- ObjectLinkingLayer &ObjLinkingLayer, EmitTrampolineFn EmitTrampoline)
- : ObjLinkingLayer(ObjLinkingLayer),
- EmitTrampoline(std::move(EmitTrampoline)) {
- auto TAS = std::make_shared<TrampolineAddrScraperPlugin>();
- TrampolineAddrScraper = TAS.get();
- ObjLinkingLayer.addPlugin(std::move(TAS));
-}
-
-void JITLinkReentryTrampolines::emit(ResourceTrackerSP RT,
- size_t NumTrampolines,
- OnTrampolinesReadyFn OnTrampolinesReady) {
-
- if (NumTrampolines == 0)
- return OnTrampolinesReady(std::vector<ExecutorSymbolDef>());
-
- JITDylibSP JD(&RT->getJITDylib());
- auto &ES = ObjLinkingLayer.getExecutionSession();
- Triple TT = ES.getTargetTriple();
-
- auto ReentryGraphSym =
- ES.intern(("__orc_reentry_graph_#" + Twine(++ReentryGraphIdx)).str());
-
- auto G = std::make_unique<jitlink::LinkGraph>(
- (*ReentryGraphSym).str(), ES.getSymbolStringPool(), TT,
- TT.isArch64Bit() ? 8 : 4,
- TT.isLittleEndian() ? endianness::little : endianness::big,
- jitlink::getGenericEdgeKindName);
-
- auto &ReentryFnSym = G->addExternalSymbol(ReentryFnName, 0, false);
-
- auto &ReentrySection =
- G->createSection(ReentrySectionName, MemProt::Exec | MemProt::Read);
-
- for (size_t I = 0; I != NumTrampolines; ++I)
- EmitTrampoline(*G, ReentrySection, ReentryFnSym).setLive(true);
-
- auto &FirstBlock = **ReentrySection.blocks().begin();
- G->addDefinedSymbol(FirstBlock, 0, *ReentryGraphSym, FirstBlock.getSize(),
- Linkage::Strong, Scope::SideEffectsOnly, true, true);
-
- auto TrampolineAddrs = std::make_shared<std::vector<ExecutorSymbolDef>>();
- TrampolineAddrScraper->registerGraph(*G, TrampolineAddrs);
-
- // Add Graph via object linking layer.
- if (auto Err = ObjLinkingLayer.add(std::move(RT), std::move(G)))
- return OnTrampolinesReady(std::move(Err));
-
- // Trigger graph emission.
- ES.lookup(
- LookupKind::Static, {{JD.get(), JITDylibLookupFlags::MatchAllSymbols}},
- SymbolLookupSet(ReentryGraphSym,
- SymbolLookupFlags::WeaklyReferencedSymbol),
- SymbolState::Ready,
- [OnTrampolinesReady = std::move(OnTrampolinesReady),
- TrampolineAddrs =
- std::move(TrampolineAddrs)](Expected<SymbolMap> Result) mutable {
- if (Result)
- OnTrampolinesReady(std::move(*TrampolineAddrs));
- else
- OnTrampolinesReady(Result.takeError());
- },
- NoDependenciesToRegister);
-}
-
-Expected<std::unique_ptr<LazyReexportsManager>>
-createJITLinkLazyReexportsManager(ObjectLinkingLayer &ObjLinkingLayer,
- RedirectableSymbolManager &RSMgr,
- JITDylib &PlatformJD) {
- auto JLT = JITLinkReentryTrampolines::Create(ObjLinkingLayer);
- if (!JLT)
- return JLT.takeError();
-
- return LazyReexportsManager::Create(
- [JLT = std::move(*JLT)](ResourceTrackerSP RT, size_t NumTrampolines,
- LazyReexportsManager::OnTrampolinesReadyFn
- OnTrampolinesReady) mutable {
- JLT->emit(std::move(RT), NumTrampolines, std::move(OnTrampolinesReady));
- },
- RSMgr, PlatformJD);
-}
-
-} // namespace llvm::orc
diff --git a/llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp
index 543337eb60f5d5..1eff9a1bdf08b0 100644
--- a/llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp
@@ -71,9 +71,10 @@ class LazyObjectLinkingLayer::RenamerPlugin
};
LazyObjectLinkingLayer::LazyObjectLinkingLayer(ObjectLinkingLayer &BaseLayer,
- LazyReexportsManager &LRMgr)
+ LazyCallThroughManager &LCTMgr,
+ RedirectableSymbolManager &RSMgr)
: ObjectLayer(BaseLayer.getExecutionSession()), BaseLayer(BaseLayer),
- LRMgr(LRMgr) {
+ LCTMgr(LCTMgr), RSMgr(RSMgr) {
BaseLayer.addPlugin(std::make_unique<RenamerPlugin>());
}
@@ -100,7 +101,8 @@ Error LazyObjectLinkingLayer::add(ResourceTrackerSP RT,
return Err;
auto &JD = RT->getJITDylib();
- return JD.define(lazyReexports(LRMgr, std::move(LazySymbols)), std::move(RT));
+ return JD.define(lazyReexports(LCTMgr, RSMgr, JD, std::move(LazySymbols)),
+ std::move(RT));
}
void LazyObjectLinkingLayer::emit(
diff --git a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp
index 7a7e5d13ce03fd..15c5f79fdbd3c6 100644
--- a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp
@@ -8,9 +8,7 @@
#include "llvm/ExecutionEngine/Orc/LazyReexports.h"
-#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
-#include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
#include "llvm/TargetParser/Triple.h"
#define DEBUG_TYPE "orc"
@@ -231,167 +229,5 @@ LazyReexportsMaterializationUnit::extractFlags(const SymbolAliasMap &Aliases) {
return MaterializationUnit::Interface(std::move(SymbolFlags), nullptr);
}
-class LazyReexportsManager::MU : public MaterializationUnit {
-public:
- MU(LazyReexportsManager &LRMgr, SymbolAliasMap Reexports)
- : MaterializationUnit(getInterface(Reexports)), LRMgr(LRMgr),
- Reexports(std::move(Reexports)) {}
-
-private:
- Interface getInterface(const SymbolAliasMap &Reexports) {
- SymbolFlagsMap SF;
- for (auto &[Alias, AI] : Reexports)
- SF[Alias] = AI.AliasFlags;
- return {std::move(SF), nullptr};
- }
-
- StringRef getName() const override { return "LazyReexportsManager::MU"; }
-
- void materialize(std::unique_ptr<MaterializationResponsibility> R) override {
- LRMgr.emitReentryTrampolines(std::move(R), std::move(Reexports));
- }
-
- void discard(const JITDylib &JD, const SymbolStringPtr &Name) override {
- Reexports.erase(Name);
- }
-
- LazyReexportsManager &LRMgr;
- SymbolAliasMap Reexports;
-};
-
-class LazyReexportsManager::Plugin : public ObjectLinkingLayer::Plugin {
-public:
- void modifyPassConfig(MaterializationResponsibility &MR,
- jitlink::LinkGraph &G,
- jitlink::PassConfiguration &Config) override {}
-
- Error notifyFailed(MaterializationResponsibility &MR) override {
- return Error::success();
- }
-
- Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {
- return Error::success();
- }
-
- void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
- ResourceKey SrcKey) override {}
-
-private:
- std::mutex M;
-};
-
-Expected<std::unique_ptr<LazyReexportsManager>>
-LazyReexportsManager::Create(EmitTrampolinesFn EmitTrampolines,
- RedirectableSymbolManager &RSMgr,
- JITDylib &PlatformJD) {
- Error Err = Error::success();
- std::unique_ptr<LazyReexportsManager> LRM(new LazyReexportsManager(
- std::move(EmitTrampolines), RSMgr, PlatformJD, Err));
- if (Err)
- return std::move(Err);
- return std::move(LRM);
-}
-
-LazyReexportsManager::LazyReexportsManager(EmitTrampolinesFn EmitTrampolines,
- RedirectableSymbolManager &RSMgr,
- JITDylib &PlatformJD, Error &Err)
- : EmitTrampolines(std::move(EmitTrampolines)), RSMgr(RSMgr) {
-
- using namespace shared;
-
- ErrorAsOutParameter _(&Err);
-
- auto &ES = PlatformJD.getExecutionSession();
- ExecutionSession::JITDispatchHandlerAssociationMap WFs;
-
- WFs[ES.intern("__orc_rt_resolve_tag")] =
- ES.wrapAsyncWithSPS<SPSExpected<SPSExecutorSymbolDef>(SPSExecutorAddr)>(
- this, &LazyReexportsManager::resolve);
-
- Err = ES.registerJITDispatchHandlers(PlatformJD, std::move(WFs));
-}
-
-std::unique_ptr<MaterializationUnit>
-LazyReexportsManager::createLazyReexports(SymbolAliasMap Reexports) {
- return std::make_unique<MU>(*this, std::move(Reexports));
-}
-
-void LazyReexportsManager::emitReentryTrampolines(
- std::unique_ptr<MaterializationResponsibility> MR,
- SymbolAliasMap Reexports) {
- size_t NumTrampolines = Reexports.size();
- auto RT = MR->getResourceTracker();
- EmitTrampolines(
- std::move(RT), NumTrampolines,
- [this, MR = std::move(MR), Reexports = std::move(Reexports)](
- Expected<std::vector<ExecutorSymbolDef>> ReentryPoints) mutable {
- emitRedirectableSymbols(std::move(MR), std::move(Reexports),
- std::move(ReentryPoints));
- });
-}
-
-void LazyReexportsManager::emitRedirectableSymbols(
- std::unique_ptr<MaterializationResponsibility> MR, SymbolAliasMap Reexports,
- Expected<std::vector<ExecutorSymbolDef>> ReentryPoints) {
-
- if (!ReentryPoints) {
- MR->getExecutionSession().reportError(ReentryPoints.takeError());
- MR->failMaterialization();
- return;
- }
-
- assert(Reexports.size() == ReentryPoints->size() &&
- "Number of reentry points doesn't match number of reexports");
-
- // Bind entry points to names.
- SymbolMap Redirs;
- {
- std::lock_guard<std::mutex> Lock(M);
- size_t I = 0;
- for (auto &[Name, AI] : Reexports) {
- const auto &ReentryPoint = (*ReentryPoints)[I++];
- Redirs[Name] = ReentryPoint;
- CallThroughs[ReentryPoint.getAddress()] = {Name, AI.Aliasee,
- &MR->getTargetJITDylib()};
- }
- }
-
- RSMgr.emitRedirectableSymbols(std::move(MR), std::move(Redirs));
-}
-
-void LazyReexportsManager::resolve(ResolveSendResultFn SendResult,
- ExecutorAddr ReentryStubAddr) {
-
- CallThroughInfo LandingInfo;
-
- {
- std::lock_guard<std::mutex> Lock(M);
-
- auto I = CallThroughs.find(ReentryStubAddr);
- if (I == CallThroughs.end())
- return SendResult(make_error<StringError>(
- "Reentry address " + formatv("{0:x}", ReentryStubAddr) +
- " not registered",
- inconvertibleErrorCode()));
- LandingInfo = I->second;
- }
-
- SymbolInstance LandingSym(LandingInfo.JD, std::move(LandingInfo.BodyName));
- LandingSym.lookupAsync([this, JD = std::move(LandingInfo.JD),
- ReentryName = std::move(LandingInfo.Name),
- SendResult = std::move(SendResult)](
- Expected<ExecutorSymbolDef> Result) mutable {
- if (Result) {
- // FIXME: Make RedirectionManager operations async, then use the async
- // APIs here.
- if (auto Err = RSMgr.redirect(*JD, ReentryName, *Result))
- SendResult(std::move(Err));
- else
- SendResult(std::move(Result));
- } else
- SendResult(std::move(Result));
- });
-}
-
} // End namespace orc.
} // End namespace llvm.
diff --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
index 3eee2fd0272939..f3fba51f2e7433 100644
--- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
@@ -409,7 +409,6 @@ SymbolAliasMap MachOPlatform::standardPlatformAliases(ExecutionSession &ES) {
SymbolAliasMap Aliases;
addAliases(ES, Aliases, requiredCXXAliases());
addAliases(ES, Aliases, standardRuntimeUtilityAliases());
- addAliases(ES, Aliases, standardLazyCompilationAliases());
return Aliases;
}
@@ -437,17 +436,6 @@ MachOPlatform::standardRuntimeUtilityAliases() {
StandardRuntimeUtilityAliases);
}
-ArrayRef<std::pair<const char *, const char *>>
-MachOPlatform::standardLazyCompilationAliases() {
- static const std::pair<const char *, const char *>
- StandardLazyCompilationAliases[] = {
- {"__orc_rt_reentry", "__orc_rt_sysv_reentry"},
- {"__orc_rt_resolve_tag", "___orc_rt_resolve_tag"}};
-
- return ArrayRef<std::pair<const char *, const char *>>(
- StandardLazyCompilationAliases);
-}
-
bool MachOPlatform::supportedTarget(const Triple &TT) {
switch (TT.getArch()) {
case Triple::aarch64:
diff --git a/compiler-rt/test/orc/TestCases/Generic/Inputs/foo-ret-42.ll b/llvm/test/ExecutionEngine/JITLink/Generic/Inputs/foo-ret-42.ll
similarity index 100%
rename from compiler-rt/test/orc/TestCases/Generic/Inputs/foo-ret-42.ll
rename to llvm/test/ExecutionEngine/JITLink/Generic/Inputs/foo-ret-42.ll
diff --git a/compiler-rt/test/orc/TestCases/Generic/Inputs/var-x-42.ll b/llvm/test/ExecutionEngine/JITLink/Generic/Inputs/var-x-42.ll
similarity index 100%
rename from compiler-rt/test/orc/TestCases/Generic/Inputs/var-x-42.ll
rename to llvm/test/ExecutionEngine/JITLink/Generic/Inputs/var-x-42.ll
diff --git a/compiler-rt/test/orc/TestCases/Generic/lazy-link.ll b/llvm/test/ExecutionEngine/JITLink/Generic/lazy-link.ll
similarity index 70%
rename from compiler-rt/test/orc/TestCases/Generic/lazy-link.ll
rename to llvm/test/ExecutionEngine/JITLink/Generic/lazy-link.ll
index e722b813c3fe06..72325e198721b6 100644
--- a/compiler-rt/test/orc/TestCases/Generic/lazy-link.ll
+++ b/llvm/test/ExecutionEngine/JITLink/Generic/lazy-link.ll
@@ -4,14 +4,13 @@
; referenced by main, should be linked (despite being passed with -lazy).
;
; RUN: rm -rf %t && mkdir -p %t
-; RUN: %clang -c -o %t/foo.o %S/Inputs/foo-ret-42.ll
-; RUN: %clang -c -o %t/x.o %S/Inputs/var-x-42.ll
-; RUN: %clang -c -o %t/main.o %s
-; RUN: %llvm_jitlink -noexec -show-linked-files %t/main.o -lazy %t/foo.o \
+; RUN: llc -filetype=obj -o %t/foo.o %S/Inputs/foo-ret-42.ll
+; RUN: llc -filetype=obj -o %t/x.o %S/Inputs/var-x-42.ll
+; RUN: llc -filetype=obj -o %t/main.o %s
+; RUN: llvm-jitlink -noexec -show-linked-files %t/main.o -lazy %t/foo.o \
; RUN: -lazy %t/x.o | FileCheck %s
;
-; UNSUPPORTED: system-windows
-; REQUIRES: target={{(arm|aarch)64.*}}
+; UNSUPPORTED: system-windows, target={{arm[^6][^4].*}}, target=powerpc64{{.*}}
;
; CHECK: Linking {{.*}}main.o
; CHECK-DAG: Linking <indirect stubs graph #1>
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 3c58b8934462a2..77c07cf5cdb45c 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -30,7 +30,6 @@
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
#include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
#include "llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h"
-#include "llvm/ExecutionEngine/Orc/JITLinkReentryTrampolines.h"
#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
#include "llvm/ExecutionEngine/Orc/LoadLinkableFile.h"
#include "llvm/ExecutionEngine/Orc/MachO.h"
@@ -950,18 +949,41 @@ class PhonyExternalsGenerator : public DefinitionGenerator {
}
};
+static void handleLazyCallFailure() {
+ dbgs() << "ERROR: failure to materialize lazy call-through target.\n";
+ exit(1);
+}
+
+static void *reenter(void *Ctx, void *TrampolineAddr) {
+ std::promise<void *> LandingAddressP;
+ auto LandingAddressF = LandingAddressP.get_future();
+
+ auto *EPCIU = static_cast<EPCIndirectionUtils *>(Ctx);
+ EPCIU->getLazyCallThroughManager().resolveTrampolineLandingAddress(
+ ExecutorAddr::fromPtr(TrampolineAddr), [&](ExecutorAddr LandingAddress) {
+ LandingAddressP.set_value(LandingAddress.toPtr<void *>());
+ });
+ return LandingAddressF.get();
+}
+
Expected<std::unique_ptr<Session::LazyLinkingSupport>>
-createLazyLinkingSupport(ObjectLinkingLayer &OLL, JITDylib &PlatformJD) {
+createLazyLinkingSupport(ObjectLinkingLayer &OLL) {
+ auto EPCIU = EPCIndirectionUtils::Create(OLL.getExecutionSession());
+ if (!EPCIU)
+ return EPCIU.takeError();
+ if (auto Err = (*EPCIU)
+ ->writeResolverBlock(ExecutorAddr::fromPtr(&reenter),
+ ExecutorAddr::fromPtr(EPCIU->get()))
+ .takeError())
+ return Err;
+ (*EPCIU)->createLazyCallThroughManager(
+ OLL.getExecutionSession(), ExecutorAddr::fromPtr(handleLazyCallFailure));
auto RSMgr = JITLinkRedirectableSymbolManager::Create(OLL);
if (!RSMgr)
return RSMgr.takeError();
- auto LRMgr = createJITLinkLazyReexportsManager(OLL, **RSMgr, PlatformJD);
- if (!LRMgr)
- return LRMgr.takeError();
-
- return std::make_unique<Session::LazyLinkingSupport>(std::move(*RSMgr),
- std::move(*LRMgr), OLL);
+ return std::make_unique<Session::LazyLinkingSupport>(std::move(*EPCIU),
+ std::move(*RSMgr), OLL);
}
Expected<std::unique_ptr<Session>> Session::Create(Triple TT,
@@ -998,8 +1020,7 @@ Expected<std::unique_ptr<Session>> Session::Create(Triple TT,
S->Features = std::move(Features);
if (lazyLinkingRequested()) {
- if (auto LazyLinking =
- createLazyLinkingSupport(S->ObjLayer, *S->PlatformJD))
+ if (auto LazyLinking = createLazyLinkingSupport(S->ObjLayer))
S->LazyLinking = std::move(*LazyLinking);
else
return LazyLinking.takeError();
@@ -1621,17 +1642,10 @@ static Error sanitizeArguments(const Triple &TT, const char *ArgV0) {
OutOfProcessExecutor = OOPExecutorPath.str().str();
}
- // If lazy linking is requested then check compatibility with other options.
- if (lazyLinkingRequested()) {
- if (OrcRuntime.empty())
- return make_error<StringError>("Lazy linking requries the ORC runtime",
- inconvertibleErrorCode());
-
- if (!TestHarnesses.empty())
- return make_error<StringError>(
- "Lazy linking cannot be used with -harness mode",
- inconvertibleErrorCode());
- }
+ if (lazyLinkingRequested() && !TestHarnesses.empty())
+ return make_error<StringError>(
+ "Lazy linking cannot be used with -harness mode",
+ inconvertibleErrorCode());
return Error::success();
}
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.h b/llvm/tools/llvm-jitlink/llvm-jitlink.h
index bfad5211c21766..bdf91ea7e3f18e 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.h
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.h
@@ -15,9 +15,9 @@
#include "llvm/ADT/StringSet.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/EPCIndirectionUtils.h"
#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
#include "llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h"
-#include "llvm/ExecutionEngine/Orc/LazyReexports.h"
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/RedirectionManager.h"
#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
@@ -33,14 +33,20 @@ namespace llvm {
struct Session {
struct LazyLinkingSupport {
- LazyLinkingSupport(std::unique_ptr<orc::RedirectableSymbolManager> RSMgr,
- std::unique_ptr<orc::LazyReexportsManager> LRMgr,
+ LazyLinkingSupport(std::unique_ptr<orc::EPCIndirectionUtils> EPCIU,
+ std::unique_ptr<orc::RedirectableSymbolManager> RSMgr,
orc::ObjectLinkingLayer &ObjLinkingLayer)
- : RSMgr(std::move(RSMgr)), LRMgr(std::move(LRMgr)),
- LazyObjLinkingLayer(ObjLinkingLayer, *this->LRMgr) {}
-
+ : EPCIU(std::move(EPCIU)), RSMgr(std::move(RSMgr)),
+ LazyObjLinkingLayer(ObjLinkingLayer,
+ this->EPCIU->getLazyCallThroughManager(),
+ *this->RSMgr) {}
+ ~LazyLinkingSupport() {
+ if (auto Err = EPCIU->cleanup())
+ LazyObjLinkingLayer.getExecutionSession().reportError(std::move(Err));
+ }
+
+ std::unique_ptr<orc::EPCIndirectionUtils> EPCIU;
std::unique_ptr<orc::RedirectableSymbolManager> RSMgr;
- std::unique_ptr<orc::LazyReexportsManager> LRMgr;
orc::LazyObjectLinkingLayer LazyObjLinkingLayer;
};
More information about the llvm-commits
mailing list