141 ppc64recipe->
sp_ty = sp_ty;
142 ppc64recipe->
ra_ty = ra_ty;
143 ppc64recipe->
sp_arg = sp_arg;
144 ppc64recipe->
ra_arg = ra_arg;
169 "ppc64recipe sp_ty = ", ppc64recipe->
sp_ty);
205 printf(
" [%p, %p) ty=%-10s,%-10s sp_arg=%5d ra_arg=%5d\n",
218 EMSG(
"suspicous interval for pc = %p", pc);
228 #define STR(s) case s: return #s 259 register_name(
int reg)
344 const int Rs = 0, Rb = 0, Rc = 0x0;
353 const int Rs = 0, Rb = 0, Rc = 0x0;
371 const int Rs = 0, Rc = 0x0;
375 return (isMoveToRa && isRsEqRb);
392 int disp = sp_disp + 2 * (
sizeof(
void*));
394 int disp = sp_disp + (
sizeof(
void*));
408 #define INSN(insn) ((char*)(insn)) 412 return INSN(insn + 1);
517 uint32_t* cur_insn = (uint32_t*) beg_insn;
518 uint32_t* end_insn = (uint32_t*) (beg_insn + len);
522 while (cur_insn < end_insn) {
672 else if (
isInsn_BLR(*cur_insn) && (cur_insn + 1 < end_insn)) {
677 if (!
ui_cmp(ui, canon_ui)) {
724 uintptr_t llen = ((uintptr_t)e) - (uintptr_t)s;
726 printf(
"build intervals from %p to %p (%"PRIuPTR
")\n", s, e, llen);
void uw_recipe_print(void *recipe)
#define PPC_OP_XFX_SPR_MASK
static bool isInsn_MTLR(uint32_t insn, int *Rt)
void link_ui(unwind_interval *current, unwind_interval *next)
void hpcrun_dump_intervals(void *addr)
void suspicious_interval(void *pc)
uwi_t * bitree_uwi_rootval(bitree_uwi_t *tree)
char * first_undecoded_ins
static bool isInsn_ADDI(uint32_t insn, int Rt, int Ra)
#define PPC_OPND_REG_B(insn)
void uw_recipe_tostr(void *recipe, char str[], unwinder_t uw)
static void ppc64_print_interval_set(unwind_interval *first)
static bool isInsn_STWU(uint32_t insn, int Rs, int Ra)
static bool ui_cmp(unwind_interval *ux, unwind_interval *uy)
#define UWI_RECIPE(btuwi)
static bool isInsn_LWZ(uint32_t insn, int Rt, int Ra)
#define PPC_OPND_REG_T(insn)
bitree_uwi_t * bitree_uwi_malloc(unwinder_t uw, size_t recipe_size)
static bool isInsn_STWUX(uint32_t insn, int Ra)
static int getRADispFromSPDisp(int sp_disp)
static const char * ra_ty_string(ra_ty_t ty)
#define PPC_OPND_DISP_DS(x)
static btuwi_status_t ppc64_build_intervals(char *ins, unsigned int len)
void ppc64recipe_print(void *recipe)
static char * nextInsn(uint32_t *insn)
static bool isInsn_BLR(uint32_t insn)
struct bitree_uwi_s bitree_uwi_t
static bool isInsn_STDUX(uint32_t insn, int Ra)
void ppc64recipe_tostr(void *recipe, char str[])
static int getSPDispFromUI(unwind_interval *ui)
unwind_interval * new_ui(char *startaddr, sp_ty_t sp_ty, ra_ty_t ra_ty, int sp_arg, int ra_arg)
#define PPC_INSN_D(opc, RS, RA, D)
static bool isInsn_STW(uint32_t insn, int Rs, int Ra)
static bool isInsn_MR(uint32_t insn, int Ra)
static bool isInsn_STDU(uint32_t insn, int Rs, int Ra)
#define UWI_END_ADDR(btuwi)
void ui_dump(unwind_interval *u)
static bool isInsn_MFLR(uint32_t insn, int *Rt)
#define UWI_START_ADDR(btuwi)
bitree_uwi_t unwind_interval
enum unwinder_e unwinder_t
btuwi_status_t build_intervals(char *ins, unsigned int len, unwinder_t uw)
#define PPC_OPND_REG_A_MASK
#define PPC_OPND_REG_S(insn)
void hpcrun_stats_num_unwind_intervals_suspicious_inc(void)
#define PPC_INSN_X(opc, RS, RA, RB, Rc)
static bool isInsn_STD(uint32_t insn, int Rs, int Ra)
static const char * sp_ty_string(sp_ty_t ty)
void ppc64_dump_intervals(void *addr)
#define PPC_INSN_DS(opc, RS, RA, D)
void bitree_uwi_set_rightsubtree(bitree_uwi_t *tree, bitree_uwi_t *subtree)
bool fnbounds_enclosing_addr(void *ip, void **start, void **end, load_module_t **lm)