[llvm] a0a9bf5 - [NFC][ModuleUtils] Test appendToGlobalCtors/appendToGlobalDtors (#101753)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 2 16:40:02 PDT 2024


Author: Vitaly Buka
Date: 2024-08-02T16:39:57-07:00
New Revision: a0a9bf5152507beacd2a72dda42d054391494c4a

URL: https://github.com/llvm/llvm-project/commit/a0a9bf5152507beacd2a72dda42d054391494c4a
DIFF: https://github.com/llvm/llvm-project/commit/a0a9bf5152507beacd2a72dda42d054391494c4a.diff

LOG: [NFC][ModuleUtils] Test appendToGlobalCtors/appendToGlobalDtors (#101753)

Added: 
    

Modified: 
    llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp b/llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp
index faca3bc03f120..0ed7be9620a6f 100644
--- a/llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp
+++ b/llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp
@@ -9,6 +9,7 @@
 #include "llvm/Transforms/Utils/ModuleUtils.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/Constants.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Support/SourceMgr.h"
@@ -16,7 +17,7 @@
 
 using namespace llvm;
 
-static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
+static std::unique_ptr<Module> parseIR(LLVMContext &C, StringRef IR) {
   SMDiagnostic Err;
   std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
   if (!Mod)
@@ -67,3 +68,59 @@ TEST(ModuleUtils, AppendToUsedList2) {
   appendToUsed(*M, Globals);
   EXPECT_EQ(1, getListSize(*M, "llvm.used"));
 }
+
+using AppendFnType = decltype(&appendToGlobalCtors);
+using ParamType = std::tuple<StringRef, AppendFnType>;
+class ModuleUtilsTest : public testing::TestWithParam<ParamType> {
+public:
+  StringRef arrayName() const { return std::get<0>(GetParam()); }
+  AppendFnType appendFn() const { return std::get<AppendFnType>(GetParam()); }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    ModuleUtilsTestCtors, ModuleUtilsTest,
+    ::testing::Values(ParamType{"llvm.global_ctors", &appendToGlobalCtors},
+                      ParamType{"llvm.global_dtors", &appendToGlobalDtors}));
+
+TEST_P(ModuleUtilsTest, AppendToMissingArray) {
+  LLVMContext C;
+
+  std::unique_ptr<Module> M = parseIR(C, "");
+
+  EXPECT_EQ(0, getListSize(*M, arrayName()));
+  Function *F = cast<Function>(
+      M->getOrInsertFunction("ctor", Type::getVoidTy(C)).getCallee());
+  appendFn()(*M, F, 11, F);
+  ASSERT_EQ(1, getListSize(*M, arrayName()));
+
+  ConstantArray *CA = dyn_cast<ConstantArray>(
+      M->getGlobalVariable(arrayName())->getInitializer());
+  ASSERT_NE(nullptr, CA);
+  ConstantStruct *CS = dyn_cast<ConstantStruct>(CA->getOperand(0));
+  ASSERT_NE(nullptr, CS);
+  ConstantInt *Pri = dyn_cast<ConstantInt>(CS->getOperand(0));
+  ASSERT_NE(nullptr, Pri);
+  EXPECT_EQ(11u, Pri->getLimitedValue());
+  EXPECT_EQ(F, dyn_cast<Function>(CS->getOperand(1)));
+  EXPECT_EQ(F, CS->getOperand(2));
+}
+
+TEST_P(ModuleUtilsTest, AppendToArray) {
+  LLVMContext C;
+
+  std::unique_ptr<Module> M =
+      parseIR(C, (R"(@)" + arrayName() +
+                  R"( = appending global [2 x { i32, ptr, ptr }] [
+            { i32, ptr, ptr } { i32 65535, ptr  null, ptr null },
+            { i32, ptr, ptr } { i32 0, ptr  null, ptr null }]
+      )")
+                     .str());
+
+  EXPECT_EQ(2, getListSize(*M, arrayName()));
+  appendFn()(
+      *M,
+      cast<Function>(
+          M->getOrInsertFunction("ctor", Type::getVoidTy(C)).getCallee()),
+      11, nullptr);
+  EXPECT_EQ(3, getListSize(*M, arrayName()));
+}


        


More information about the llvm-commits mailing list