- decode the Vector extension if has_vec is set
- decode long table fields, if longtbtable is set.
There is conflict on the bit order of HasVectorInfoMask and HasExtensionTableMask between AIX os header and IBM aix compiler XLC.
In the /usr/include/sys/debug.h defines
static constexpr uint32_t HasVectorInfoMask = 0x0040'0000;
static constexpr uint32_t HasExtensionTableMask = 0x0080'0000;
but the XLC defines as
static constexpr uint32_t HasVectorInfoMask = 0x0080'0000;
static constexpr uint32_t HasExtensionTableMask = 0x0040'0000;
we follows the definition of the IBM AIX compiler XLC here.
for the convenient to review , I copy some related code from the /usr/include/sys/debug.h of aix os
‘’‘
/*
- Vector extension portion of the optional table (if has_vec is set). */
struct vec_ext {
unsigned vr_saved:6; /* Number of non-volatile vector regs saved */ /* first register saved is assumed to be */ /* 32 - vr_saved */ unsigned saves_vrsave:1;/* Set if vrsave is saved on the stack */ unsigned has_varargs:1; unsigned vectorparms:7; /* number of vector parameters */ unsigned vec_present:1; /* Set if routine performs vmx instructions */ unsigned char vecparminfo[4];/* bitmask array for each vector parm in */ /* order as found in the original parminfo, */ /* describes the type of vector: */ /* b'00 = vector char */ /* b'01 = vector short */ /* b'10 = vector int */ /* b'11 = vector float */
};
/*
- Optional portions of procedure-end table. *
- Optional portions exist in the following order independently, not as
- a structure or an union. Whether or not portions exist is determinable
- from bit-fields within the base procedure-end table. *
- parminfo exists if fixedparms or floatparms != 0.
- tb_offset exists if has_tboff bit is set.
- hand_mask exists if int_hndl bit is set.
- ctl_info exists if has_ctl bit is set.
- ctl_info_disp exists if ctl_info exists.
- name_len exists if name_present bit is set.
- name exists if name_len exists.
- alloca_reg exists if uses_alloca bit is set.
- vec_ext exists if has_vec bit is set. */
struct tbtable_ext {
unsigned int parminfo; /* Order and type encoding of parameters: * Left-justified bit-encoding as follows: * '0' ==> fixed parameter * '10' ==> single-precision float parameter * '11' ==> double-precision float parameter * * if has_vec is set, encoded as follows: * '00' ==> fixed parameter * '01' ==> vector parameter * '10' ==> single-precision float parameter * '11' ==> double-precision float parameter */ unsigned int tb_offset; /* Offset from start of code to tb table */ int hand_mask; /* What interrupts are handled by */ int ctl_info; /* Number of CTL anchors, followed by */ int ctl_info_disp[1]; /* Actually ctl_info_disp[ctl_info] */ /* Displacements into stack of each anchor */ short name_len; /* Length of procedure name */ char name[1]; /* Actually char[name_len] (no NULL) */ char alloca_reg; /* Register for alloca automatic storage */ struct vec_ext vec_ext; /* Vector extension (if has_vec is set) */ unsigned char xtbtable; /* More tbtable fields, if longtbtable is set*/
};’‘’
Suggest to add a comment to separate the two groups of masks.