9
9
10
10
#include " analyze_symbol.h"
11
11
12
- #include < algorithm>
13
- #include < regex>
14
-
15
- #include < iostream>
16
-
17
- #include < goto-programs/goto_model.h>
18
- #include < goto-programs/read_goto_binary.h>
19
-
20
- #include < util/arith_tools.h>
21
12
#include < util/c_types.h>
22
13
#include < util/c_types_util.h>
23
14
#include < util/config.h>
24
- #include < util/cout_message.h>
25
- #include < util/expr.h>
26
15
#include < util/expr_initializer.h>
27
- #include < util/irep.h>
28
- #include < util/mp_arith.h>
29
- #include < util/std_code.h>
30
- #include < util/std_expr.h>
31
- #include < util/std_types.h>
32
16
#include < util/string_constant.h>
33
17
34
- symbol_analyzert::symbol_analyzert (
18
+ gdb_value_extractort::gdb_value_extractort (
35
19
const symbol_tablet &symbol_table,
36
- gdb_apit &gdb_api )
37
- : gdb_api(gdb_api ),
20
+ const char *binary )
21
+ : gdb_api(binary ),
38
22
symbol_table(symbol_table),
39
23
ns(symbol_table),
40
24
c_converter(ns, expr2c_configurationt::clean_configuration),
41
- allocate_objects(ID_C, source_locationt(), "" , this->symbol_table)
25
+ allocate_objects(ID_C, source_locationt(), irep_idt{} , this ->symbol_table)
42
26
{
43
27
}
44
28
45
- void symbol_analyzert ::analyze_symbols (const std::vector<std::string > &symbols)
29
+ void gdb_value_extractort ::analyze_symbols (const std::vector<irep_idt > &symbols)
46
30
{
47
31
// record addresses of given symbols
48
32
for (const auto &id : symbols)
49
33
{
50
- const symbol_exprt symbol_expr (id, typet () );
34
+ const symbol_exprt & symbol_expr = ns. lookup (id). symbol_expr ( );
51
35
const address_of_exprt aoe (symbol_expr);
52
36
53
37
const std::string c_expr = c_converter.convert (aoe);
54
38
const pointer_valuet &value = gdb_api.get_memory (c_expr);
55
- CHECK_RETURN (value.pointee .empty () || (value. pointee == id ));
39
+ CHECK_RETURN (value.pointee .empty () || (id == value. pointee ));
56
40
57
- values.insert (std::make_pair ( value.address , symbol_expr) );
41
+ values.insert ({ value.address , symbol_expr} );
58
42
}
59
43
60
44
for (const auto &id : symbols)
@@ -63,7 +47,7 @@ void symbol_analyzert::analyze_symbols(const std::vector<std::string> &symbols)
63
47
}
64
48
}
65
49
66
- void symbol_analyzert ::analyze_symbol (const std::string &symbol_name)
50
+ void gdb_value_extractort ::analyze_symbol (const irep_idt &symbol_name)
67
51
{
68
52
const symbolt &symbol = ns.lookup (symbol_name);
69
53
const symbol_exprt symbol_expr = symbol.symbol_expr ();
@@ -89,7 +73,7 @@ void symbol_analyzert::analyze_symbol(const std::string &symbol_name)
89
73
}
90
74
91
75
// / Get memory snapshot as C code
92
- std::string symbol_analyzert ::get_snapshot_as_c_code ()
76
+ std::string gdb_value_extractort ::get_snapshot_as_c_code ()
93
77
{
94
78
code_blockt generated_code;
95
79
@@ -104,7 +88,7 @@ std::string symbol_analyzert::get_snapshot_as_c_code()
104
88
}
105
89
106
90
// / Get memory snapshot as symbol table
107
- symbol_tablet symbol_analyzert ::get_snapshot_as_symbol_table ()
91
+ symbol_tablet gdb_value_extractort ::get_snapshot_as_symbol_table ()
108
92
{
109
93
symbol_tablet snapshot;
110
94
@@ -137,19 +121,19 @@ symbol_tablet symbol_analyzert::get_snapshot_as_symbol_table()
137
121
return snapshot;
138
122
}
139
123
140
- void symbol_analyzert ::add_assignment (const exprt &lhs, const exprt &value)
124
+ void gdb_value_extractort ::add_assignment (const exprt &lhs, const exprt &value)
141
125
{
142
126
assignments.push_back (std::make_pair (lhs, value));
143
127
}
144
128
145
- exprt symbol_analyzert ::get_char_pointer_value (
129
+ exprt gdb_value_extractort ::get_char_pointer_value (
146
130
const exprt &expr,
147
- const std::string &memory_location,
131
+ const memory_addresst &memory_location,
148
132
const source_locationt &location)
149
133
{
150
134
PRECONDITION (expr.type ().id () == ID_pointer);
151
- PRECONDITION (is_c_char (expr.type ().subtype ()));
152
- PRECONDITION (memory_location != " 0x0 " );
135
+ PRECONDITION (is_c_char_type (expr.type ().subtype ()));
136
+ PRECONDITION (!memory_location. is_null () );
153
137
154
138
auto it = values.find (memory_location);
155
139
@@ -158,12 +142,11 @@ exprt symbol_analyzert::get_char_pointer_value(
158
142
std::string c_expr = c_converter.convert (expr);
159
143
pointer_valuet value = gdb_api.get_memory (c_expr);
160
144
CHECK_RETURN (value.string );
161
- std::string string = *value.string ;
162
145
163
- string_constantt init (string);
146
+ string_constantt init (*value. string );
164
147
CHECK_RETURN (to_array_type (init.type ()).is_complete ());
165
148
166
- symbol_exprt dummy (pointer_typet (init.type (), config. ansi_c . pointer_width ));
149
+ symbol_exprt dummy (" tmp " , pointer_type (init.type ()));
167
150
code_blockt assignments;
168
151
169
152
const symbol_exprt new_symbol =
@@ -182,14 +165,14 @@ exprt symbol_analyzert::get_char_pointer_value(
182
165
}
183
166
}
184
167
185
- exprt symbol_analyzert ::get_non_char_pointer_value (
168
+ exprt gdb_value_extractort ::get_non_char_pointer_value (
186
169
const exprt &expr,
187
- const std::string memory_location,
170
+ const memory_addresst & memory_location,
188
171
const source_locationt &location)
189
172
{
190
173
PRECONDITION (expr.type ().id () == ID_pointer);
191
- PRECONDITION (!is_c_char (expr.type ().subtype ()));
192
- PRECONDITION (memory_location != " 0x0 " );
174
+ PRECONDITION (!is_c_char_type (expr.type ().subtype ()));
175
+ PRECONDITION (!memory_location. is_null () );
193
176
194
177
auto it = values.find (memory_location);
195
178
@@ -199,7 +182,7 @@ exprt symbol_analyzert::get_non_char_pointer_value(
199
182
200
183
const typet target_type = expr.type ().subtype ();
201
184
202
- symbol_exprt dummy (expr.type ());
185
+ symbol_exprt dummy (" tmp " , expr.type ());
203
186
code_blockt assignments;
204
187
205
188
const symbol_exprt new_symbol =
@@ -227,7 +210,7 @@ exprt symbol_analyzert::get_non_char_pointer_value(
227
210
}
228
211
}
229
212
230
- exprt symbol_analyzert ::get_pointer_value (
213
+ exprt gdb_value_extractort ::get_pointer_value (
231
214
const exprt &expr,
232
215
const exprt &zero_expr,
233
216
const source_locationt &location)
@@ -240,11 +223,11 @@ exprt symbol_analyzert::get_pointer_value(
240
223
std::string c_expr = c_converter.convert (expr);
241
224
const pointer_valuet value = gdb_api.get_memory (c_expr);
242
225
243
- const std::string memory_location = value.address ;
226
+ const auto memory_location = value.address ;
244
227
245
- if (memory_location != " 0x0 " )
228
+ if (!memory_location. is_null () )
246
229
{
247
- if (is_c_char (expr.type ().subtype ()))
230
+ if (is_c_char_type (expr.type ().subtype ()))
248
231
{
249
232
return get_char_pointer_value (expr, memory_location, location);
250
233
}
@@ -267,7 +250,7 @@ exprt symbol_analyzert::get_pointer_value(
267
250
return zero_expr;
268
251
}
269
252
270
- exprt symbol_analyzert ::get_array_value (
253
+ exprt gdb_value_extractort ::get_array_value (
271
254
const exprt &expr,
272
255
const exprt &array,
273
256
const source_locationt &location)
@@ -291,27 +274,23 @@ exprt symbol_analyzert::get_array_value(
291
274
return new_array;
292
275
}
293
276
294
- exprt symbol_analyzert ::get_expr_value (
277
+ exprt gdb_value_extractort ::get_expr_value (
295
278
const exprt &expr,
296
279
const exprt &zero_expr,
297
280
const source_locationt &location)
298
281
{
299
282
PRECONDITION (expr.type () == zero_expr.type ());
300
283
301
284
const typet &type = expr.type ();
285
+ PRECONDITION (type.id () != ID_struct);
302
286
303
- if (is_c_int_derivate (type))
287
+ if (is_c_integral_type (type))
304
288
{
305
289
INVARIANT (zero_expr.is_constant (), " zero initializer is a constant" );
306
290
307
- std::string c_expr = c_converter.convert (expr);
308
- const std::string value = gdb_api.get_value (c_expr);
309
-
310
- const mp_integer int_rep = string2integer (value);
311
-
312
- return from_integer (int_rep, type);
291
+ return from_integer (string2integer (get_gdb_value (expr)), expr.type ());
313
292
}
314
- else if (is_c_char (type))
293
+ else if (is_c_char_type (type))
315
294
{
316
295
INVARIANT (zero_expr.is_constant (), " zero initializer is a constant" );
317
296
@@ -321,19 +300,14 @@ exprt symbol_analyzert::get_expr_value(
321
300
{
322
301
INVARIANT (zero_expr.is_constant (), " zero initializer is a constant" );
323
302
324
- std::string c_expr = c_converter.convert (expr);
325
- const std::string value = gdb_api.get_value (c_expr);
326
-
327
- return from_c_boolean_value (value, type);
303
+ return from_c_boolean_value (id2boolean (get_gdb_value (expr)), type);
328
304
}
329
305
else if (type.id () == ID_c_enum)
330
306
{
331
307
INVARIANT (zero_expr.is_constant (), " zero initializer is a constant" );
332
308
333
- std::string c_expr = c_converter.convert (expr);
334
- const std::string value = gdb_api.get_value (c_expr);
335
-
336
- return convert_member_name_to_enum_value (value, to_c_enum_type (type));
309
+ return convert_member_name_to_enum_value (
310
+ get_gdb_value (expr), to_c_enum_type (type));
337
311
}
338
312
else if (type.id () == ID_struct_tag)
339
313
{
@@ -349,15 +323,10 @@ exprt symbol_analyzert::get_expr_value(
349
323
350
324
return get_pointer_value (expr, zero_expr, location);
351
325
}
352
- else
353
- {
354
- throw analysis_exceptiont (" unexpected expression:\n " + expr.pretty ());
355
- }
356
-
357
- return zero_expr;
326
+ UNIMPLEMENTED;
358
327
}
359
328
360
- exprt symbol_analyzert ::get_struct_value (
329
+ exprt gdb_value_extractort ::get_struct_value (
361
330
const exprt &expr,
362
331
const exprt &zero_expr,
363
332
const source_locationt &location)
@@ -370,13 +339,13 @@ exprt symbol_analyzert::get_struct_value(
370
339
exprt new_expr (zero_expr);
371
340
372
341
const struct_tag_typet &struct_tag_type = to_struct_tag_type (expr.type ());
373
- const struct_typet struct_type = ns.follow_tag (struct_tag_type);
342
+ const struct_typet & struct_type = ns.follow_tag (struct_tag_type);
374
343
375
344
for (size_t i = 0 ; i < new_expr.operands ().size (); ++i)
376
345
{
377
346
const struct_typet::componentt &component = struct_type.components ()[i];
378
347
379
- if (component.get_is_padding ())
348
+ if (component.get_is_padding () || component. type (). id () == ID_code )
380
349
{
381
350
continue ;
382
351
}
@@ -390,7 +359,7 @@ exprt symbol_analyzert::get_struct_value(
390
359
return new_expr;
391
360
}
392
361
393
- void symbol_analyzert ::process_outstanding_assignments ()
362
+ void gdb_value_extractort ::process_outstanding_assignments ()
394
363
{
395
364
for (const auto &pair : outstanding_assignments)
396
365
{
@@ -399,3 +368,7 @@ void symbol_analyzert::process_outstanding_assignments()
399
368
}
400
369
}
401
370
371
+ std::string gdb_value_extractort::get_gdb_value (const exprt &expr)
372
+ {
373
+ return gdb_api.get_value (c_converter.convert (expr));
374
+ }
0 commit comments