@@ -70,17 +70,23 @@ TEST(ModuleUtils, AppendToUsedList2) {
70
70
}
71
71
72
72
using AppendFnType = decltype (&appendToGlobalCtors);
73
- using ParamType = std::tuple<StringRef, AppendFnType>;
73
+ using TransformFnType = decltype (&transformGlobalCtors);
74
+ using ParamType = std::tuple<StringRef, AppendFnType, TransformFnType>;
74
75
class ModuleUtilsTest : public testing ::TestWithParam<ParamType> {
75
76
public:
76
77
StringRef arrayName () const { return std::get<0 >(GetParam ()); }
77
78
AppendFnType appendFn () const { return std::get<AppendFnType>(GetParam ()); }
79
+ TransformFnType transformFn () const {
80
+ return std::get<TransformFnType>(GetParam ());
81
+ }
78
82
};
79
83
80
84
INSTANTIATE_TEST_SUITE_P (
81
85
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}));
84
90
85
91
TEST_P (ModuleUtilsTest, AppendToMissingArray) {
86
92
LLVMContext C;
@@ -124,3 +130,39 @@ TEST_P(ModuleUtilsTest, AppendToArray) {
124
130
11 , nullptr );
125
131
EXPECT_EQ (3 , getListSize (*M, arrayName ()));
126
132
}
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