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