diff options
author | Nathan Binkert <binkertn@umich.edu> | 2005-10-18 19:07:42 -0400 |
---|---|---|
committer | Nathan Binkert <binkertn@umich.edu> | 2005-10-18 19:07:42 -0400 |
commit | a81c03737addc8e9a9b00cde0354e6c0ab4561af (patch) | |
tree | e7415ec9c2a97cf676d5599a1cec2c1fd775ace2 /cpu/exec_context.cc | |
parent | 357ee7a845eac0bd903ed31e31eec993d54a698c (diff) | |
download | gem5-a81c03737addc8e9a9b00cde0354e6c0ab4561af.tar.xz |
Add new function profiling stuff, wrap the pc_sample stuff into it.
SConscript:
Get rid of the pc_sample stuff and move to the new profiling stuff
base/traceflags.py:
DPRINTF Stack stuff
cpu/base.cc:
cpu/base.hh:
cpu/exec_context.cc:
cpu/exec_context.hh:
cpu/simple/cpu.cc:
Add profiling stuff
kern/kernel_stats.hh:
Use a smart pointer
sim/system.cc:
sim/system.hh:
Create a new symbol table that has all of the symbols for a
particular system
util/stats/categories.py:
change around the categories, add categories for function
profiling stuff
util/stats/profile.py:
No profile parsing and display code to deal with function
profiling stuff, graph, dot, and text outputs.
--HG--
extra : convert_revision : b3de0cdc8bd468e42647966e2640ae009bda9eb8
Diffstat (limited to 'cpu/exec_context.cc')
-rw-r--r-- | cpu/exec_context.cc | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/cpu/exec_context.cc b/cpu/exec_context.cc index 91578bdf1..3fe951387 100644 --- a/cpu/exec_context.cc +++ b/cpu/exec_context.cc @@ -32,10 +32,15 @@ #include "cpu/exec_context.hh" #if FULL_SYSTEM +#include "base/callback.hh" #include "base/cprintf.hh" +#include "base/output.hh" +#include "cpu/profile.hh" #include "kern/kernel_stats.hh" #include "sim/serialize.hh" +#include "sim/sim_exit.hh" #include "sim/system.hh" +#include "targetarch/stacktrace.hh" #else #include "sim/process.hh" #endif @@ -51,10 +56,24 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys, cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys), memctrl(_sys->memctrl), physmem(_sys->physmem), kernelBinning(system->kernelBinning), bin(kernelBinning->bin), - fnbin(kernelBinning->fnbin), func_exe_inst(0), storeCondFailures(0) + fnbin(kernelBinning->fnbin), profile(NULL), + func_exe_inst(0), storeCondFailures(0) { kernelStats = new Kernel::Statistics(this); memset(®s, 0, sizeof(RegFile)); + + if (cpu->params->profile) { + profile = new FunctionProfile(system->allSymtab); + Callback *cb = + new MakeCallback<ExecContext, &ExecContext::dumpFuncProfile>(this); + registerExitCallback(cb); + } + + // let's fill with a dummy node for now so we don't get a segfault + // on the first cycle when there's no node available. + static ProfileNode dummyNode; + profileNode = &dummyNode; + profilePC = 3; } #else ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, @@ -83,6 +102,14 @@ ExecContext::~ExecContext() #endif } +#if FULL_SYSTEM +void +ExecContext::dumpFuncProfile() +{ + std::ostream *os = simout.create(csprintf("profile.%s.dat", cpu->name())); + profile->dump(this, *os); +} +#endif void ExecContext::takeOverFrom(ExecContext *oldContext) @@ -106,15 +133,6 @@ ExecContext::takeOverFrom(ExecContext *oldContext) oldContext->_status = ExecContext::Unallocated; } -#if FULL_SYSTEM -void -ExecContext::execute(const StaticInstBase *inst) -{ - assert(kernelStats); - system->kernelBinning->execute(this, inst); -} -#endif - void ExecContext::serialize(ostream &os) { |