Skip to content

Commit 22110a0

Browse files
committed
Implement --show-symbol-table in JSON-UI mode
This provides a convenient format for filtering / selecting particular symbols.
1 parent 8149793 commit 22110a0

File tree

11 files changed

+181
-17
lines changed

11 files changed

+181
-17
lines changed

jbmc/src/janalyzer/janalyzer_parse_options.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ int janalyzer_parse_optionst::doit()
377377
// show it?
378378
if(cmdline.isset("show-symbol-table"))
379379
{
380-
::show_symbol_table(goto_model.symbol_table, get_ui());
380+
::show_symbol_table(goto_model.symbol_table, ui_message_handler);
381381
return CPROVER_EXIT_SUCCESS;
382382
}
383383

jbmc/src/jbmc/jbmc_parse_options.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ int jbmc_parse_optionst::get_goto_program(
649649
if(cmdline.isset("show-symbol-table"))
650650
{
651651
show_symbol_table(
652-
lazy_goto_model.symbol_table, ui_message_handler.get_ui());
652+
lazy_goto_model.symbol_table, ui_message_handler);
653653
return 0;
654654
}
655655

@@ -829,7 +829,7 @@ bool jbmc_parse_optionst::show_loaded_functions(
829829
if(cmdline.isset("show-symbol-table"))
830830
{
831831
show_symbol_table(
832-
goto_model.get_symbol_table(), ui_message_handler.get_ui());
832+
goto_model.get_symbol_table(), ui_message_handler);
833833
return true;
834834
}
835835

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
int main(int argc, char** argv) {
3+
int x = 5;
4+
++x;
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
test.c
3+
--list-symbols --json-ui
4+
"symbolTable": \{
5+
"main": \{
6+
"main::1::x": \{
7+
^EXIT=0$
8+
^SIGNAL=0$
9+
--
10+
^warning: ignoring
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
int main(int argc, char** argv) {
3+
int x = 5;
4+
++x;
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
test.c
3+
--show-symbol-table --json-ui
4+
"symbolTable": \{
5+
"main": \{
6+
"main::1::x": \{
7+
^EXIT=0$
8+
^SIGNAL=0$
9+
--
10+
^warning: ignoring

src/cbmc/cbmc_parse_options.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ int cbmc_parse_optionst::get_goto_program(
587587

588588
if(cmdline.isset("show-symbol-table"))
589589
{
590-
show_symbol_table(goto_model, ui_message_handler.get_ui());
590+
show_symbol_table(goto_model, ui_message_handler);
591591
return CPROVER_EXIT_SUCCESS;
592592
}
593593

src/goto-analyzer/goto_analyzer_parse_options.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ int goto_analyzer_parse_optionst::doit()
409409
// show it?
410410
if(cmdline.isset("show-symbol-table"))
411411
{
412-
::show_symbol_table(goto_model.symbol_table, get_ui());
412+
::show_symbol_table(goto_model.symbol_table, ui_message_handler);
413413
return CPROVER_EXIT_SUCCESS;
414414
}
415415

src/goto-instrument/goto_instrument_parse_options.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ int goto_instrument_parse_optionst::doit()
464464

465465
if(cmdline.isset("show-symbol-table"))
466466
{
467-
::show_symbol_table(goto_model, get_ui());
467+
::show_symbol_table(goto_model, ui_message_handler);
468468
return CPROVER_EXIT_SUCCESS;
469469
}
470470

@@ -519,7 +519,7 @@ int goto_instrument_parse_optionst::doit()
519519

520520
if(cmdline.isset("list-symbols"))
521521
{
522-
show_symbol_table_brief(goto_model, get_ui());
522+
show_symbol_table_brief(goto_model, ui_message_handler);
523523
return CPROVER_EXIT_SUCCESS;
524524
}
525525

src/goto-programs/show_symbol_table.cpp

Lines changed: 140 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ Author: Daniel Kroening, [email protected]
1818
#include <langapi/language.h>
1919
#include <langapi/mode.h>
2020

21+
#include <util/json_irep.h>
22+
2123
#include "goto_model.h"
2224

2325
void show_symbol_table_xml_ui()
@@ -153,11 +155,139 @@ void show_symbol_table_plain(
153155
}
154156
}
155157

158+
static void show_symbol_table_json_ui(
159+
const symbol_tablet &symbol_table,
160+
message_handlert &message_handler)
161+
{
162+
json_stream_arrayt &out = message_handler.get_json_stream();
163+
164+
json_stream_objectt &result_wrapper = out.push_back_stream_object();
165+
json_stream_objectt &result =
166+
result_wrapper.push_back_stream_object("symbolTable");
167+
168+
const namespacet ns(symbol_table);
169+
json_irept irep_converter(true);
170+
171+
for(const auto &id_and_symbol : symbol_table.symbols)
172+
{
173+
const symbolt &symbol = id_and_symbol.second;
174+
175+
std::unique_ptr<languaget> ptr;
176+
177+
if(symbol.mode=="")
178+
{
179+
ptr=get_default_language();
180+
}
181+
else
182+
{
183+
ptr=get_language_from_mode(symbol.mode);
184+
}
185+
186+
if(!ptr)
187+
throw "symbol "+id2string(symbol.name)+" has unknown mode";
188+
189+
std::string type_str, value_str;
190+
191+
if(symbol.type.is_not_nil())
192+
ptr->from_type(symbol.type, type_str, ns);
193+
194+
if(symbol.value.is_not_nil())
195+
ptr->from_expr(symbol.value, value_str, ns);
196+
197+
json_objectt symbol_json;
198+
symbol_json["pretty_name"] = json_stringt(symbol.pretty_name);
199+
symbol_json["base_name"] = json_stringt(symbol.base_name);
200+
symbol_json["mode"] = json_stringt(symbol.mode);
201+
symbol_json["module"] = json_stringt(symbol.module);
202+
203+
symbol_json["pretty_type"] = json_stringt(type_str);
204+
symbol_json["pretty_value"] = json_stringt(value_str);
205+
206+
symbol_json["type"] = irep_converter.convert_from_irep(symbol.type);
207+
symbol_json["value"] = irep_converter.convert_from_irep(symbol.value);
208+
symbol_json["location"] = irep_converter.convert_from_irep(symbol.location);
209+
210+
symbol_json["is_type"] = jsont::json_boolean(symbol.is_type);
211+
symbol_json["is_macro"] = jsont::json_boolean(symbol.is_macro);
212+
symbol_json["is_exported"] = jsont::json_boolean(symbol.is_exported);
213+
symbol_json["is_input"] = jsont::json_boolean(symbol.is_input);
214+
symbol_json["is_output"] = jsont::json_boolean(symbol.is_output);
215+
symbol_json["is_state_var"] = jsont::json_boolean(symbol.is_state_var);
216+
symbol_json["is_property"] = jsont::json_boolean(symbol.is_property);
217+
symbol_json["is_static_lifetime"] =
218+
jsont::json_boolean(symbol.is_static_lifetime);
219+
symbol_json["is_thread_local"] =
220+
jsont::json_boolean(symbol.is_thread_local);
221+
symbol_json["is_lvalue"] = jsont::json_boolean(symbol.is_lvalue);
222+
symbol_json["is_file_local"] = jsont::json_boolean(symbol.is_file_local);
223+
symbol_json["is_extern"] = jsont::json_boolean(symbol.is_extern);
224+
symbol_json["is_volatile"] = jsont::json_boolean(symbol.is_volatile);
225+
symbol_json["is_parameter"] = jsont::json_boolean(symbol.is_parameter);
226+
symbol_json["is_auxiliary"] = jsont::json_boolean(symbol.is_auxiliary);
227+
symbol_json["is_weak"] = jsont::json_boolean(symbol.is_weak);
228+
229+
result.push_back(id2string(symbol.name), symbol_json);
230+
}
231+
}
232+
233+
static void show_symbol_table_brief_json_ui(
234+
const symbol_tablet &symbol_table,
235+
message_handlert &message_handler)
236+
{
237+
json_stream_arrayt &out = message_handler.get_json_stream();
238+
239+
json_stream_objectt &result_wrapper = out.push_back_stream_object();
240+
json_stream_objectt &result =
241+
result_wrapper.push_back_stream_object("symbolTable");
242+
243+
const namespacet ns(symbol_table);
244+
json_irept irep_converter(true);
245+
246+
for(const auto &id_and_symbol : symbol_table.symbols)
247+
{
248+
const symbolt &symbol = id_and_symbol.second;
249+
250+
std::unique_ptr<languaget> ptr;
251+
252+
if(symbol.mode=="")
253+
{
254+
ptr=get_default_language();
255+
}
256+
else
257+
{
258+
ptr=get_language_from_mode(symbol.mode);
259+
}
260+
261+
if(!ptr)
262+
throw "symbol "+id2string(symbol.name)+" has unknown mode";
263+
264+
std::string type_str, value_str;
265+
266+
if(symbol.type.is_not_nil())
267+
ptr->from_type(symbol.type, type_str, ns);
268+
269+
if(symbol.value.is_not_nil())
270+
ptr->from_expr(symbol.value, value_str, ns);
271+
272+
json_objectt symbol_json;
273+
symbol_json["pretty_name"] = json_stringt(symbol.pretty_name);
274+
symbol_json["base_name"] = json_stringt(symbol.base_name);
275+
symbol_json["mode"] = json_stringt(symbol.mode);
276+
symbol_json["module"] = json_stringt(symbol.module);
277+
278+
symbol_json["pretty_type"] = json_stringt(type_str);
279+
280+
symbol_json["type"] = irep_converter.convert_from_irep(symbol.type);
281+
282+
result.push_back(id2string(symbol.name), symbol_json);
283+
}
284+
}
285+
156286
void show_symbol_table(
157287
const symbol_tablet &symbol_table,
158-
ui_message_handlert::uit ui)
288+
ui_message_handlert &ui)
159289
{
160-
switch(ui)
290+
switch(ui.get_ui())
161291
{
162292
case ui_message_handlert::uit::PLAIN:
163293
show_symbol_table_plain(symbol_table, std::cout);
@@ -167,23 +297,26 @@ void show_symbol_table(
167297
show_symbol_table_xml_ui();
168298
break;
169299

300+
case ui_message_handlert::uit::JSON_UI:
301+
show_symbol_table_json_ui(symbol_table, ui);
302+
170303
default:
171304
break;
172305
}
173306
}
174307

175308
void show_symbol_table(
176309
const goto_modelt &goto_model,
177-
ui_message_handlert::uit ui)
310+
ui_message_handlert &ui)
178311
{
179312
show_symbol_table(goto_model.symbol_table, ui);
180313
}
181314

182315
void show_symbol_table_brief(
183316
const symbol_tablet &symbol_table,
184-
ui_message_handlert::uit ui)
317+
ui_message_handlert &ui)
185318
{
186-
switch(ui)
319+
switch(ui.get_ui())
187320
{
188321
case ui_message_handlert::uit::PLAIN:
189322
show_symbol_table_brief_plain(symbol_table, std::cout);
@@ -194,13 +327,14 @@ void show_symbol_table_brief(
194327
break;
195328

196329
default:
330+
show_symbol_table_brief_json_ui(symbol_table, ui);
197331
break;
198332
}
199333
}
200334

201335
void show_symbol_table_brief(
202336
const goto_modelt &goto_model,
203-
ui_message_handlert::uit ui)
337+
ui_message_handlert &ui)
204338
{
205339
show_symbol_table_brief(goto_model.symbol_table, ui);
206340
}

src/goto-programs/show_symbol_table.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@ class goto_modelt;
1919

2020
void show_symbol_table(
2121
const symbol_tablet &,
22-
ui_message_handlert::uit ui);
22+
ui_message_handlert &ui);
2323

2424
void show_symbol_table_brief(
2525
const symbol_tablet &,
26-
ui_message_handlert::uit ui);
26+
ui_message_handlert &ui);
2727

2828
void show_symbol_table(
2929
const goto_modelt &,
30-
ui_message_handlert::uit ui);
30+
ui_message_handlert &ui);
3131

3232
void show_symbol_table_brief(
3333
const goto_modelt &,
34-
ui_message_handlert::uit ui);
34+
ui_message_handlert &ui);
3535

3636
#endif // CPROVER_GOTO_PROGRAMS_SHOW_SYMBOL_TABLE_H

0 commit comments

Comments
 (0)