@@ -132,7 +132,7 @@ linker_script_merget::linker_script_merget(
132
132
replacement_predicatet (" address of array's first member" ,
133
133
[](const exprt &expr) -> const symbol_exprt&
134
134
{ return to_symbol_expr (expr.op0 ().op0 ()); },
135
- [](const exprt expr)
135
+ [](const exprt & expr, const namespacet &ns )
136
136
{
137
137
return expr.id ()==ID_address_of &&
138
138
expr.type ().id ()==ID_pointer &&
@@ -149,26 +149,37 @@ linker_script_merget::linker_script_merget(
149
149
replacement_predicatet (" address of array" ,
150
150
[](const exprt &expr) -> const symbol_exprt&
151
151
{ return to_symbol_expr (expr.op0 ()); },
152
- [](const exprt expr)
152
+ [](const exprt & expr, const namespacet &ns )
153
153
{
154
154
return expr.id ()==ID_address_of &&
155
155
expr.type ().id ()==ID_pointer &&
156
156
157
157
expr.op0 ().id ()==ID_symbol &&
158
158
expr.op0 ().type ().id ()==ID_array;
159
159
}),
160
+ replacement_predicatet (" address of struct" ,
161
+ [](const exprt &expr) -> const symbol_exprt&
162
+ { return to_symbol_expr (expr.op0 ()); },
163
+ [](const exprt &expr, const namespacet &ns)
164
+ {
165
+ return expr.id ()==ID_address_of &&
166
+ expr.type ().id ()==ID_pointer &&
167
+
168
+ expr.op0 ().id ()==ID_symbol &&
169
+ ns.follow (expr.op0 ().type ()).id ()==ID_struct;
170
+ }),
160
171
replacement_predicatet (" array variable" ,
161
172
[](const exprt &expr) -> const symbol_exprt&
162
173
{ return to_symbol_expr (expr); },
163
- [](const exprt expr)
174
+ [](const exprt & expr, const namespacet &ns )
164
175
{
165
176
return expr.id ()==ID_symbol &&
166
177
expr.type ().id ()==ID_array;
167
178
}),
168
179
replacement_predicatet (" pointer (does not need pointerizing)" ,
169
180
[](const exprt &expr) -> const symbol_exprt&
170
181
{ return to_symbol_expr (expr); },
171
- [](const exprt expr)
182
+ [](const exprt & expr, const namespacet &ns )
172
183
{
173
184
return expr.id ()==ID_symbol &&
174
185
expr.type ().id ()==ID_pointer;
@@ -181,6 +192,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
181
192
symbol_tablet &symbol_table,
182
193
const linker_valuest &linker_values)
183
194
{
195
+ const namespacet ns (symbol_table);
196
+
184
197
int ret=0 ;
185
198
// First, pointerize the actual linker-defined symbols
186
199
for (const auto &pair : linker_values)
@@ -208,7 +221,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
208
221
int fail=pointerize_subexprs_of (
209
222
symbol_table.get_writeable_ref (pair.first ).value ,
210
223
to_pointerize,
211
- linker_values);
224
+ linker_values,
225
+ ns);
212
226
if (to_pointerize.empty () && fail==0 )
213
227
continue ;
214
228
ret=1 ;
@@ -233,7 +247,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
233
247
if (to_pointerize.empty ())
234
248
continue ;
235
249
debug () << " Pointerizing a program expression..." << eom;
236
- int fail=pointerize_subexprs_of (*insts, to_pointerize, linker_values);
250
+ int fail = pointerize_subexprs_of (
251
+ *insts, to_pointerize, linker_values, ns);
237
252
if (to_pointerize.empty () && fail==0 )
238
253
continue ;
239
254
ret=1 ;
@@ -276,13 +291,14 @@ int linker_script_merget::replace_expr(
276
291
int linker_script_merget::pointerize_subexprs_of (
277
292
exprt &expr,
278
293
std::list<symbol_exprt> &to_pointerize,
279
- const linker_valuest &linker_values)
294
+ const linker_valuest &linker_values,
295
+ const namespacet &ns)
280
296
{
281
297
int fail=0 , tmp=0 ;
282
298
for (auto const &pair : linker_values)
283
299
for (auto const &pattern : replacement_predicates)
284
300
{
285
- if (!pattern.match (expr))
301
+ if (!pattern.match (expr, ns ))
286
302
continue ;
287
303
// take a copy, expr will be changed below
288
304
const symbol_exprt inner_symbol=pattern.inner_symbol (expr);
@@ -310,7 +326,7 @@ int linker_script_merget::pointerize_subexprs_of(
310
326
311
327
for (auto &op : expr.operands ())
312
328
{
313
- tmp=pointerize_subexprs_of (op, to_pointerize, linker_values);
329
+ tmp=pointerize_subexprs_of (op, to_pointerize, linker_values, ns );
314
330
fail=tmp?tmp:fail;
315
331
}
316
332
return fail;
0 commit comments