uint32_t label_index(const label_map &lmap, const std::string &lbl) { label_map::const_iterator it(lmap.find(lbl)); if (it == lmap.end()) { cerr << "unknown label: " << lbl << endl; return -1; } return it->second; }
void add_code( perseus::detail::code_segment& out_code, const label_map& labels, const label_reference_offset& reference, Tail... tail ) { auto pos = labels.find( reference.name ); if( pos == labels.end() ) { throw std::logic_error( "invalid label reference" ); } out_code.push< std::uint32_t >( pos->second - out_code.size() - sizeof( std::uint32_t ) ); add_code( out_code, labels, tail... ); }
void map_labels::clear_map(label_map &m, bool force) { label_map::iterator i = m.begin(); while (i != m.end()) { if (!i->second->immutable() || force) { delete i->second; m.erase(i++); } else ++i; } }
static void calculate_labels( label_map& out_labels, const std::uint32_t address, const label& lab, const Tail&... tail ) { if( !out_labels.insert( { lab.name, address } ).second ) { throw std::logic_error( "Duplicate label " + lab.name ); } calculate_labels( out_labels, address, tail... ); }