| /* PowerPC traceback table support for BFD. |
| Copyright (C) 1993-2024 Free Software Foundation, Inc. |
| |
| This file is part of BFD, the Binary File Descriptor library. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| MA 02110-1301, USA. */ |
| |
| |
| /* Originally written by Ira Ruben, 06/28/93. */ |
| |
| /* This is a compiler independent representation of the AIX Version 3 traceback table (in |
| sys/debug.h), which occurs, usually, one per procedure (routine). The table is marked by |
| a multiple of 4 32-bit word of zeroes in the instruction space. The traceback table is |
| also referred to as "procedure-end table". |
| |
| The AIX traceback table representation on which this header is based is defined as a |
| series of bit field struct specifications. Bit fields are compiler dependent! Thus, |
| the definitions presented here follow the original header and the existing documentation |
| (such as it is), but define the fields as BIT MASKS and other macros. The mask names, |
| however, where chosen as the original field names to give some compatibility with the |
| original header and to agree with the documentation. */ |
| |
| #ifndef __TRACEBACK__ |
| #define __TRACEBACK__ |
| |
| #define TB_C 0U /* C */ |
| #define TB_FORTRAN 1U /* FORTRAN */ |
| #define TB_PASCAL 2U /* Pascal */ |
| #define TB_ADA 3U /* ADA */ |
| #define TB_PL1 4U /* PL1 */ |
| #define TB_BASIC 5U /* Basic */ |
| #define TB_LISP 6U /* Lisp */ |
| #define TB_COBOL 7U /* eCobol */ |
| #define TB_MODULA2 8U /* Modula2 */ |
| #define TB_CPLUSPLUS 9U /* C++ */ |
| #define TB_RPG 10U /* RPG */ |
| #define TB_PL8 11U /* PL8 */ |
| #define TB_ASM 12U /* Asm */ |
| |
| /* Flags 1. */ |
| |
| #define TB_GLOBALLINK 0x80U /* Routine is Global Linkage. */ |
| #define TB_is_eprol 0x40U /* Out-of-line prolog or epilog routine. */ |
| #define TB_HAS_TBOFF 0x20U /* tb_offset set (extension field). */ |
| #define TB_INT_PROC 0x10U /* Internal leaf routine. */ |
| #define TB_HAS_CTL 0x08U /* Has controlled automatic storage. */ |
| #define TB_TOCLESS 0X04U /* Routine has no TOC. */ |
| #define TB_FP_PRESENT 0x02U /* Routine has floating point ops. */ |
| #define TB_LOG_ABORT 0x01U /* fp_present && log/abort compiler opt. */ |
| |
| /* Flags 2. */ |
| |
| #define TB_INT_HNDL 0x80U /* Routine is an interrupt handler. */ |
| #define TB_NAME_PRESENT 0x40U /* Name_len/name set (extension field). */ |
| #define TB_USES_ALLOCA 0x20U /* Uses alloca() to allocate storage. */ |
| #define TB_CL_DIS_inv 0x1CU /* On-condition directives (see below). */ |
| #define TB_SAVES_CR 0x02U /* Routine saves the CR. */ |
| #define TB_SAVES_LR 0x01U /* Routine saves the LR. */ |
| |
| /* cl_dis_inv "on condition" settings: */ |
| |
| #define TB_CL_DIS_INV(x) (((x) & cl_dis_inv) >> 2U) |
| |
| #define TB_WALK_ONCOND 0U /* Walk stack without restoring state. */ |
| #define TB_DISCARD_ONCOND 1U /* Walk stack and discard. */ |
| #define TB_INVOKE_ONCOND 2U /* Invoke a specific system routine. */ |
| |
| /* Flags 3. */ |
| |
| #define TB_STORES_BC 0x80U /* Routine saves frame ptr of caller. */ |
| #define TB_SPARE2 0X40U /* Spare bit. */ |
| #define TB_FPR_SAVED 0x3fU /* Number of FPRs saved (max of 32). */ |
| /* (Last reg saved is ALWAYS fpr31). */ |
| |
| #define TB_NUM_FPR_SAVED(x) ((x) & fpr_saved) |
| |
| /* Flags 4. */ |
| |
| #define TB_HAS_VEC_INFO 0x80U /* Routine uses vectors. */ |
| #define TB_SPARE3 0X40U /* Spare bit. */ |
| #define TB_GPR_SAVED 0x3fU /* Number of GPRs saved (max of 32). */ |
| /* (Last reg saved is ALWAYS gpr31). */ |
| |
| #define TB_NUM_GPR_SAVED(x) ((x) & gpr_saved) |
| |
| /* Flags 5. */ |
| |
| #define TB_FLOATPARAMS 0xfeU /* Number of floating point parameters. */ |
| #define TB_PARAMSONSTK 0X01U /* All parameters are on the stack. */ |
| |
| #define TB_NUM_FLOATPARAMS(X) (((x) & floatparams) >> 1U) |
| |
| /* Traceback_table (fixed portion). */ |
| |
| struct traceback_table |
| { |
| /* Traceback table layout (fixed portion): */ |
| |
| unsigned char version; /* Traceback format version. */ |
| unsigned char lang; /* Language indicators: */ |
| unsigned char flags1; /* Flag bits #1: */ |
| unsigned char flags2; /* Flag bits #2: */ |
| unsigned char flags3; /* Flag bits #3: */ |
| unsigned char flags4; /* Flag bits #4: */ |
| unsigned char fixedparams; /* Number of fixed point parameters. */ |
| unsigned char flags5; /* Flag bits #5: */ |
| }; |
| |
| /* traceback_table (optional) extensions. */ |
| |
| /* Optional portions exist independently in the order presented below, |
| not as a structure or a union. Whether or not portions exist is |
| determinable from bit-fields within the fixed portion above. */ |
| |
| /* The following is present only if fixedparams or floatparams are non |
| zero and it immediately follows the fixed portion of the traceback |
| table... */ |
| |
| /* Order and type encoding of parameters: */ |
| struct traceback_table_fixedparams |
| { |
| unsigned long paraminfo; |
| }; |
| |
| /* Left-justified bit-encoding as follows: */ |
| #define FIXED_PARAM 0 /* '0' ==> fixed param (1 gpr or word). */ |
| #define SPFP_PARAM 2 /* '10' ==> single-precision float param. */ |
| #define DPFP_PARAM 3 /* '11' ==> double-precision float param. */ |
| |
| #define PARAM_ENCODING(x, bit) /* Yields xxx_PARAM as a function of "bit". */ \ |
| ((((x)&(1UL<<(31UL-(bit++))))==0UL) /* Values 0:31 (left-to-right). "bit" is */ \ |
| ? FIXED_PARAM /* an L-value that's left incremented to */ \ |
| : ((((x)&(1UL<<(31UL-(bit++))))==0)/* the next bit position for the next */ \ |
| ? SPFP_PARAM /* parameter. This will be 1 or 2 bit */ \ |
| : DPFP_PARAM)) /* positions later. */ |
| |
| /* The following is present only if has_tboff (in flags1) in fixed part is present... */ |
| |
| /* Offset from start of code to TracebackTbl. */ |
| struct traceback_table_tboff |
| { |
| unsigned long tb_offset; |
| }; |
| |
| /* The following is present only if int_hndl (in flags2) in fixed part is present ... */ |
| |
| /* What interrupts are handled by the routine. */ |
| struct traceback_table_interrupts |
| { |
| long hand_mask; |
| }; |
| |
| /* The following are present only if has_ctl (in flags1) in fixed part is present... */ |
| |
| /* Controlled automatic storage info: */ |
| struct traceback_table_anchors |
| { |
| unsigned long ctl_info; /* Number of controlled automatic anchors. */ |
| long ctl_info_disp[1]; /* Array of stack displacements where each. */ |
| }; /* Anchor is located (array STARTS here). */ |
| |
| /* The following are present only if name_present (in flags2) in fixed |
| part is present... */ |
| |
| /* Routine name: */ |
| struct traceback_table_routine |
| { |
| unsigned short name_len; /* Length of name that follows. */ |
| char name[1]; /* Name starts here (NOT null terminated). */ |
| }; |
| |
| /* The following are present only if uses_alloca (in flags2) in fixed |
| part is present... */ |
| |
| /* Register auto storage when alloca() is used. */ |
| struct traceback_table_alloca |
| { |
| char alloca_reg; |
| }; |
| |
| /* The following are present only if has_vec_info (in flags4) in fixed |
| part is present... */ |
| |
| /* Vector info: */ |
| struct traceback_table_vector |
| { |
| unsigned char vec_flags1; /* Vec info bits #1: */ |
| |
| #define TB_VR_SAVED 0xFCU /* Number of saved vector registers. */ |
| #define TB_SAVES_VRSAVE 0x02U /* Saves VRsave. */ |
| #define TB_HAS_VARARGS 0x01U /* Routine has a variable argument list. */ |
| |
| #define TB_NUM_VR_SAVED(x) (((x) & TB_VR_SAVED) >> 2U) |
| |
| unsigned char vec_flags2; /* Vec info bits #2: */ |
| |
| #define TB_VECTORPARAMS 0xfeU /* Number of vector parameters. */ |
| #define TB_VEC_PRESENT 0x01U /* Routine uses at least one vec instr. */ |
| |
| #define VECPARAMS(x) (((x) & TB_VECTORPARAMS) >> 1U) |
| }; |
| |
| #endif |