Skip to content

Commit bfd1f5c

Browse files
authored
Merge pull request #4915 from MatWise/feature/stl-main-entry-point
STL frontend: "Main" entry point
2 parents 2345adc + dee1071 commit bfd1f5c

File tree

2 files changed

+54
-28
lines changed

2 files changed

+54
-28
lines changed

src/statement-list/statement_list_entry_point.cpp

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,48 @@ Author: Matthias Weiss, [email protected]
3030
/// Name of the CPROVER-specific hide label.
3131
#define CPROVER_HIDE CPROVER_PREFIX "HIDE"
3232

33+
/// Searches for symbols with the given name (which is considered to be the
34+
/// name of the main symbol) and returns false if there is exactly one symbol
35+
/// with that name in the given symbol table. Prints an error message and
36+
/// returns true if there are multiple or no matches.
37+
/// \param symbol_table: Symbol table to search through.
38+
/// \param message_handler: Used for printing error messages.
39+
/// \param main_symbol_name: Name of the symbol to look for.
40+
/// \return False if there is exactly one match, true otherwise.
41+
static bool is_main_symbol_invalid(
42+
const symbol_tablet &symbol_table,
43+
message_handlert &message_handler,
44+
const irep_idt &main_symbol_name)
45+
{
46+
bool found = false;
47+
48+
for(const std::pair<const irep_idt, symbolt> &pair : symbol_table)
49+
{
50+
if(pair.first == main_symbol_name && pair.second.type.id() == ID_code)
51+
{
52+
if(found)
53+
{
54+
messaget message(message_handler);
55+
message.error() << "main symbol `" << main_symbol_name
56+
<< "' is ambiguous" << messaget::eom;
57+
return true;
58+
}
59+
else
60+
found = true;
61+
}
62+
}
63+
64+
if(found)
65+
return false;
66+
else
67+
{
68+
messaget message(message_handler);
69+
message.error() << "main symbol `" << main_symbol_name << "' not found"
70+
<< messaget::eom;
71+
return true;
72+
}
73+
}
74+
3375
/// Creates a call to __CPROVER_initialize and adds it to the start function's
3476
/// body.
3577
/// \param [out] function_body: Body of the start function.
@@ -162,40 +204,23 @@ bool statement_list_entry_point(
162204

163205
irep_idt main_symbol_name;
164206

165-
// Find main symbol, if any is given.
207+
// Find main symbol given by the user.
166208
if(config.main.has_value())
167209
{
168-
std::list<irep_idt> matches;
169-
170-
for(const std::pair<const irep_idt, symbolt> &pair : symbol_table)
171-
if(pair.first == config.main.value() && pair.second.type.id() == ID_code)
172-
matches.push_back(pair.first);
173-
174-
if(matches.empty())
175-
{
176-
messaget message(message_handler);
177-
message.error() << "main symbol `" << config.main.value() << "' not found"
178-
<< messaget::eom;
179-
return true;
180-
}
181-
182-
if(matches.size() > 1)
183-
{
184-
messaget message(message_handler);
185-
message.error() << "main symbol `" << config.main.value()
186-
<< "' is ambiguous" << messaget::eom;
210+
if(is_main_symbol_invalid(
211+
symbol_table, message_handler, config.main.value()))
187212
return true;
188-
}
189-
190-
main_symbol_name = matches.front();
213+
main_symbol_name = config.main.value();
191214
}
215+
// Fallback: Search for block with TIA main standard name.
216+
// TODO: Support the standard entry point of STL (organisation blocks).
217+
// This also requires to expand the grammar and typecheck.
192218
else
193219
{
194-
// TODO: Support the standard entry point of STL (organisation blocks).
195-
// This also requires to expand the grammar and typecheck.
196-
// For now, return false to let the typecheck itself pass (vital for
197-
// --show-symbol-table). The missing entry symbol will be caught later.
198-
return false;
220+
if(is_main_symbol_invalid(
221+
symbol_table, message_handler, ID_statement_list_main_function))
222+
return true;
223+
main_symbol_name = ID_statement_list_main_function;
199224
}
200225

201226
const symbolt &main = symbol_table.lookup_ref(main_symbol_name);

src/util/irep_ids.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,7 @@ IREP_ID_ONE(__sync_xor_and_fetch)
765765
IREP_ID_ONE(statement_list_type)
766766
IREP_ID_ONE(statement_list_function)
767767
IREP_ID_ONE(statement_list_function_block)
768+
IREP_ID_TWO(statement_list_main_function, "Main")
768769
IREP_ID_ONE(statement_list_data_block)
769770
IREP_ID_ONE(statement_list_version)
770771
IREP_ID_ONE(statement_list_var_input)

0 commit comments

Comments
 (0)