diff options
Diffstat (limited to 'cpu')
-rw-r--r-- | cpu/base.cc | 4 | ||||
-rw-r--r-- | cpu/base.hh | 1 | ||||
-rw-r--r-- | cpu/profile.cc | 27 | ||||
-rw-r--r-- | cpu/profile.hh | 15 | ||||
-rw-r--r-- | cpu/simple/cpu.cc | 8 |
5 files changed, 32 insertions, 23 deletions
diff --git a/cpu/base.cc b/cpu/base.cc index a6e71c808..8b94b8533 100644 --- a/cpu/base.cc +++ b/cpu/base.cc @@ -36,6 +36,7 @@ #include "base/output.hh" #include "cpu/base.hh" #include "cpu/exec_context.hh" +#include "cpu/profile.hh" #include "cpu/sampler/sampler.hh" #include "sim/param.hh" #include "sim/sim_events.hh" @@ -254,7 +255,8 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU) intstatus = oldCPU->intstatus; for (int i = 0; i < execContexts.size(); ++i) - execContexts[i]->profile->clear(); + if (execContexts[i]->profile) + execContexts[i]->profile->clear(); if (profileEvent) profileEvent->schedule(curTick); diff --git a/cpu/base.hh b/cpu/base.hh index 914d06982..4a44ab804 100644 --- a/cpu/base.hh +++ b/cpu/base.hh @@ -33,7 +33,6 @@ #include "base/statistics.hh" #include "config/full_system.hh" -#include "cpu/profile.hh" #include "cpu/sampler/sampler.hh" #include "sim/eventq.hh" #include "sim/sim_object.hh" diff --git a/cpu/profile.cc b/cpu/profile.cc index b17a3c74e..f4aa81c2b 100644 --- a/cpu/profile.cc +++ b/cpu/profile.cc @@ -47,8 +47,8 @@ ProfileNode::dump(const string &symbol, uint64_t id, const SymbolTable *symtab, ccprintf(os, "%#x %s %d ", id, symbol, count); ChildList::const_iterator i, end = children.end(); for (i = children.begin(); i != end; ++i) { - const ProfileNode &node = i->second; - ccprintf(os, "%#x ", (intptr_t)&node); + const ProfileNode *node = i->second; + ccprintf(os, "%#x ", (intptr_t)node); } ccprintf(os, "\n"); @@ -65,8 +65,8 @@ ProfileNode::dump(const string &symbol, uint64_t id, const SymbolTable *symtab, else if (!symtab->findSymbol(addr, symbol)) panic("could not find symbol for address %#x\n", addr); - const ProfileNode &node = i->second; - node.dump(symbol, (intptr_t)&node, symtab, os); + const ProfileNode *node = i->second; + node->dump(symbol, (intptr_t)node, symtab, os); } } @@ -75,11 +75,8 @@ ProfileNode::clear() { count = 0; ChildList::iterator i, end = children.end(); - for (i = children.begin(); i != end; ++i) { - ProfileNode &node = i->second; - node.clear(); - } - + for (i = children.begin(); i != end; ++i) + i->second->clear(); } FunctionProfile::FunctionProfile(const SymbolTable *_symtab) @@ -92,12 +89,16 @@ FunctionProfile::~FunctionProfile() } ProfileNode * -FunctionProfile::consume(const StackTrace *trace) +FunctionProfile::consume(const vector<Addr> &stack) { - const vector<Addr> &stack = trace->getstack(); ProfileNode *current = ⊤ - for (int i = 0, size = stack.size(); i < size; ++i) - current = ¤t->children[stack[size - i - 1]]; + for (int i = 0, size = stack.size(); i < size; ++i) { + ProfileNode *&ptr = current->children[stack[size - i - 1]]; + if (ptr == NULL) + ptr = new ProfileNode; + + current = ptr; + } return current; } diff --git a/cpu/profile.hh b/cpu/profile.hh index 9da170eb4..c795b8f41 100644 --- a/cpu/profile.hh +++ b/cpu/profile.hh @@ -40,7 +40,7 @@ class ProfileNode private: friend class FunctionProfile; - typedef std::map<Addr, ProfileNode> ChildList; + typedef std::map<Addr, ProfileNode *> ChildList; ChildList children; public: @@ -60,15 +60,26 @@ class FunctionProfile const SymbolTable *symtab; ProfileNode top; std::map<Addr, Counter> pc_count; + StackTrace trace; public: FunctionProfile(const SymbolTable *symtab); ~FunctionProfile(); - ProfileNode *consume(const StackTrace *trace); + ProfileNode *consume(ExecContext *xc, StaticInstPtr<TheISA> inst); + ProfileNode *consume(const std::vector<Addr> &stack); void clear(); void dump(ExecContext *xc, std::ostream &out) const; void sample(ProfileNode *node, Addr pc); }; +inline ProfileNode * +FunctionProfile::consume(ExecContext *xc, StaticInstPtr<TheISA> inst) +{ + if (!trace.trace(xc, inst)) + return NULL; + trace.dprintf(); + return consume(trace.getstack()); +} + #endif // __CPU_PROFILE_HH__ diff --git a/cpu/simple/cpu.cc b/cpu/simple/cpu.cc index 8f7534e16..862fe5b2c 100644 --- a/cpu/simple/cpu.cc +++ b/cpu/simple/cpu.cc @@ -46,6 +46,7 @@ #include "cpu/base.hh" #include "cpu/exec_context.hh" #include "cpu/exetrace.hh" +#include "cpu/profile.hh" #include "cpu/sampler/sampler.hh" #include "cpu/simple/cpu.hh" #include "cpu/smt.hh" @@ -763,12 +764,7 @@ SimpleCPU::tick() if (xc->profile) { bool usermode = (xc->regs.ipr[AlphaISA::IPR_DTB_CM] & 0x18) != 0; xc->profilePC = usermode ? 1 : xc->regs.pc; - StackTrace *trace = StackTrace::create(xc, inst); - if (trace) { - xc->profileNode = xc->profile->consume(trace); - trace->dprintf(); - delete trace; - } + xc->profileNode = xc->profile->consume(xc, inst); } #endif |