if (!cfi) { /* * This is usually either unreachable nops/traps (which don't * trigger unreachable instruction warnings), or * STACK_FRAME_NON_STANDARD functions.
*/
orc->type = ORC_TYPE_UNDEFINED; return 0;
}
switch (cfi->type) { case UNWIND_HINT_TYPE_UNDEFINED:
orc->type = ORC_TYPE_UNDEFINED; return 0; case UNWIND_HINT_TYPE_END_OF_STACK:
orc->type = ORC_TYPE_END_OF_STACK; return 0; case UNWIND_HINT_TYPE_CALL:
orc->type = ORC_TYPE_CALL; break; case UNWIND_HINT_TYPE_REGS:
orc->type = ORC_TYPE_REGS; break; case UNWIND_HINT_TYPE_REGS_PARTIAL:
orc->type = ORC_TYPE_REGS_PARTIAL; break; default:
ERROR_INSN(insn, "unknown unwind hint type %d", cfi->type); return -1;
}
orc->signal = cfi->signal;
switch (cfi->cfa.base) { case CFI_SP:
orc->sp_reg = ORC_REG_SP; break; case CFI_SP_INDIRECT:
orc->sp_reg = ORC_REG_SP_INDIRECT; break; case CFI_BP:
orc->sp_reg = ORC_REG_BP; break; case CFI_BP_INDIRECT:
orc->sp_reg = ORC_REG_BP_INDIRECT; break; case CFI_R10:
orc->sp_reg = ORC_REG_R10; break; case CFI_R13:
orc->sp_reg = ORC_REG_R13; break; case CFI_DI:
orc->sp_reg = ORC_REG_DI; break; case CFI_DX:
orc->sp_reg = ORC_REG_DX; break; default:
ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); return -1;
}
switch (bp->base) { case CFI_UNDEFINED:
orc->bp_reg = ORC_REG_UNDEFINED; break; case CFI_CFA:
orc->bp_reg = ORC_REG_PREV_SP; break; case CFI_BP:
orc->bp_reg = ORC_REG_BP; break; default:
ERROR_INSN(insn, "unknown BP base reg %d", bp->base); return -1;
}
/* populate reloc for ip */ if (!elf_init_reloc_text_sym(elf, ip_sec, idx * sizeof(int), idx,
insn_sec, insn_off)) return -1;
return 0;
}
staticconstchar *reg_name(unsignedint reg)
{ switch (reg) { case ORC_REG_PREV_SP: return"prevsp"; case ORC_REG_DX: return"dx"; case ORC_REG_DI: return"di"; case ORC_REG_BP: return"bp"; case ORC_REG_SP: return"sp"; case ORC_REG_R10: return"r10"; case ORC_REG_R13: return"r13"; case ORC_REG_BP_INDIRECT: return"bp(ind)"; case ORC_REG_SP_INDIRECT: return"sp(ind)"; default: return"?";
}
}
staticconstchar *orc_type_name(unsignedint type)
{ switch (type) { case ORC_TYPE_UNDEFINED: return"(und)"; case ORC_TYPE_END_OF_STACK: return"end"; case ORC_TYPE_CALL: return"call"; case ORC_TYPE_REGS: return"regs"; case ORC_TYPE_REGS_PARTIAL: return"regs (partial)"; default: return"?";
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.