📄 tc-ia64.c
字号:
}static unw_rec_list *output_bsp_when (){ unw_rec_list *ptr = alloc_record (bsp_when); return ptr;}static unw_rec_list *output_bsp_gr (gr) unsigned int gr;{ unw_rec_list *ptr = alloc_record (bsp_gr); ptr->r.record.p.gr = gr; return ptr;}static unw_rec_list *output_bsp_psprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (bsp_psprel); ptr->r.record.p.pspoff = offset / 4; return ptr;}static unw_rec_list *output_bsp_sprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (bsp_sprel); ptr->r.record.p.spoff = offset / 4; return ptr;}static unw_rec_list *output_bspstore_when (){ unw_rec_list *ptr = alloc_record (bspstore_when); return ptr;}static unw_rec_list *output_bspstore_gr (gr) unsigned int gr;{ unw_rec_list *ptr = alloc_record (bspstore_gr); ptr->r.record.p.gr = gr; return ptr;}static unw_rec_list *output_bspstore_psprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (bspstore_psprel); ptr->r.record.p.pspoff = offset / 4; return ptr;}static unw_rec_list *output_bspstore_sprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (bspstore_sprel); ptr->r.record.p.spoff = offset / 4; return ptr;}static unw_rec_list *output_rnat_when (){ unw_rec_list *ptr = alloc_record (rnat_when); return ptr;}static unw_rec_list *output_rnat_gr (gr) unsigned int gr;{ unw_rec_list *ptr = alloc_record (rnat_gr); ptr->r.record.p.gr = gr; return ptr;}static unw_rec_list *output_rnat_psprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (rnat_psprel); ptr->r.record.p.pspoff = offset / 4; return ptr;}static unw_rec_list *output_rnat_sprel (offset) unsigned int offset;{ unw_rec_list *ptr = alloc_record (rnat_sprel); ptr->r.record.p.spoff = offset / 4; return ptr;}static unw_rec_list *output_unwabi (abi, context) unsigned long abi; unsigned long context;{ unw_rec_list *ptr = alloc_record (unwabi); ptr->r.record.p.abi = abi; ptr->r.record.p.context = context; return ptr;}static unw_rec_list *output_epilogue (unsigned long ecount){ unw_rec_list *ptr = alloc_record (epilogue); ptr->r.record.b.ecount = ecount; return ptr;}static unw_rec_list *output_label_state (unsigned long label){ unw_rec_list *ptr = alloc_record (label_state); ptr->r.record.b.label = label; return ptr;}static unw_rec_list *output_copy_state (unsigned long label){ unw_rec_list *ptr = alloc_record (copy_state); ptr->r.record.b.label = label; return ptr;}static unw_rec_list *output_spill_psprel (ab, reg, offset) unsigned int ab; unsigned int reg; unsigned int offset;{ unw_rec_list *ptr = alloc_record (spill_psprel); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.pspoff = offset / 4; return ptr;}static unw_rec_list *output_spill_sprel (ab, reg, offset) unsigned int ab; unsigned int reg; unsigned int offset;{ unw_rec_list *ptr = alloc_record (spill_sprel); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.spoff = offset / 4; return ptr;}static unw_rec_list *output_spill_psprel_p (ab, reg, offset, predicate) unsigned int ab; unsigned int reg; unsigned int offset; unsigned int predicate;{ unw_rec_list *ptr = alloc_record (spill_psprel_p); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.pspoff = offset / 4; ptr->r.record.x.qp = predicate; return ptr;}static unw_rec_list *output_spill_sprel_p (ab, reg, offset, predicate) unsigned int ab; unsigned int reg; unsigned int offset; unsigned int predicate;{ unw_rec_list *ptr = alloc_record (spill_sprel_p); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.spoff = offset / 4; ptr->r.record.x.qp = predicate; return ptr;}static unw_rec_list *output_spill_reg (ab, reg, targ_reg, xy) unsigned int ab; unsigned int reg; unsigned int targ_reg; unsigned int xy;{ unw_rec_list *ptr = alloc_record (spill_reg); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.treg = targ_reg; ptr->r.record.x.xy = xy; return ptr;}static unw_rec_list *output_spill_reg_p (ab, reg, targ_reg, xy, predicate) unsigned int ab; unsigned int reg; unsigned int targ_reg; unsigned int xy; unsigned int predicate;{ unw_rec_list *ptr = alloc_record (spill_reg_p); ptr->r.record.x.ab = ab; ptr->r.record.x.reg = reg; ptr->r.record.x.treg = targ_reg; ptr->r.record.x.xy = xy; ptr->r.record.x.qp = predicate; return ptr;}/* Given a unw_rec_list process the correct format with the specified function. */static voidprocess_one_record (ptr, f) unw_rec_list *ptr; vbyte_func f;{ unsigned long fr_mask, gr_mask; switch (ptr->r.type) { case gr_mem: case fr_mem: case br_mem: case frgr_mem: /* These are taken care of by prologue/prologue_gr. */ break; case prologue_gr: case prologue: if (ptr->r.type == prologue_gr) output_R2_format (f, ptr->r.record.r.grmask, ptr->r.record.r.grsave, ptr->r.record.r.rlen); else output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen); /* Output descriptor(s) for union of register spills (if any). */ gr_mask = ptr->r.record.r.mask.gr_mem; fr_mask = ptr->r.record.r.mask.fr_mem; if (fr_mask) { if ((fr_mask & ~0xfUL) == 0) output_P6_format (f, fr_mem, fr_mask); else { output_P5_format (f, gr_mask, fr_mask); gr_mask = 0; } } if (gr_mask) output_P6_format (f, gr_mem, gr_mask); if (ptr->r.record.r.mask.br_mem) output_P1_format (f, ptr->r.record.r.mask.br_mem); /* output imask descriptor if necessary: */ if (ptr->r.record.r.mask.i) output_P4_format (f, ptr->r.record.r.mask.i, ptr->r.record.r.imask_size); break; case body: output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen); break; case mem_stack_f: case mem_stack_v: output_P7_format (f, ptr->r.type, ptr->r.record.p.t, ptr->r.record.p.size); break; case psp_gr: case rp_gr: case pfs_gr: case preds_gr: case unat_gr: case lc_gr: case fpsr_gr: case priunat_gr: case bsp_gr: case bspstore_gr: case rnat_gr: output_P3_format (f, ptr->r.type, ptr->r.record.p.gr); break; case rp_br: output_P3_format (f, rp_br, ptr->r.record.p.br); break; case psp_sprel: output_P7_format (f, psp_sprel, ptr->r.record.p.spoff, 0); break; case rp_when: case pfs_when: case preds_when: case unat_when: case lc_when: case fpsr_when: output_P7_format (f, ptr->r.type, ptr->r.record.p.t, 0); break; case rp_psprel: case pfs_psprel: case preds_psprel: case unat_psprel: case lc_psprel: case fpsr_psprel: case spill_base: output_P7_format (f, ptr->r.type, ptr->r.record.p.pspoff, 0); break; case rp_sprel: case pfs_sprel: case preds_sprel: case unat_sprel: case lc_sprel: case fpsr_sprel: case priunat_sprel: case bsp_sprel: case bspstore_sprel: case rnat_sprel: output_P8_format (f, ptr->r.type, ptr->r.record.p.spoff); break; case gr_gr: output_P9_format (f, ptr->r.record.p.grmask, ptr->r.record.p.gr); break; case br_gr: output_P2_format (f, ptr->r.record.p.brmask, ptr->r.record.p.gr); break; case spill_mask: as_bad ("spill_mask record unimplemented."); break; case priunat_when_gr: case priunat_when_mem: case bsp_when: case bspstore_when: case rnat_when: output_P8_format (f, ptr->r.type, ptr->r.record.p.t); break; case priunat_psprel: case bsp_psprel: case bspstore_psprel: case rnat_psprel: output_P8_format (f, ptr->r.type, ptr->r.record.p.pspoff); break; case unwabi: output_P10_format (f, ptr->r.record.p.abi, ptr->r.record.p.context); break; case epilogue: output_B3_format (f, ptr->r.record.b.ecount, ptr->r.record.b.t); break; case label_state: case copy_state: output_B4_format (f, ptr->r.type, ptr->r.record.b.label); break; case spill_psprel: output_X1_format (f, ptr->r.type, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.t, ptr->r.record.x.pspoff); break; case spill_sprel: output_X1_format (f, ptr->r.type, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.t, ptr->r.record.x.spoff); break; case spill_reg: output_X2_format (f, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.xy >> 1, ptr->r.record.x.xy, ptr->r.record.x.treg, ptr->r.record.x.t); break; case spill_psprel_p: output_X3_format (f, ptr->r.type, ptr->r.record.x.qp, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.t, ptr->r.record.x.pspoff); break; case spill_sprel_p: output_X3_format (f, ptr->r.type, ptr->r.record.x.qp, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.t, ptr->r.record.x.spoff); break; case spill_reg_p: output_X4_format (f, ptr->r.record.x.qp, ptr->r.record.x.ab, ptr->r.record.x.reg, ptr->r.record.x.xy >> 1, ptr->r.record.x.xy, ptr->r.record.x.treg, ptr->r.record.x.t); break; default: as_bad ("record_type_not_valid"); break; }}/* Given a unw_rec_list list, process all the records with the specified function. */static voidprocess_unw_records (list, f) unw_rec_list *list; vbyte_func f;{ unw_rec_list *ptr; for (ptr = list; ptr; ptr = ptr->next) process_one_record (ptr, f);}/* Determine the size of a record list in bytes. */static intcalc_record_size (list) unw_rec_list *list;{ vbyte_count = 0; process_unw_records (list, count_output); return vbyte_count;}/* Update IMASK bitmask to reflect the fact that one or more registers of type TYPE are saved starting at instruction with index T. If N bits are set in REGMASK, it is assumed that instructions T through T+N-1 save these registers. TYPE values: 0: no save 1: instruction saves next fp reg 2: instruction saves next general reg 3: instruction saves next branch reg */static voidset_imask (region, regmask, t, type) unw_rec_list *region; unsigned long regmask; unsigned long t; unsigned int type;{ unsigned char *imask; unsigned long imask_size; unsigned int i; int pos; imask = region->r.record.r.mask.i; imask_size = region->r.record.r.imask_size; if (!imask) { imask_size = (region->r.record.r.rlen * 2 + 7) / 8 + 1; imask = xmalloc (imask_size); memset (imask, 0, imask_size); region->r.record.r.imask_size = imask_size; region->r.record.r.mask.i = imask; } i = (t / 4) + 1; pos = 2 * (3 - t % 4); while (regmask) { if (i >= imask_size) { as_bad ("Ignoring attempt to spill beyond end of region"); return; } imask[i] |= (type & 0x3) << pos; regmask &= (regmask - 1); pos -= 2; if (pos < 0) { pos = 0; ++i; } }}static intcount_bits (unsigned long mask){ int n = 0; while (mask) { mask &= mask - 1; ++n; } return n;}/* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR. SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag containing FIRST_ADDR. */unsigned longslot_i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -