@@ -70,17 +70,23 @@ TEST(ModuleUtils, AppendToUsedList2) {
7070}
7171
7272using AppendFnType = decltype (&appendToGlobalCtors);
73- using ParamType = std::tuple<StringRef, AppendFnType>;
73+ using TransformFnType = decltype (&transformGlobalCtors);
74+ using ParamType = std::tuple<StringRef, AppendFnType, TransformFnType>;
7475class ModuleUtilsTest : public testing ::TestWithParam<ParamType> {
7576public:
7677 StringRef arrayName () const { return std::get<0 >(GetParam ()); }
7778 AppendFnType appendFn () const { return std::get<AppendFnType>(GetParam ()); }
79+ TransformFnType transformFn () const {
80+ return std::get<TransformFnType>(GetParam ());
81+ }
7882};
7983
8084INSTANTIATE_TEST_SUITE_P (
8185 ModuleUtilsTestCtors, ModuleUtilsTest,
82- ::testing::Values (ParamType{" llvm.global_ctors" , &appendToGlobalCtors},
83- ParamType{" llvm.global_dtors" , &appendToGlobalDtors}));
86+ ::testing::Values (ParamType{" llvm.global_ctors" , &appendToGlobalCtors,
87+ &transformGlobalCtors},
88+ ParamType{" llvm.global_dtors" , &appendToGlobalDtors,
89+ &transformGlobalDtors}));
8490
8591TEST_P (ModuleUtilsTest, AppendToMissingArray) {
8692 LLVMContext C;
@@ -124,3 +130,39 @@ TEST_P(ModuleUtilsTest, AppendToArray) {
124130 11 , nullptr );
125131 EXPECT_EQ (3 , getListSize (*M, arrayName ()));
126132}
133+
134+ TEST_P (ModuleUtilsTest, UpdateArray) {
135+ LLVMContext C;
136+
137+ std::unique_ptr<Module> M =
138+ parseIR (C, (R"( @)" + arrayName () +
139+ R"( = appending global [2 x { i32, ptr, ptr }] [
140+ { i32, ptr, ptr } { i32 65535, ptr null, ptr null },
141+ { i32, ptr, ptr } { i32 0, ptr null, ptr null }]
142+ )" )
143+ .str ());
144+
145+ EXPECT_EQ (2 , getListSize (*M, arrayName ()));
146+ transformFn ()(*M, [](Constant *C) -> Constant * {
147+ ConstantStruct *CS = dyn_cast<ConstantStruct>(C);
148+ if (!CS)
149+ return nullptr ;
150+ StructType *EltTy = cast<StructType>(C->getType ());
151+ Constant *CSVals[3 ] = {
152+ ConstantInt::getSigned (CS->getOperand (0 )->getType (), 12 ),
153+ CS->getOperand (1 ),
154+ CS->getOperand (2 ),
155+ };
156+ return ConstantStruct::get (EltTy,
157+ ArrayRef (CSVals, EltTy->getNumElements ()));
158+ });
159+ EXPECT_EQ (1 , getListSize (*M, arrayName ()));
160+ ConstantArray *CA = dyn_cast<ConstantArray>(
161+ M->getGlobalVariable (arrayName ())->getInitializer ());
162+ ASSERT_NE (nullptr , CA);
163+ ConstantStruct *CS = dyn_cast<ConstantStruct>(CA->getOperand (0 ));
164+ ASSERT_NE (nullptr , CS);
165+ ConstantInt *Pri = dyn_cast<ConstantInt>(CS->getOperand (0 ));
166+ ASSERT_NE (nullptr , Pri);
167+ EXPECT_EQ (12u , Pri->getLimitedValue ());
168+ }
0 commit comments