#ifndef ARM_TRC_RET_STACK_H_INCLUDED
#define ARM_TRC_RET_STACK_H_INCLUDED
#include "opencsd/ocsd_if_types.h"
#ifdef TRC_RET_STACK_DEBUG
class TraceComponent;
#endif
typedef struct _retStackElement
{
ocsd_vaddr_t ret_addr;
ocsd_isa ret_isa;
} retStackElement;
class TrcAddrReturnStack
{
public:
TrcAddrReturnStack();
~TrcAddrReturnStack() {};
void set_active(bool active)
{
m_active = active;
};
bool is_active() const
{
return m_active;
};
void push(const ocsd_vaddr_t addr, const ocsd_isa isa);
ocsd_vaddr_t pop(ocsd_isa &isa);
void flush();
bool overflow() const
{
return (bool)(num_entries < 0);
};
void set_pop_pending()
{
if (m_active)
m_pop_pending = true;
}
void clear_pop_pending()
{
m_pop_pending = false;
}
bool pop_pending() const
{
return m_pop_pending;
};
void set_tinfo_wait_addr()
{
m_t_info_wait_addr = true;
}
void clear_t_info_wait_addr()
{
m_t_info_wait_addr = false;
}
const bool is_t_info_wait_addr() const
{
return m_t_info_wait_addr;
}
private:
bool m_active;
bool m_pop_pending; bool m_t_info_wait_addr;
int head_idx;
int num_entries;
retStackElement m_stack[16];
#ifdef TRC_RET_STACK_DEBUG
public:
void set_dbg_logger(TraceComponent *pLogger) { m_p_debug_logger = pLogger; };
private:
void LogOp(const char *pszOpString, ocsd_vaddr_t addr, int head_off, ocsd_isa isa);
TraceComponent *m_p_debug_logger;
#endif };
#endif