1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include "stdafx.h"
#include "StackInfoSet.h"
#include <typeinfo>
StackInfoSet::StackInfoSet() {
attach(cppInfo);
}
int StackInfoSet::attach(const StackInfo &lookup) {
util::Lock::L z(lock);
for (size_t i = 0; i < data.size(); i++) {
const StackInfo *l = data[i];
if (!l)
continue;
// We assume that if they're of the same type, they're equal.
if (typeid(*l) == typeid(lookup))
return -1;
}
for (size_t i = 0; i < data.size(); i++) {
if (!data[i]) {
data[i] = &lookup;
return int(i);
}
}
data.push_back(&lookup);
return int(data.size() - 1);
}
void StackInfoSet::detach(int id) {
util::Lock::L z(lock);
if (id >= 0)
data[id] = null;
}
void StackInfoSet::alloc(StackFrame *frames, nat count) {
util::Lock::L z(lock);
for (size_t i = 0; i < data.size(); i++) {
if (data[i])
data[i]->alloc(frames, count);
}
}
void StackInfoSet::free(StackFrame *frames, nat count) {
util::Lock::L z(lock);
for (size_t i = 0; i < data.size(); i++) {
if (data[i])
data[i]->free(frames, count);
}
}
int StackInfoSet::translate(void *ip, void *&fnBase, int &offset) {
util::Lock::L z(lock);
// Reverse order so that CppInfo is last.
for (size_t i = data.size(); i > 0; i--) {
if (data[i - 1])
if (data[i - 1]->translate(ip, fnBase, offset))
return int(i) - 1;
}
// The C++ backend will do just fine. We should not get here though.
cppInfo.translate(ip, fnBase, offset);
return 0;
}
void StackInfoSet::format(GenericOutput &to, int id, void *fnBase, int offset) {
util::Lock::L z(lock);
if (data[id]) {
data[id]->format(to, fnBase, offset);
} else {
to.put("Unknown function @0x");
to.putHex((size_t)fnBase + offset);
}
}
|