[llvm] 988ab00 - [ORC] Extract hasInitializerSection for testing (NFC)
Keith Smiley via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 12 10:25:53 PST 2022
Author: Keith Smiley
Date: 2022-12-12T10:21:12-08:00
New Revision: 988ab0048daf893a50019ce4056297fbaf130956
URL: https://github.com/llvm/llvm-project/commit/988ab0048daf893a50019ce4056297fbaf130956
DIFF: https://github.com/llvm/llvm-project/commit/988ab0048daf893a50019ce4056297fbaf130956.diff
LOG: [ORC] Extract hasInitializerSection for testing (NFC)
Based on the discussion in https://reviews.llvm.org/D130221 and https://reviews.llvm.org/D139223
Differential Revision: https://reviews.llvm.org/D139347
Added:
Modified:
llvm/include/llvm/ExecutionEngine/Orc/ObjectFileInterface.h
llvm/lib/ExecutionEngine/Orc/ObjectFileInterface.cpp
llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt
llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ObjectFileInterface.h b/llvm/include/llvm/ExecutionEngine/Orc/ObjectFileInterface.h
index 1bf09069163e7..7d8a3ebbe01bd 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ObjectFileInterface.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ObjectFileInterface.h
@@ -32,6 +32,8 @@ void addInitSymbol(MaterializationUnit::Interface &I, ExecutionSession &ES,
Expected<MaterializationUnit::Interface>
getObjectFileInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer);
+bool hasInitializerSection(jitlink::LinkGraph &G);
+
} // End namespace orc
} // End namespace llvm
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectFileInterface.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectFileInterface.cpp
index 33c5d046696af..0c3beba43a35d 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectFileInterface.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectFileInterface.cpp
@@ -287,5 +287,22 @@ getObjectFileInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
return getGenericObjectFileSymbolInfo(ES, **Obj);
}
+bool hasInitializerSection(jitlink::LinkGraph &G) {
+ bool IsMachO = G.getTargetTriple().isOSBinFormatMachO();
+ bool IsElf = G.getTargetTriple().isOSBinFormatELF();
+ if (!IsMachO && !IsElf)
+ return false;
+
+ for (auto &Sec : G.sections()) {
+ if (IsMachO && std::apply(MachOPlatform::isInitializerSection,
+ Sec.getName().split(",")))
+ return true;
+ if (IsElf && ELFNixPlatform::isInitializerSection(Sec.getName()))
+ return true;
+ }
+
+ return false;
+}
+
} // End namespace orc.
} // End namespace llvm.
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index 255aff3c87cab..1a4a451eebf9b 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -9,6 +9,7 @@
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
+#include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
#include "llvm/Support/MemoryBuffer.h"
#include <string>
#include <vector>
@@ -57,35 +58,12 @@ class LinkGraphMaterializationUnit : public MaterializationUnit {
LGI.SymbolFlags[ES.intern(Sym->getName())] = Flags;
}
- if ((G.getTargetTriple().isOSBinFormatMachO() && hasMachOInitSection(G)) ||
- (G.getTargetTriple().isOSBinFormatELF() && hasELFInitSection(G)))
+ if (hasInitializerSection(G))
LGI.InitSymbol = makeInitSymbol(ES, G);
return LGI;
}
- static bool hasMachOInitSection(LinkGraph &G) {
- for (auto &Sec : G.sections())
- if (Sec.getName() == "__DATA,__objc_selrefs" ||
- Sec.getName() == "__DATA,__objc_classlist" ||
- Sec.getName() == "__TEXT,__swift5_protos" ||
- Sec.getName() == "__TEXT,__swift5_proto" ||
- Sec.getName() == "__TEXT,__swift5_types" ||
- Sec.getName() == "__DATA,__mod_init_func")
- return true;
- return false;
- }
-
- static bool hasELFInitSection(LinkGraph &G) {
- for (auto &Sec : G.sections()) {
- auto SecName = Sec.getName();
- if (SecName.consume_front(".init_array") &&
- (SecName.empty() || SecName[0] == '.'))
- return true;
- }
- return false;
- }
-
static SymbolStringPtr makeInitSymbol(ExecutionSession &ES, LinkGraph &G) {
std::string InitSymString;
raw_string_ostream(InitSymString)
diff --git a/llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt b/llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt
index 8162cbf39ff34..d73cf04325584 100644
--- a/llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt
+++ b/llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt
@@ -2,6 +2,7 @@ set(LLVM_LINK_COMPONENTS
${LLVM_TARGETS_TO_BUILD}
JITLink
Object
+ OrcJIT
OrcShared
OrcTargetProcess
RuntimeDyld
diff --git a/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp b/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp
index 1eec27f229d04..b7a1857b2d8ac 100644
--- a/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp
+++ b/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp
@@ -8,6 +8,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
+#include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Memory.h"
@@ -710,3 +711,48 @@ TEST(LinkGraphTest, SplitBlock) {
EXPECT_EQ(E2->getOffset(), 4U);
}
}
+
+struct InitSymbolsTestParams {
+ InitSymbolsTestParams(StringRef Triple, StringRef Section,
+ bool ExpectedHasInitializerSection)
+ : Triple(Triple), Section(Section),
+ ExpectedHasInitializerSection(ExpectedHasInitializerSection) {}
+
+ StringRef Triple;
+ StringRef Section;
+ bool ExpectedHasInitializerSection;
+};
+
+class InitSymbolsTestFixture
+ : public ::testing::TestWithParam<InitSymbolsTestParams> {};
+
+TEST_P(InitSymbolsTestFixture, InitSymbolSections) {
+ InitSymbolsTestParams Params = GetParam();
+ auto Graph = std::make_unique<LinkGraph>(
+ "foo", Triple(Params.Triple), 8, support::little, getGenericEdgeKindName);
+ Graph->createSection(Params.Section,
+ orc::MemProt::Read | orc::MemProt::Write);
+ EXPECT_EQ(orc::hasInitializerSection(*Graph),
+ Params.ExpectedHasInitializerSection);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ InitSymbolsTests, InitSymbolsTestFixture,
+ ::testing::Values(
+ InitSymbolsTestParams("x86_64-apple-darwin", "__DATA,__objc_selrefs",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__DATA,__mod_init_func",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__DATA,__objc_classlist",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__TEXT,__swift5_proto",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__TEXT,__swift5_protos",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__TEXT,__swift5_types",
+ true),
+ InitSymbolsTestParams("x86_64-apple-darwin", "__DATA,__not_an_init_sec",
+ false),
+ InitSymbolsTestParams("x86_64-unknown-linux", ".init_array", true),
+ InitSymbolsTestParams("x86_64-unknown-linux", ".init_array.0", true),
+ InitSymbolsTestParams("x86_64-unknown-linux", ".text", false)));
More information about the llvm-commits
mailing list