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_FP:
orc->sp_reg = ORC_REG_FP; break; default:
ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base); return -1;
}
switch (fp->base) { case CFI_UNDEFINED:
orc->fp_reg = ORC_REG_UNDEFINED;
orc->fp_offset = 0; break; case CFI_CFA:
orc->fp_reg = ORC_REG_PREV_SP;
orc->fp_offset = fp->offset; break; case CFI_FP:
orc->fp_reg = ORC_REG_FP; break; default:
ERROR_INSN(insn, "unknown FP base reg %d", fp->base); return -1;
}
switch (ra->base) { case CFI_UNDEFINED:
orc->ra_reg = ORC_REG_UNDEFINED;
orc->ra_offset = 0; break; case CFI_CFA:
orc->ra_reg = ORC_REG_PREV_SP;
orc->ra_offset = ra->offset; break; case CFI_FP:
orc->ra_reg = ORC_REG_FP; break; default:
ERROR_INSN(insn, "unknown RA base reg %d", ra->base); return -1;
}
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.