14 #include <unordered_set>
28 for(
auto &identifier :
function.parameter_identifiers)
30 auto entry = rename_symbol.
expr_map.find(identifier);
31 if(entry != rename_symbol.
expr_map.end())
32 identifier = entry->second;
35 for(
auto &instruction :
function.body.instructions)
37 rename_symbol(instruction.code_nonconst());
39 if(instruction.has_condition())
40 rename_symbol(instruction.condition_nonconst());
52 const std::unordered_set<irep_idt> &weak_symbols)
61 rename_symbolt::expr_mapt::const_iterator e_it =
62 rename_symbol.
expr_map.find(gf_entry.first);
66 if(e_it!=rename_symbol.
expr_map.end())
67 final_id=e_it->second;
70 goto_functionst::function_mapt::iterator dest_f_it=
77 dest_functions.
function_map.emplace(final_id, std::move(src_func));
83 if(in_dest_symbol_table.body.instructions.empty() ||
84 weak_symbols.find(final_id)!=weak_symbols.end())
89 in_dest_symbol_table.body.swap(src_func.body);
90 in_dest_symbol_table.parameter_identifiers.swap(
91 src_func.parameter_identifiers);
94 src_func.body.instructions.empty() ||
95 src_ns.
lookup(gf_entry.first).is_weak)
114 std::unordered_set<irep_idt> weak_symbols;
118 if(symbol_pair.second.is_weak)
119 weak_symbols.insert(symbol_pair.first);
144 return linking.object_type_updates.get_expr_map();
153 type_updates.begin(), type_updates.end());
161 for(
const auto &symbol_pair : dest_symbol_table.
symbols)
163 if(symbol_pair.second.is_macro && !symbol_pair.second.is_type)
165 const symbolt &symbol = symbol_pair.second;
171 if(!base_type_eq(symbol.
type, ns.lookup(
id).type, ns))
173 std::cerr << symbol <<
'\n';
174 std::cerr << ns.lookup(
id) <<
'\n';
184 if(!macro_application.
expr_map.empty())
193 if(!object_type_updates.
empty())
197 for(
auto &instruction : gf_entry.second.body.instructions)
199 instruction.transform([&object_type_updates](
exprt expr) {
200 object_type_updates(expr);