110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file abi.cpp 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Graydon Hoare 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "abi.h" 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_abi.h" 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "odb.h" 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_sample_file.h" 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <iostream> 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <cassert> 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectusing namespace std; 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projecttypedef map<string, int> abi_map; 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projecttypedef abi_map::const_iterator abi_iter; 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectabi_exception::abi_exception(string const d) : desc(d) {} 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectabi::abi() 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_abi_entry const * entry = get_abi(); 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for ( ; entry->name != 0; ++entry) 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project slots[entry->name] = entry->offset; 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project slots["little_endian"] = op_little_endian(); 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint abi::need(string const key) const throw (abi_exception) 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (slots.find(key) != slots.end()) 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return slots.find(key)->second; 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project else 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project throw abi_exception(string("missing ABI key: ") + key); 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectbool abi::operator==(abi const & other) const 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return slots == other.slots; 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectostream & operator<<(ostream & o, abi const & abi) 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project abi_iter i = abi.slots.begin(); 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project abi_iter e = abi.slots.end(); 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (; i != e; ++i) 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project o << i->first << " " << i->second << endl; 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return o; 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectistream & operator>>(istream & i, abi & abi) 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project string key; 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int val; 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project abi.slots.clear(); 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while(i >> key >> val) 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project abi.slots[key] = val; 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return i; 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 76