[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