diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h @@ -51,7 +51,15 @@ // ELF section names. extern StringRef ELFEHFrameSectionName; + extern StringRef ELFInitArrayFuncSectionName; +extern StringRef ELFInitFuncSectionName; +extern StringRef ELFFiniArrayFuncSectionName; +extern StringRef ELFFiniFuncSectionName; +extern StringRef ELFCtorArrayFuncSectionName; +extern StringRef ELFDtorArrayFuncSectionName; + +extern StringRef ELFInitSectionNames[3]; extern StringRef ELFThreadBSSSectionName; extern StringRef ELFThreadDataSectionName; diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/ObjectFormats.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/ObjectFormats.cpp --- a/llvm/lib/ExecutionEngine/Orc/Shared/ObjectFormats.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Shared/ObjectFormats.cpp @@ -56,7 +56,19 @@ }; StringRef ELFEHFrameSectionName = ".eh_frame"; + StringRef ELFInitArrayFuncSectionName = ".init_array"; +StringRef ELFInitFuncSectionName = ".init"; +StringRef ELFFiniArrayFuncSectionName = ".fini_array"; +StringRef ELFFiniFuncSectionName = ".fini"; +StringRef ELFCtorArrayFuncSectionName = ".ctors"; +StringRef ELFDtorArrayFuncSectionName = ".dtors"; + +StringRef ELFInitSectionNames[3]{ + ELFInitArrayFuncSectionName, + ELFInitFuncSectionName, + ELFCtorArrayFuncSectionName, +}; StringRef ELFThreadBSSSectionName = ".tbss"; StringRef ELFThreadDataSectionName = ".tdata"; @@ -80,9 +92,11 @@ } bool isELFInitializerSection(StringRef SecName) { - if (SecName.consume_front(ELFInitArrayFuncSectionName) && - (SecName.empty() || SecName[0] == '.')) - return true; + for (StringRef InitSection : ELFInitSectionNames) { + StringRef Name = SecName; + if (Name.consume_front(InitSection) && (Name.empty() || Name[0] == '.')) + return true; + } return false; } diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectFormatsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectFormatsTest.cpp --- a/llvm/unittests/ExecutionEngine/Orc/ObjectFormatsTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/ObjectFormatsTest.cpp @@ -28,6 +28,7 @@ EXPECT_TRUE(isELFInitializerSection(".init_array")); EXPECT_TRUE(isELFInitializerSection(".init_array.0")); EXPECT_FALSE(isELFInitializerSection(".text")); + EXPECT_TRUE(isELFInitializerSection(".ctors.0")); } } // end anonymous namespace