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}
0 commit comments