@@ -38,12 +38,25 @@ int linker_script_merget::add_linker_script_definitions()
38
38
const std::string &elf_file=*elf_binaries.begin ();
39
39
const std::string &goto_file=*goto_binaries.begin ();
40
40
41
- jsont data ;
41
+ temporary_filet linker_def_outfile ( " goto-cc-linker-info " , " .json " ) ;
42
42
std::list<irep_idt> linker_defined_symbols;
43
- int fail=get_linker_script_data (
44
- data, linker_defined_symbols, compiler.symbol_table , elf_file);
43
+ int fail=
44
+ get_linker_script_data (
45
+ linker_defined_symbols,
46
+ compiler.symbol_table ,
47
+ elf_file,
48
+ linker_def_outfile ());
49
+ // ignore linker script parsing failures until the code is tested more widely
50
+ if (fail!=0 )
51
+ return 0 ;
52
+
53
+ jsont data;
54
+ fail=parse_json (linker_def_outfile (), get_message_handler (), data);
45
55
if (fail!=0 )
56
+ {
57
+ error () << " Problem parsing linker script JSON data" << eom;
46
58
return fail;
59
+ }
47
60
48
61
fail=linker_data_is_malformed (data);
49
62
if (fail!=0 )
@@ -117,8 +130,9 @@ linker_script_merget::linker_script_merget(
117
130
replacement_predicates(
118
131
{
119
132
replacement_predicatet (" address of array's first member" ,
120
- [](const exprt expr){ return to_symbol_expr (expr.op0 ().op0 ()); },
121
- [](const exprt expr)
133
+ [](const exprt &expr) -> const symbol_exprt&
134
+ { return to_symbol_expr (expr.op0 ().op0 ()); },
135
+ [](const exprt &expr, const namespacet &ns)
122
136
{
123
137
return expr.id ()==ID_address_of &&
124
138
expr.type ().id ()==ID_pointer &&
@@ -133,25 +147,39 @@ linker_script_merget::linker_script_merget(
133
147
expr.op0 ().op1 ().type ().id ()==ID_signedbv;
134
148
}),
135
149
replacement_predicatet (" address of array" ,
136
- [](const exprt expr){ return to_symbol_expr (expr.op0 ()); },
137
- [](const exprt expr)
150
+ [](const exprt &expr) -> const symbol_exprt&
151
+ { return to_symbol_expr (expr.op0 ()); },
152
+ [](const exprt &expr, const namespacet &ns)
138
153
{
139
154
return expr.id ()==ID_address_of &&
140
155
expr.type ().id ()==ID_pointer &&
141
156
142
157
expr.op0 ().id ()==ID_symbol &&
143
158
expr.op0 ().type ().id ()==ID_array;
144
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
+ }),
145
171
replacement_predicatet (" array variable" ,
146
- [](const exprt expr){ return to_symbol_expr (expr); },
147
- [](const exprt expr)
172
+ [](const exprt &expr) -> const symbol_exprt&
173
+ { return to_symbol_expr (expr); },
174
+ [](const exprt &expr, const namespacet &ns)
148
175
{
149
176
return expr.id ()==ID_symbol &&
150
177
expr.type ().id ()==ID_array;
151
178
}),
152
179
replacement_predicatet (" pointer (does not need pointerizing)" ,
153
- [](const exprt expr){ return to_symbol_expr (expr); },
154
- [](const exprt expr)
180
+ [](const exprt &expr) -> const symbol_exprt&
181
+ { return to_symbol_expr (expr); },
182
+ [](const exprt &expr, const namespacet &ns)
155
183
{
156
184
return expr.id ()==ID_symbol &&
157
185
expr.type ().id ()==ID_pointer;
@@ -164,6 +192,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
164
192
symbol_tablet &symbol_table,
165
193
const linker_valuest &linker_values)
166
194
{
195
+ const namespacet ns (symbol_table);
196
+
167
197
int ret=0 ;
168
198
// First, pointerize the actual linker-defined symbols
169
199
for (const auto &pair : linker_values)
@@ -191,7 +221,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
191
221
int fail=pointerize_subexprs_of (
192
222
symbol_table.get_writeable_ref (pair.first ).value ,
193
223
to_pointerize,
194
- linker_values);
224
+ linker_values,
225
+ ns);
195
226
if (to_pointerize.empty () && fail==0 )
196
227
continue ;
197
228
ret=1 ;
@@ -216,7 +247,8 @@ int linker_script_merget::pointerize_linker_defined_symbols(
216
247
if (to_pointerize.empty ())
217
248
continue ;
218
249
debug () << " Pointerizing a program expression..." << eom;
219
- int fail=pointerize_subexprs_of (*insts, to_pointerize, linker_values);
250
+ int fail = pointerize_subexprs_of (
251
+ *insts, to_pointerize, linker_values, ns);
220
252
if (to_pointerize.empty () && fail==0 )
221
253
continue ;
222
254
ret=1 ;
@@ -259,15 +291,17 @@ int linker_script_merget::replace_expr(
259
291
int linker_script_merget::pointerize_subexprs_of (
260
292
exprt &expr,
261
293
std::list<symbol_exprt> &to_pointerize,
262
- const linker_valuest &linker_values)
294
+ const linker_valuest &linker_values,
295
+ const namespacet &ns)
263
296
{
264
297
int fail=0 , tmp=0 ;
265
298
for (auto const &pair : linker_values)
266
299
for (auto const &pattern : replacement_predicates)
267
300
{
268
- if (!pattern.match (expr))
301
+ if (!pattern.match (expr, ns ))
269
302
continue ;
270
- const symbol_exprt &inner_symbol=pattern.inner_symbol (expr);
303
+ // take a copy, expr will be changed below
304
+ const symbol_exprt inner_symbol=pattern.inner_symbol (expr);
271
305
if (pair.first !=inner_symbol.get_identifier ())
272
306
continue ;
273
307
tmp=replace_expr (expr, linker_values, inner_symbol, pair.first ,
@@ -292,7 +326,7 @@ int linker_script_merget::pointerize_subexprs_of(
292
326
293
327
for (auto &op : expr.operands ())
294
328
{
295
- tmp=pointerize_subexprs_of (op, to_pointerize, linker_values);
329
+ tmp=pointerize_subexprs_of (op, to_pointerize, linker_values, ns );
296
330
fail=tmp?tmp:fail;
297
331
}
298
332
return fail;
@@ -625,23 +659,24 @@ int linker_script_merget::ls_data2instructions(
625
659
#endif
626
660
627
661
int linker_script_merget::get_linker_script_data (
628
- jsont &linker_data,
629
662
std::list<irep_idt> &linker_defined_symbols,
630
663
const symbol_tablet &symbol_table,
631
- const std::string &out_file)
664
+ const std::string &out_file,
665
+ const std::string &def_out_file)
632
666
{
633
667
for (auto const &pair : symbol_table.symbols )
634
- if (pair.second .is_extern && pair.second .value .is_nil ()
635
- && pair.second .name !=" __CPROVER_memory" )
668
+ if (pair.second .is_extern && pair.second .value .is_nil () &&
669
+ pair.second .name !=" __CPROVER_memory" )
636
670
linker_defined_symbols.push_back (pair.second .name );
637
671
638
672
std::ostringstream linker_def_str;
639
- std::copy (linker_defined_symbols.begin (), linker_defined_symbols.end (),
640
- std::ostream_iterator<irep_idt>(linker_def_str, " \n " ));
673
+ std::copy (
674
+ linker_defined_symbols.begin (),
675
+ linker_defined_symbols.end (),
676
+ std::ostream_iterator<irep_idt>(linker_def_str, " \n " ));
641
677
debug () << " Linker-defined symbols: [" << linker_def_str.str () << " ]\n "
642
678
<< eom;
643
679
644
- temporary_filet linker_def_outfile (" goto-cc-linker-info" , " .json" );
645
680
temporary_filet linker_def_infile (" goto-cc-linker-defs" , " " );
646
681
std::ofstream linker_def_file (linker_def_infile ());
647
682
linker_def_file << linker_def_str.str ();
@@ -653,29 +688,24 @@ int linker_script_merget::get_linker_script_data(
653
688
" --script" , cmdline.get_value (' T' ),
654
689
" --object" , out_file,
655
690
" --sym-file" , linker_def_infile (),
656
- " --out-file" , linker_def_outfile ()
691
+ " --out-file" , def_out_file
657
692
};
658
- if (cmdline.isset (" verbosity" ))
659
- {
660
- unsigned verb=safe_string2unsigned (cmdline.get_value (" verbosity" ));
661
- if (verb>9 )
662
- argv.push_back (" --very-verbose" );
663
- else if (verb>4 )
664
- argv.push_back (" --verbose" );
665
- }
666
693
667
- int rc=run (argv[0 ], argv, linker_def_infile (), linker_def_outfile ());
694
+ if (get_message_handler ().get_verbosity ()>9 )
695
+ argv.push_back (" --very-verbose" );
696
+ else if (get_message_handler ().get_verbosity ()>4 )
697
+ argv.push_back (" --verbose" );
698
+
699
+ debug () << " RUN:" ;
700
+ for (std::size_t i=0 ; i<argv.size (); i++)
701
+ debug () << " " << argv[i];
702
+ debug () << eom;
703
+
704
+ int rc=run (argv[0 ], argv, linker_def_infile (), def_out_file);
668
705
if (rc!=0 )
669
- {
670
- error () << " Problem parsing linker script" << eom;
671
- return rc;
672
- }
706
+ warning () << " Problem parsing linker script" << eom;
673
707
674
- int fail=parse_json (linker_def_outfile (), get_message_handler (),
675
- linker_data);
676
- if (fail!=0 )
677
- error () << " Problem parsing linker script JSON data" << eom;
678
- return fail;
708
+ return rc;
679
709
}
680
710
681
711
int linker_script_merget::goto_and_object_mismatch (
0 commit comments