Skip to content

Commit 56f924c

Browse files
author
Daniel Kroening
authored
Merge pull request #1483 from diffblue/signature_initialize_goto_model
initialize_goto_model now returns a goto_model
2 parents 9e05177 + 98643d7 commit 56f924c

File tree

5 files changed

+133
-140
lines changed

5 files changed

+133
-140
lines changed

src/cbmc/cbmc_parse_options.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,7 @@ int cbmc_parse_optionst::get_goto_program(
611611

612612
try
613613
{
614-
if(initialize_goto_model(goto_model, cmdline, get_message_handler()))
615-
// Remove all binaries from the command line as they
616-
// are already compiled
617-
return 6;
614+
goto_model=initialize_goto_model(cmdline, get_message_handler());
618615

619616
if(cmdline.isset("show-symbol-table"))
620617
{

src/clobber/clobber_parse_options.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ int clobber_parse_optionst::doit()
124124

125125
try
126126
{
127-
if(initialize_goto_model(goto_model, cmdline, get_message_handler()))
128-
return 6;
127+
goto_model=initialize_goto_model(cmdline, get_message_handler());
129128

130129
label_properties(goto_model);
131130

src/goto-analyzer/goto_analyzer_parse_options.cpp

+21-2
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,27 @@ int goto_analyzer_parse_optionst::doit()
160160

161161
register_languages();
162162

163-
if(initialize_goto_model(goto_model, cmdline, get_message_handler()))
164-
return 6;
163+
try
164+
{
165+
goto_model=initialize_goto_model(cmdline, get_message_handler());
166+
}
167+
168+
catch(const char *e)
169+
{
170+
error() << e << eom;
171+
return true;
172+
}
173+
174+
catch(const std::string e)
175+
{
176+
error() << e << eom;
177+
return true;
178+
}
179+
180+
catch(int)
181+
{
182+
return true;
183+
}
165184

166185
if(process_goto_program(options))
167186
return 6;

src/goto-programs/initialize_goto_model.cpp

+109-130
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ Author: Daniel Kroening, [email protected]
2626
#include "goto_convert_functions.h"
2727
#include "read_goto_binary.h"
2828

29-
bool initialize_goto_model(
30-
goto_modelt &goto_model,
29+
goto_modelt initialize_goto_model(
3130
const cmdlinet &cmdline,
3231
message_handlert &message_handler)
3332
{
@@ -36,168 +35,148 @@ bool initialize_goto_model(
3635
if(files.empty())
3736
{
3837
msg.error() << "Please provide a program" << messaget::eom;
39-
return true;
38+
throw 0;
4039
}
4140

42-
try
41+
std::vector<std::string> binaries, sources;
42+
binaries.reserve(files.size());
43+
sources.reserve(files.size());
44+
45+
for(const auto &file : files)
4346
{
44-
std::vector<std::string> binaries, sources;
45-
binaries.reserve(files.size());
46-
sources.reserve(files.size());
47+
if(is_goto_binary(file))
48+
binaries.push_back(file);
49+
else
50+
sources.push_back(file);
51+
}
4752

48-
for(const auto &file : files)
49-
{
50-
if(is_goto_binary(file))
51-
binaries.push_back(file);
52-
else
53-
sources.push_back(file);
54-
}
53+
language_filest language_files;
54+
language_files.set_message_handler(message_handler);
5555

56-
language_filest language_files;
57-
language_files.set_message_handler(message_handler);
56+
goto_modelt goto_model;
5857

59-
if(!sources.empty())
58+
if(!sources.empty())
59+
{
60+
for(const auto &filename : sources)
6061
{
61-
for(const auto &filename : sources)
62+
#ifdef _MSC_VER
63+
std::ifstream infile(widen(filename));
64+
#else
65+
std::ifstream infile(filename);
66+
#endif
67+
68+
if(!infile)
6269
{
63-
#ifdef _MSC_VER
64-
std::ifstream infile(widen(filename));
65-
#else
66-
std::ifstream infile(filename);
67-
#endif
68-
69-
if(!infile)
70-
{
71-
msg.error() << "failed to open input file `" << filename
72-
<< '\'' << messaget::eom;
73-
return true;
74-
}
75-
76-
std::pair<language_filest::file_mapt::iterator, bool>
77-
result=language_files.file_map.insert(
78-
std::pair<std::string, language_filet>(filename, language_filet()));
79-
80-
language_filet &lf=result.first->second;
81-
82-
lf.filename=filename;
83-
lf.language=get_language_from_filename(filename);
84-
85-
if(lf.language==nullptr)
86-
{
87-
source_locationt location;
88-
location.set_file(filename);
89-
msg.error().source_location=location;
90-
msg.error() << "failed to figure out type of file" << messaget::eom;
91-
return true;
92-
}
93-
94-
languaget &language=*lf.language;
95-
language.set_message_handler(message_handler);
96-
language.get_language_options(cmdline);
97-
98-
msg.status() << "Parsing " << filename << messaget::eom;
99-
100-
if(language.parse(infile, filename))
101-
{
102-
msg.error() << "PARSING ERROR" << messaget::eom;
103-
return true;
104-
}
105-
106-
lf.get_modules();
70+
msg.error() << "failed to open input file `" << filename
71+
<< '\'' << messaget::eom;
72+
throw 0;
10773
}
10874

109-
msg.status() << "Converting" << messaget::eom;
75+
std::pair<language_filest::file_mapt::iterator, bool>
76+
result=language_files.file_map.insert(
77+
std::pair<std::string, language_filet>(filename, language_filet()));
11078

111-
if(language_files.typecheck(goto_model.symbol_table))
112-
{
113-
msg.error() << "CONVERSION ERROR" << messaget::eom;
114-
return true;
115-
}
116-
}
79+
language_filet &lf=result.first->second;
11780

118-
for(const auto &file : binaries)
119-
{
120-
msg.status() << "Reading GOTO program from file" << messaget::eom;
81+
lf.filename=filename;
82+
lf.language=get_language_from_filename(filename);
12183

122-
if(read_object_and_link(file, goto_model, message_handler))
123-
return true;
124-
}
84+
if(lf.language==nullptr)
85+
{
86+
source_locationt location;
87+
location.set_file(filename);
88+
msg.error().source_location=location;
89+
msg.error() << "failed to figure out type of file" << messaget::eom;
90+
throw 0;
91+
}
12592

126-
bool binaries_provided_start=
127-
goto_model.symbol_table.has_symbol(goto_functionst::entry_point());
93+
languaget &language=*lf.language;
94+
language.set_message_handler(message_handler);
95+
language.get_language_options(cmdline);
12896

129-
bool entry_point_generation_failed=false;
97+
msg.status() << "Parsing " << filename << messaget::eom;
13098

131-
if(binaries_provided_start && cmdline.isset("function"))
132-
{
133-
// Rebuild the entry-point, using the language annotation of the
134-
// existing __CPROVER_start function:
135-
rebuild_goto_start_functiont rebuild_existing_start(
136-
msg.get_message_handler(),
137-
cmdline,
138-
goto_model.symbol_table,
139-
goto_model.goto_functions);
140-
entry_point_generation_failed=rebuild_existing_start();
141-
}
142-
else if(!binaries_provided_start)
143-
{
144-
// Unsure of the rationale for only generating stubs when there are no
145-
// GOTO binaries in play; simply mirroring old code in language_uit here.
146-
if(binaries.empty())
99+
if(language.parse(infile, filename))
147100
{
148-
// Enable/disable stub generation for opaque methods
149-
bool stubs_enabled=cmdline.isset("generate-opaque-stubs");
150-
language_files.set_should_generate_opaque_method_stubs(stubs_enabled);
101+
msg.error() << "PARSING ERROR" << messaget::eom;
102+
throw 0;
151103
}
152104

153-
// Allow all language front-ends to try to provide the user-specified
154-
// (--function) entry-point, or some language-specific default:
155-
entry_point_generation_failed=
156-
language_files.generate_support_functions(goto_model.symbol_table);
105+
lf.get_modules();
157106
}
158107

159-
if(entry_point_generation_failed)
160-
{
161-
msg.error() << "SUPPORT FUNCTION GENERATION ERROR" << messaget::eom;
162-
return true;
163-
}
108+
msg.status() << "Converting" << messaget::eom;
164109

165-
if(language_files.final(goto_model.symbol_table))
110+
if(language_files.typecheck(goto_model.symbol_table))
166111
{
167-
msg.error() << "FINAL STAGE CONVERSION ERROR" << messaget::eom;
168-
return true;
112+
msg.error() << "CONVERSION ERROR" << messaget::eom;
113+
throw 0;
169114
}
115+
}
170116

171-
msg.status() << "Generating GOTO Program" << messaget::eom;
172-
173-
goto_convert(
174-
goto_model.symbol_table,
175-
goto_model.goto_functions,
176-
message_handler);
117+
for(const auto &file : binaries)
118+
{
119+
msg.status() << "Reading GOTO program from file" << messaget::eom;
177120

178-
// stupid hack
179-
config.set_object_bits_from_symbol_table(
180-
goto_model.symbol_table);
121+
if(read_object_and_link(file, goto_model, message_handler))
122+
throw 0;
181123
}
182-
catch(const char *e)
124+
125+
bool binaries_provided_start=
126+
goto_model.symbol_table.has_symbol(goto_functionst::entry_point());
127+
128+
bool entry_point_generation_failed=false;
129+
130+
if(binaries_provided_start && cmdline.isset("function"))
183131
{
184-
msg.error() << e << messaget::eom;
185-
return true;
132+
// Rebuild the entry-point, using the language annotation of the
133+
// existing __CPROVER_start function:
134+
rebuild_goto_start_functiont rebuild_existing_start(
135+
msg.get_message_handler(),
136+
cmdline,
137+
goto_model.symbol_table,
138+
goto_model.goto_functions);
139+
entry_point_generation_failed=rebuild_existing_start();
186140
}
187-
catch(const std::string e)
141+
else if(!binaries_provided_start)
188142
{
189-
msg.error() << e << messaget::eom;
190-
return true;
143+
// Unsure of the rationale for only generating stubs when there are no
144+
// GOTO binaries in play; simply mirroring old code in language_uit here.
145+
if(binaries.empty())
146+
{
147+
// Enable/disable stub generation for opaque methods
148+
bool stubs_enabled=cmdline.isset("generate-opaque-stubs");
149+
language_files.set_should_generate_opaque_method_stubs(stubs_enabled);
150+
}
151+
152+
// Allow all language front-ends to try to provide the user-specified
153+
// (--function) entry-point, or some language-specific default:
154+
entry_point_generation_failed=
155+
language_files.generate_support_functions(goto_model.symbol_table);
191156
}
192-
catch(int)
157+
158+
if(entry_point_generation_failed)
193159
{
194-
return true;
160+
msg.error() << "SUPPORT FUNCTION GENERATION ERROR" << messaget::eom;
161+
throw 0;
195162
}
196-
catch(std::bad_alloc)
163+
164+
if(language_files.final(goto_model.symbol_table))
197165
{
198-
msg.error() << "Out of memory" << messaget::eom;
199-
return true;
166+
msg.error() << "FINAL STAGE CONVERSION ERROR" << messaget::eom;
167+
throw 0;
200168
}
201169

202-
return false; // no error
170+
msg.status() << "Generating GOTO Program" << messaget::eom;
171+
172+
goto_convert(
173+
goto_model.symbol_table,
174+
goto_model.goto_functions,
175+
message_handler);
176+
177+
// stupid hack
178+
config.set_object_bits_from_symbol_table(
179+
goto_model.symbol_table);
180+
181+
return goto_model;
203182
}

src/goto-programs/initialize_goto_model.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ Author: Daniel Kroening, [email protected]
1717

1818
#include "goto_model.h"
1919

20-
bool initialize_goto_model(
21-
goto_modelt &goto_model,
20+
goto_modelt initialize_goto_model(
2221
const cmdlinet &cmdline,
2322
message_handlert &message_handler);
2423

0 commit comments

Comments
 (0)