aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2021-08-18 10:47:21 +1000
committerLang Hames <lhames@gmail.com>2021-08-18 15:00:22 +1000
commite256445bfff12013c3c4ad97da4aa69d25b175b5 (patch)
treece9b3654f569b9f6f2d50de4947c4dfcbc2427dc /llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
parent4ade3af13305931df6aef7bf8bedeaae284e2890 (diff)
downloadllvm-e256445bfff12013c3c4ad97da4aa69d25b175b5.zip
llvm-e256445bfff12013c3c4ad97da4aa69d25b175b5.tar.gz
llvm-e256445bfff12013c3c4ad97da4aa69d25b175b5.tar.bz2
[ORC-RT][ORC] Introduce ELF/*nix Platform and runtime support.
This change adds support to ORCv2 and the Orc runtime library for static initializers, C++ static destructors, and exception handler registration for ELF-based platforms, at present Linux and FreeBSD on x86_64. It is based on the MachO platform and runtime support introduced in bb5f97e3ad1. Patch by Peter Housel. Thanks very much Peter! Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D108081
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index fd26008..3c22c93 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -64,9 +64,9 @@ private:
LGI.SymbolFlags[ES.intern(Sym->getName())] = Flags;
}
- if (G.getTargetTriple().isOSBinFormatMachO())
- if (hasMachOInitSection(G))
- LGI.InitSymbol = makeInitSymbol(ES, G);
+ if ((G.getTargetTriple().isOSBinFormatMachO() && hasMachOInitSection(G)) ||
+ (G.getTargetTriple().isOSBinFormatELF() && hasELFInitSection(G)))
+ LGI.InitSymbol = makeInitSymbol(ES, G);
return LGI;
}
@@ -82,6 +82,13 @@ private:
return false;
}
+ static bool hasELFInitSection(LinkGraph &G) {
+ for (auto &Sec : G.sections())
+ if (Sec.getName() == ".init_array")
+ return true;
+ return false;
+ }
+
static SymbolStringPtr makeInitSymbol(ExecutionSession &ES, LinkGraph &G) {
std::string InitSymString;
raw_string_ostream(InitSymString)