summaryrefslogtreecommitdiff
path: root/usr/src/tools/ctf/dwarf/common/dwarf_frame.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/tools/ctf/dwarf/common/dwarf_frame.h')
-rw-r--r--usr/src/tools/ctf/dwarf/common/dwarf_frame.h421
1 files changed, 0 insertions, 421 deletions
diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_frame.h b/usr/src/tools/ctf/dwarf/common/dwarf_frame.h
deleted file mode 100644
index ceb686335b..0000000000
--- a/usr/src/tools/ctf/dwarf/common/dwarf_frame.h
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
-
- Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of version 2.1 of the GNU Lesser General Public License
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it would be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
- Further, this software is distributed without any warranty that it is
- free of the rightful claim of any third person regarding infringement
- or the like. Any license provided herein, whether implied or
- otherwise, applies only to this software file. Patent licenses, if
- any, provided herein do not apply to combinations of this program with
- other software, or any other product whatsoever.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, write the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
- USA.
-
- Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
- Mountain View, CA 94043, or:
-
- http://www.sgi.com
-
- For further information regarding this notice, see:
-
- http://oss.sgi.com/projects/GenInfo/NoticeExplan
-
-*/
-
-
-
-/* The dwarf 2.0 standard dictates that only the following
- * fields can be read when an unexpected augmentation string
- * (in the cie) is encountered: CIE length, CIE_id, version and
- * augmentation; FDE: length, CIE pointer, initial location and
- * address range. Unfortunately, with the above restrictions, it
- * is impossible to read the instruction table from a CIE or a FDE
- * when a new augmentation string is encountered.
- * To fix this problem, the following layout is used, if the
- * augmentation string starts with the string "z".
- * CIE FDE
- * length length
- * CIE_id CIE_pointer
- * version initial_location
- * augmentation address_range
- * length_of_augmented_fields (*NEW*)
- * code_alignment_factor Any new fields as necessary
- * data_alignment_factor instruction_table
- * return_address
- * length_of_augmented fields
- * Any new fields as necessary
- * initial_instructions
- *
- * The type of all the old data items are the same as what is
- * described in dwarf 2.0 standard. The length_of_augmented_fields
- * is an LEB128 data item that denotes the size (in bytes) of
- * the augmented fields (not including the size of
- * "length_of_augmented_fields" itself).
-
- * Handling of cie augmentation strings is necessarly a heuristic.
- * See dwarf_frame.c for the currently known augmentation strings.
-
-
- ---START SGI-ONLY COMMENT:
- * SGI-IRIX versions of cie or fde were intended to use "z1", "z2" as the
- * augmenter strings if required for new augmentation.
- * However, that never happened (as of March 2005).
- *
- * The fde's augmented by the string "z" have a new field
- * (signed constant, 4 byte field)
- * called offset_into_exception_tables, following the
- * length_of_augmented field. This field contains an offset
- * into the "_MIPS_eh_region", which describes
- * the IRIX CC exception handling tables.
- ---END SGI-ONLY COMMENT
-
-
- * GNU .eh_frame has an augmentation string of z[RLP]* (gcc 3.4)
- * The similarity to IRIX 'z' (and proposed but never
- * implemented IRIX z1, z2 etc) was confusing things.
- * If the section is .eh_frame then 'z' means GNU exception
- * information 'Augmentation Data' not IRIX 'z'.
- * See The Linux Standard Base Core Specification version 3.0
- */
-
-#define DW_DEBUG_FRAME_VERSION 1 /* DWARF2 */
-#define DW_DEBUG_FRAME_VERSION3 3 /* DWARF3 */
-#define DW_DEBUG_FRAME_VERSION4 4 /* DWARF4 */
-/* The following is SGI/IRIX specific, and probably no longer
- in use anywhere. */
-#define DW_DEBUG_FRAME_AUGMENTER_STRING "mti v1"
-
-/* The value of the offset field for Cie's. */
-#define DW_CIE_OFFSET ~(0x0)
-
-/* The augmentation string may be NULL. */
-#define DW_EMPTY_STRING ""
-
-#define DW_FRAME_INSTR_OPCODE_SHIFT 6
-#define DW_FRAME_INSTR_OFFSET_MASK 0x3f
-
-/*
- This struct denotes the rule for a register in a row of
- the frame table. In other words, it is one element of
- the table.
-*/
-struct Dwarf_Reg_Rule_s {
-
- /*
- Is a flag indicating whether the rule includes the offset
- field, ie whether the ru_offset field is valid or not.
- Applies only if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET.
- It is important, since reg+offset (offset of 0) is different from
- just 'register' since the former means 'read memory at address
- given by the sum of register contents plus offset to get the
- value'. whereas the latter means 'the value is in the register'.
-
- The 'register' numbers are either real registers (ie, table
- columns defined as real registers) or defined entries that are
- not really hardware registers, such as DW_FRAME_SAME_VAL or
- DW_FRAME_CFA_COL.
-
- */
- Dwarf_Sbyte ru_is_off;
-
- /* DW_EXPR_OFFSET (0, DWARF2)
- DW_EXPR_VAL_OFFSET 1 (dwarf2/3)
- DW_EXPR_EXPRESSION 2 (dwarf2/3)
- DW_EXPR_VAL_EXPRESSION 3 (dwarf2/3)
- See dwarf_frame.h. */
- Dwarf_Sbyte ru_value_type;
-
- /* Register involved in this rule. */
- Dwarf_Half ru_register;
-
- /* Offset to add to register, if indicated by ru_is_offset
- and if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET.
- If DW_EXPR_EXPRESSION or DW_EXPR_VAL_EXPRESSION
- this is DW_FORM_block block-length, not offset. */
- Dwarf_Unsigned ru_offset_or_block_len;
-
- /* For DW_EXPR_EXPRESSION DW_EXPR_VAL_EXPRESSION these is set,
- else 0. */
- Dwarf_Small *ru_block;
-};
-
-typedef struct Dwarf_Frame_s *Dwarf_Frame;
-
-/*
- This structure represents a row of the frame table.
- Fr_loc is the pc value for this row, and Fr_reg
- contains the rule for each column.
-
- Entry DW_FRAME_CFA_COL of fr_reg was the tradional MIPS
- way of setting CFA. cfa_rule is the new one.
-*/
-struct Dwarf_Frame_s {
-
- /* Pc value corresponding to this row of the frame table. */
- Dwarf_Addr fr_loc;
-
- /* Rules for all the registers in this row. */
- struct Dwarf_Reg_Rule_s fr_cfa_rule;
-
- /* fr_reg_count is the the number of
- entries of the fr_reg array. */
- unsigned long fr_reg_count;
- struct Dwarf_Reg_Rule_s *fr_reg;
-
- Dwarf_Frame fr_next;
-};
-
-typedef struct Dwarf_Frame_Op_List_s *Dwarf_Frame_Op_List;
-
-/* This is used to chain together Dwarf_Frame_Op structures. */
-struct Dwarf_Frame_Op_List_s {
- Dwarf_Frame_Op *fl_frame_instr;
- Dwarf_Frame_Op_List fl_next;
-};
-
-/* See dwarf_frame.c for the heuristics used to set the
- Dwarf_Cie ci_augmentation_type.
-
- This succinctly helps interpret the size and meaning of .debug_frame
- and (for gcc) .eh_frame.
-
- In the case of gcc .eh_frame (gcc 3.3, 3.4)
- z may be followed by one or more of
- L R P.
-
-*/
-enum Dwarf_augmentation_type {
- aug_empty_string, /* Default empty augmentation string. */
- aug_irix_exception_table, /* IRIX plain "z",
- for exception handling, IRIX CC compiler.
- Proposed z1 z2 ... never implemented. */
- aug_gcc_eh_z, /* gcc z augmentation, (including
- L R P variations). gcc 3.3 3.4 exception
- handling in eh_frame. */
- aug_irix_mti_v1, /* IRIX "mti v1" augmentation string. Probably
- never in any released SGI-IRIX compiler. */
- aug_eh, /* For gcc .eh_frame, "eh" is the string.,
- gcc 1,2, egcs. Older values. */
- aug_armcc, /* "armcc+" meaning the cfa calculation
- is corrected to be standard (output by
- Arm C RVCT 3.0 SP1 and later). See
- http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html
- for details. */
- aug_unknown, /* Unknown augmentation, we cannot do much. */
- aug_past_last
-};
-
-
-/*
- This structure contains all the pertinent info for a Cie. Most
- of the fields are taken straight from the definition of a Cie.
- Ci_cie_start points to the address (in .debug_frame) where this
- Cie begins. Ci_cie_instr_start points to the first byte of the
- frame instructions for this Cie. Ci_dbg points to the associated
- Dwarf_Debug structure. Ci_initial_table is a pointer to the table
- row generated by the instructions for this Cie.
-*/
-struct Dwarf_Cie_s {
- Dwarf_Unsigned ci_length;
- char *ci_augmentation;
- Dwarf_Small ci_code_alignment_factor;
- Dwarf_Sbyte ci_data_alignment_factor;
- Dwarf_Small ci_return_address_register;
- Dwarf_Small *ci_cie_start;
- Dwarf_Small *ci_cie_instr_start;
- Dwarf_Debug ci_dbg;
- Dwarf_Frame ci_initial_table;
- Dwarf_Cie ci_next;
- Dwarf_Small ci_length_size;
- Dwarf_Small ci_extension_size;
- Dwarf_Half ci_cie_version_number;
- enum Dwarf_augmentation_type ci_augmentation_type;
-
- /* The following 2 for GNU .eh_frame exception handling
- Augmentation Data. Set if ci_augmentation_type
- is aug_gcc_eh_z. Zero if unused. */
- Dwarf_Unsigned ci_gnu_eh_augmentation_len;
- Dwarf_Ptr ci_gnu_eh_augmentation_bytes;
-
- /* These are extracted from the gnu eh_frame
- augmentation if the
- augmentation begins with 'z'. See Linux LSB documents.
- Otherwize these are zero. */
- unsigned char ci_gnu_personality_handler_encoding;
- unsigned char ci_gnu_lsda_encoding;
- unsigned char ci_gnu_fde_begin_encoding;
-
- /* If 'P' augmentation present, is handler addr. Else
- is zero. */
- Dwarf_Addr ci_gnu_personality_handler_addr;
-
-
- /* In creating list of cie's (which will become an array)
- record the position so fde can get it on fde creation. */
- Dwarf_Unsigned ci_index;
- Dwarf_Small * ci_section_ptr;
- /* DWARF4 adds address size and segment size to the CIE: the .debug_info
- section may not always be present to allow libdwarf to
- find address_size from the compilation-unit. */
- Dwarf_Half ci_address_size;
- Dwarf_Half ci_segment_size;
-
-};
-
-/*
- This structure contains all the pertinent info for a Fde.
- Most of the fields are taken straight from the definition.
- fd_cie_index is the index of the Cie associated with this
- Fde in the list of Cie's for this debug_frame. Fd_cie
- points to the corresponsing Dwarf_Cie structure. Fd_fde_start
- points to the start address of the Fde. Fd_fde_instr_start
- points to the start of the instructions for this Fde. Fd_dbg
- points to the associated Dwarf_Debug structure.
-*/
-struct Dwarf_Fde_s {
- Dwarf_Unsigned fd_length;
- Dwarf_Addr fd_cie_offset;
- Dwarf_Unsigned fd_cie_index;
- Dwarf_Cie fd_cie;
- Dwarf_Addr fd_initial_location;
- Dwarf_Small *fd_initial_loc_pos;
- Dwarf_Addr fd_address_range;
- Dwarf_Small *fd_fde_start;
- Dwarf_Small *fd_fde_instr_start;
- Dwarf_Debug fd_dbg;
-
- /* fd_offset_into_exception_tables is SGI/IRIX exception table
- offset. Unused and zero if not IRIX .debug_frame. */
- Dwarf_Signed fd_offset_into_exception_tables;
-
- Dwarf_Fde fd_next;
- Dwarf_Small fd_length_size;
- Dwarf_Small fd_extension_size;
- /* So we know from an fde which 'count' of fde-s in
- Dwarf_Debug applies: eh or standard. */
- Dwarf_Small fd_is_eh;
- /* The following 2 for GNU .eh_frame exception handling
- Augmentation Data. Set if CIE ci_augmentation_type
- is aug_gcc_eh_z. Zero if unused. */
- Dwarf_Unsigned fd_gnu_eh_augmentation_len;
- Dwarf_Ptr fd_gnu_eh_augmentation_bytes;
- Dwarf_Addr fd_gnu_eh_lsda; /* If 'L' augmentation letter
- present: is address of the
- Language Specific Data Area (LSDA). If not 'L" is zero. */
-
- /* The following 3 are about the Elf section the FDEs come from. */
- Dwarf_Small * fd_section_ptr;
- Dwarf_Unsigned fd_section_length;
- Dwarf_Unsigned fd_section_index;
-
-};
-
-
-int
- _dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist,
- Dwarf_Off ** offsetlist,
- Dwarf_Signed * returncount,
- Dwarf_Error * err);
-
-int
-_dwarf_get_fde_list_internal(Dwarf_Debug dbg,
- Dwarf_Cie ** cie_data,
- Dwarf_Signed * cie_element_count,
- Dwarf_Fde ** fde_data,
- Dwarf_Signed * fde_element_count,
- Dwarf_Small * section_ptr,
- Dwarf_Unsigned section_index,
- Dwarf_Unsigned section_length,
- Dwarf_Unsigned cie_id_value,
- int use_gnu_cie_calc, /* If non-zero,
- this is gcc eh_frame. */
- Dwarf_Error * error);
-
-enum Dwarf_augmentation_type
-_dwarf_get_augmentation_type(Dwarf_Debug dbg,
- Dwarf_Small *augmentation_string,
- int is_gcc_eh_frame);
-
-Dwarf_Unsigned _dwarf_get_return_address_reg(Dwarf_Small *frame_ptr,
- int version,
- unsigned long *size);
-
-/* Temporary recording of crucial cie/fde prefix data.
- * Vastly simplifies some argument lists.
- */
-struct cie_fde_prefix_s {
- /* cf_start_addr is a pointer to the first byte of this fde/cie
- we are reading now. */
- Dwarf_Small * cf_start_addr;
- Dwarf_Small * cf_addr_after_prefix;
- Dwarf_Unsigned cf_length;
- int cf_local_length_size;
- int cf_local_extension_size;
- Dwarf_Unsigned cf_cie_id;
- Dwarf_Small * cf_cie_id_addr; /* used for eh_frame calculations. */
-
- /* Simplifies passing around these values to create fde having
- these here. */
- /* cf_section_ptr is a pointer to the first byte
- of the object section the prefix is read from. */
- Dwarf_Small * cf_section_ptr;
- Dwarf_Unsigned cf_section_index;
- Dwarf_Unsigned cf_section_length;
-};
-
-int
-_dwarf_exec_frame_instr(Dwarf_Bool make_instr,
- Dwarf_Frame_Op ** ret_frame_instr,
- Dwarf_Bool search_pc,
- Dwarf_Addr search_pc_val,
- Dwarf_Addr initial_loc,
- Dwarf_Small * start_instr_ptr,
- Dwarf_Small * final_instr_ptr,
- Dwarf_Frame table,
- Dwarf_Cie cie,
- Dwarf_Debug dbg,
- Dwarf_Half reg_num_of_cfa,
- Dwarf_Sword * returned_count,
- int *returned_error);
-
-
-int dwarf_read_cie_fde_prefix(Dwarf_Debug dbg,
- Dwarf_Small *frame_ptr_in,
- Dwarf_Small *section_ptr_in,
- Dwarf_Unsigned section_index_in,
- Dwarf_Unsigned section_length_in,
- struct cie_fde_prefix_s *prefix_out,
- Dwarf_Error *error);
-
-int dwarf_create_fde_from_after_start(Dwarf_Debug dbg,
- struct cie_fde_prefix_s * prefix,
- Dwarf_Small *section_pointer,
- Dwarf_Small *frame_ptr,
- int use_gnu_cie_calc,
- Dwarf_Cie cie_ptr_in,
- Dwarf_Fde *fde_ptr_out,
- Dwarf_Error *error);
-
-int dwarf_create_cie_from_after_start(Dwarf_Debug dbg,
- struct cie_fde_prefix_s *prefix,
- Dwarf_Small* section_pointer,
- Dwarf_Small* frame_ptr,
- Dwarf_Unsigned cie_count,
- int use_gnu_cie_calc,
- Dwarf_Cie *cie_ptr_out,
- Dwarf_Error *error);
-
-
-int _dwarf_frame_constructor(Dwarf_Debug dbg,void * );
-void _dwarf_frame_destructor (void *);