arch,cpu: Consolidate most of the StackTrace classes into a base class.
These classes are all basically empty now that Alpha has been deleted, except in cases where the arch versions had copied versions of the Alpha code. This change pulls all the generic logic out of the arch versions, making the arch versions much simpler and making it clearer what the core functionality of the class is, and what parts are architecture specific details. In the future, the way the StackTrace class is instantiated should be delegated to the Workload class so that ISA agnostic code doesn't need to know about a particular ISA's StackTrace class, and so that StackTrace logic can, at least theoretically, be specialized for a particular workload. The way a stack trace is collected could vary from OS to OS, for example. Change-Id: Id8108f94e9fe8baf9b4056f2b6404571e9fa52f1 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/30961 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -31,94 +31,22 @@
|
||||
#ifndef __ARCH_RISCV_STACKTRACE_HH__
|
||||
#define __ARCH_RISCV_STACKTRACE_HH__
|
||||
|
||||
#include "base/trace.hh"
|
||||
#include "cpu/static_inst.hh"
|
||||
#include "debug/Stack.hh"
|
||||
|
||||
class ThreadContext;
|
||||
class StackTrace;
|
||||
#include "base/logging.hh"
|
||||
#include "cpu/profile.hh"
|
||||
|
||||
namespace RiscvISA
|
||||
{
|
||||
|
||||
class StackTrace
|
||||
class StackTrace : public BaseStackTrace
|
||||
{
|
||||
private:
|
||||
ThreadContext *tc;
|
||||
std::vector<Addr> stack;
|
||||
|
||||
private:
|
||||
bool isEntry(Addr addr);
|
||||
bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
|
||||
bool decodeSave(MachInst inst, int ®, int &disp);
|
||||
bool decodeStack(MachInst inst, int &disp);
|
||||
|
||||
void trace(ThreadContext *tc, bool is_call);
|
||||
|
||||
public:
|
||||
StackTrace();
|
||||
StackTrace(ThreadContext *tc, const StaticInstPtr &inst);
|
||||
~StackTrace();
|
||||
|
||||
protected:
|
||||
void
|
||||
clear()
|
||||
trace(ThreadContext *tc, bool is_call) override
|
||||
{
|
||||
tc = 0;
|
||||
stack.clear();
|
||||
panic("StackTrace::trace not implemented.");
|
||||
}
|
||||
|
||||
bool
|
||||
valid() const
|
||||
{
|
||||
return tc != nullptr;
|
||||
}
|
||||
|
||||
bool trace(ThreadContext *tc, const StaticInstPtr &inst);
|
||||
|
||||
public:
|
||||
const std::vector<Addr> &
|
||||
getstack() const
|
||||
{
|
||||
return stack;
|
||||
}
|
||||
|
||||
static const int user = 1;
|
||||
static const int console = 2;
|
||||
static const int unknown = 3;
|
||||
|
||||
#if TRACING_ON
|
||||
private:
|
||||
void dump();
|
||||
|
||||
public:
|
||||
void
|
||||
dprintf()
|
||||
{
|
||||
if (DTRACE(Stack))
|
||||
dump();
|
||||
}
|
||||
#else
|
||||
public:
|
||||
void
|
||||
dprintf()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
inline bool
|
||||
StackTrace::trace(ThreadContext *tc, const StaticInstPtr &inst)
|
||||
{
|
||||
if (!inst->isCall() && !inst->isReturn())
|
||||
return false;
|
||||
|
||||
if (valid())
|
||||
clear();
|
||||
|
||||
trace(tc, !inst->isReturn());
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace RiscvISA
|
||||
|
||||
#endif // __ARCH_RISCV_STACKTRACE_HH__
|
||||
|
||||
Reference in New Issue
Block a user