diff options
| author | Lang Hames <lhames@gmail.com> | 2021-08-18 10:47:21 +1000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2021-08-18 15:00:22 +1000 |
| commit | e256445bfff12013c3c4ad97da4aa69d25b175b5 (patch) | |
| tree | ce9b3654f569b9f6f2d50de4947c4dfcbc2427dc /llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp | |
| parent | 4ade3af13305931df6aef7bf8bedeaae284e2890 (diff) | |
| download | llvm-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.cpp | 13 |
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) |
