26
26
#include " goto_convert_functions.h"
27
27
#include " read_goto_binary.h"
28
28
29
- bool initialize_goto_model (
30
- goto_modelt &goto_model,
29
+ goto_modelt initialize_goto_model (
31
30
const cmdlinet &cmdline,
32
31
message_handlert &message_handler)
33
32
{
@@ -36,168 +35,148 @@ bool initialize_goto_model(
36
35
if (files.empty ())
37
36
{
38
37
msg.error () << " Please provide a program" << messaget::eom;
39
- return true ;
38
+ throw 0 ;
40
39
}
41
40
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)
43
46
{
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
+ }
47
52
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);
55
55
56
- language_filest language_files;
57
- language_files.set_message_handler (message_handler);
56
+ goto_modelt goto_model;
58
57
59
- if (!sources.empty ())
58
+ if (!sources.empty ())
59
+ {
60
+ for (const auto &filename : sources)
60
61
{
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)
62
69
{
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 ;
107
73
}
108
74
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 ()));
110
78
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 ;
117
80
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);
121
83
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
+ }
125
92
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);
128
96
129
- bool entry_point_generation_failed= false ;
97
+ msg. status () << " Parsing " << filename << messaget::eom ;
130
98
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))
147
100
{
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 ;
151
103
}
152
104
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 ();
157
106
}
158
107
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;
164
109
165
- if (language_files.final (goto_model.symbol_table ))
110
+ if (language_files.typecheck (goto_model.symbol_table ))
166
111
{
167
- msg.error () << " FINAL STAGE CONVERSION ERROR" << messaget::eom;
168
- return true ;
112
+ msg.error () << " CONVERSION ERROR" << messaget::eom;
113
+ throw 0 ;
169
114
}
115
+ }
170
116
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;
177
120
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 ;
181
123
}
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" ))
183
131
{
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 ();
186
140
}
187
- catch ( const std::string e )
141
+ else if (!binaries_provided_start )
188
142
{
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 );
191
156
}
192
- catch (int )
157
+
158
+ if (entry_point_generation_failed)
193
159
{
194
- return true ;
160
+ msg.error () << " SUPPORT FUNCTION GENERATION ERROR" << messaget::eom;
161
+ throw 0 ;
195
162
}
196
- catch (std::bad_alloc)
163
+
164
+ if (language_files.final (goto_model.symbol_table ))
197
165
{
198
- msg.error () << " Out of memory " << messaget::eom;
199
- return true ;
166
+ msg.error () << " FINAL STAGE CONVERSION ERROR " << messaget::eom;
167
+ throw 0 ;
200
168
}
201
169
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;
203
182
}
0 commit comments