| /** |
| * @file abi.cpp |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Graydon Hoare |
| * @author John Levon |
| * @author Philippe Elie |
| */ |
| |
| #include "abi.h" |
| #include "op_abi.h" |
| #include "odb.h" |
| #include "op_sample_file.h" |
| |
| #include <iostream> |
| #include <cassert> |
| |
| using namespace std; |
| |
| typedef map<string, int> abi_map; |
| typedef abi_map::const_iterator abi_iter; |
| |
| abi_exception::abi_exception(string const d) : desc(d) {} |
| |
| |
| abi::abi() |
| { |
| op_abi_entry const * entry = get_abi(); |
| for ( ; entry->name != 0; ++entry) |
| slots[entry->name] = entry->offset; |
| |
| slots["little_endian"] = op_little_endian(); |
| } |
| |
| |
| int abi::need(string const key) const throw (abi_exception) |
| { |
| if (slots.find(key) != slots.end()) |
| return slots.find(key)->second; |
| else |
| throw abi_exception(string("missing ABI key: ") + key); |
| } |
| |
| |
| bool abi::operator==(abi const & other) const |
| { |
| return slots == other.slots; |
| } |
| |
| |
| ostream & operator<<(ostream & o, abi const & abi) |
| { |
| abi_iter i = abi.slots.begin(); |
| abi_iter e = abi.slots.end(); |
| |
| for (; i != e; ++i) |
| o << i->first << " " << i->second << endl; |
| |
| return o; |
| } |
| |
| |
| istream & operator>>(istream & i, abi & abi) |
| { |
| string key; |
| int val; |
| abi.slots.clear(); |
| |
| while(i >> key >> val) |
| abi.slots[key] = val; |
| |
| return i; |
| } |