diff options
Diffstat (limited to 'usr/src/tools/ctf/dwarf/common/dwarf_line.h')
-rw-r--r-- | usr/src/tools/ctf/dwarf/common/dwarf_line.h | 331 |
1 files changed, 0 insertions, 331 deletions
diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_line.h b/usr/src/tools/ctf/dwarf/common/dwarf_line.h deleted file mode 100644 index 66d6062754..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_line.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - - Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. 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 - -*/ - - - -#define DW_EXTENDED_OPCODE 0 - -/* - This is used as the starting value for an algorithm - to get the minimum difference between 2 values. - UINT_MAX is used as our approximation to infinity. -*/ -#define MAX_LINE_DIFF UINT_MAX - -/* This is for a sanity check on line - table extended opcodes. - It is entirely arbitrary, and 100 is surely too small if - someone was inserting strings in the opcode. */ -#define DW_LNE_LEN_MAX 100 - - -/* - This structure is used to build a list of all the - files that are used in the current compilation unit. - All of the fields execpt fi_next have meanings that - are obvious from section 6.2.4 of the Libdwarf Doc. -*/ -struct Dwarf_File_Entry_s { - /* Points to string naming the file. */ - Dwarf_Small *fi_file_name; - - /* - Index into the list of directories of the directory in which - this file exits. */ - Dwarf_Sword fi_dir_index; - - /* Time of last modification of the file. */ - Dwarf_Unsigned fi_time_last_mod; - - /* Length in bytes of the file. */ - Dwarf_Unsigned fi_file_length; - - /* Pointer for chaining file entries. */ - Dwarf_File_Entry fi_next; -}; - - -typedef struct Dwarf_Line_Context_s *Dwarf_Line_Context; - -/* - This structure provides the context in which the fields of - a Dwarf_Line structure are interpreted. They come from the - statement program prologue. **Updated by dwarf_srclines in - dwarf_line.c. -*/ -struct Dwarf_Line_Context_s { - /* - Points to a chain of entries providing info about source files - for the current set of Dwarf_Line structures. File number - 'li_file 1' is last on the list, the first list entry is the - file numbered lc_file_entry_count. The numbering of the file - names matches the dwarf2/3 line table specification file table - and DW_LNE_define_file numbering rules. */ - Dwarf_File_Entry lc_file_entries; - /* - Count of number of source files for this set of Dwarf_Line - structures. */ - Dwarf_Sword lc_file_entry_count; - /* - Points to the portion of .debug_line section that contains a - list of strings naming the included directories. */ - Dwarf_Small *lc_include_directories; - - /* Count of the number of included directories. */ - Dwarf_Sword lc_include_directories_count; - - /* Count of the number of lines for this cu. */ - Dwarf_Sword lc_line_count; - - /* Points to name of compilation directory. */ - Dwarf_Small *lc_compilation_directory; - - Dwarf_Debug lc_dbg; - - Dwarf_Half lc_version_number; /* DWARF2/3 version number, 2 - for DWARF2, 3 for DWARF3. */ -}; - - -/* - This structure defines a row of the line table. - All of the fields except li_offset have the exact - same meaning that is defined in Section 6.2.2 - of the Libdwarf Document. - - li_offset is used by _dwarf_addr_finder() which is called - by rqs(1), an sgi utility for 'moving' shared libraries - as if the static linker (ld) had linked the shared library - at the newly-specified address. Most libdwarf-using - apps will ignore li_offset and _dwarf_addr_finder(). - -*/ -struct Dwarf_Line_s { - Dwarf_Addr li_address; /* pc value of machine instr */ - union addr_or_line_s { - struct li_inner_s { - Dwarf_Sword li_file; /* int identifying src file */ - /* li_file is a number 1-N, indexing into a conceptual - source file table as described in dwarf2/3 spec line - table doc. (see Dwarf_File_Entry lc_file_entries; and - Dwarf_Sword lc_file_entry_count;) */ - - Dwarf_Sword li_line; /* source file line number. */ - Dwarf_Half li_column; /* source file column number */ - Dwarf_Small li_isa; - - /* To save space, use bit flags. */ - /* indicate start of stmt */ - unsigned char li_is_stmt:1; - - /* indicate start basic block */ - unsigned char li_basic_block:1; - - /* first post sequence instr */ - unsigned char li_end_sequence:1; - - unsigned char li_prologue_end:1; - unsigned char li_epilogue_begin:1; - } li_l_data; - Dwarf_Off li_offset; /* for rqs */ - } li_addr_line; - Dwarf_Line_Context li_context; /* assoc Dwarf_Line_Context_s */ -}; - - -int _dwarf_line_address_offsets(Dwarf_Debug dbg, - Dwarf_Die die, - Dwarf_Addr ** addrs, - Dwarf_Off ** offs, - Dwarf_Unsigned * returncount, - Dwarf_Error * err); -int _dwarf_internal_srclines(Dwarf_Die die, - Dwarf_Line ** linebuf, - Dwarf_Signed * count, - Dwarf_Bool doaddrs, - Dwarf_Bool dolines, Dwarf_Error * error); - - - -/* The LOP, WHAT_IS_OPCODE stuff is here so it can - be reused in 3 places. Seemed hard to keep - the 3 places the same without an inline func or - a macro. - - Handling the line section where the header and the - file being processed do not match (unusual, but - planned for in the design of .debug_line) - is too tricky to recode this several times and keep - it right. - - As it is the code starting up line-reading is duplicated - and that is just wrong to do. FIXME! -*/ -#define LOP_EXTENDED 1 -#define LOP_DISCARD 2 -#define LOP_STANDARD 3 -#define LOP_SPECIAL 4 - -#define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \ - if( (opcode) < (base) ) { \ - /* we know we must treat as a standard op \ - or a special case. \ - */ \ - if((opcode) == DW_EXTENDED_OPCODE) { \ - type = LOP_EXTENDED; \ - } else if( ((highest_std)+1) >= (base)) { \ - /* == Standard case: compile of \ - dwarf_line.c and object \ - have same standard op codes set. \ - \ - > Special case: compile of dwarf_line.c\ - has things in standard op codes list \ - in dwarf.h header not \ - in the object: handle this as a standard\ - op code in switch below. \ - The header special ops overlap the \ - object standard ops. \ - The new standard op codes will not \ - appear in the object. \ - */ \ - type = LOP_STANDARD; \ - } else { \ - /* These are standard opcodes in the object\ - ** that were not defined in the header \ - ** at the time dwarf_line.c \ - ** was compiled. Provides the ability of \ - ** out-of-date dwarf reader to read newer \ - ** line table data transparently. \ - */ \ - type = LOP_DISCARD; \ - } \ - \ - } else { \ - /* Is a special op code. \ - */ \ - type = LOP_SPECIAL; \ - } - -/* The following is from the dwarf definition of 'ubyte' - and is specifically mentioned in section 6.2.5.1, page 54 - of the Rev 2.0.0 dwarf specification. -*/ - -#define MAX_LINE_OP_CODE 255 - - -/* The following structs (Line_Table_File_Entry_s,Line_Table_Prefix_s) - and functions allow refactoring common code into a single - reader routine. -*/ -/* There can be zero of more of these needed for 1 line prologue. */ -struct Line_Table_File_Entry_s { - Dwarf_Small *lte_filename; - Dwarf_Unsigned lte_directory_index; - Dwarf_Unsigned lte_last_modification_time; - Dwarf_Unsigned lte_length_of_file; -}; - -/* Data picked up from the line table prologue for a single -CU. */ -struct Line_Table_Prefix_s { - - /* pf_total_length is the value of the length field for the line - table of this CU. So it does not count the length of itself (the - length value) for consistency with the say lenghts recorded in - DWARF2/3. */ - Dwarf_Unsigned pf_total_length; - - /* Length of the initial length field itself. */ - Dwarf_Half pf_length_field_length; - - /* The version is 2 for DWARF2, 3 for DWARF3 */ - Dwarf_Half pf_version; - - Dwarf_Unsigned pf_prologue_length; - Dwarf_Small pf_minimum_instruction_length; - - /* Start and end of this CU line area. pf_line_ptr_start + - pf_total_length + pf_length_field_length == pf_line_ptr_end. - Meaning pf_line_ptr_start is before the length info. */ - Dwarf_Small *pf_line_ptr_start; - Dwarf_Small *pf_line_ptr_end; - - /* Used to check that decoding of the line prologue is done right. */ - Dwarf_Small *pf_line_prologue_start; - - Dwarf_Small pf_default_is_stmt; - Dwarf_Sbyte pf_line_base; - Dwarf_Small pf_line_range; - - /* Highest std opcode (+1). */ - Dwarf_Small pf_opcode_base; - - /* pf_opcode_base -1 entries (each a count, normally the value of - each entry is 0 or 1). */ - Dwarf_Small *pf_opcode_length_table; - - Dwarf_Unsigned pf_include_directories_count; - /* Array of pointers to dir strings. pf_include_directories_count - entriesin the array. */ - Dwarf_Small **pf_include_directories; - - /* Count of entries in line_table_file_entries array. */ - Dwarf_Unsigned pf_files_count; - struct Line_Table_File_Entry_s *pf_line_table_file_entries; - - /* The number to treat as standard ops. This is a special - accomodation of gcc using the new standard opcodes but not - updating the version number. It's legal dwarf2, but much better - for the user to understand as dwarf3 when 'it looks ok'. */ - Dwarf_Bool pf_std_op_count; - -}; - -void dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf); -void dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf); - -int dwarf_read_line_table_prefix(Dwarf_Debug dbg, - Dwarf_Small * data_start, - Dwarf_Unsigned data_length, - Dwarf_Small ** updated_data_start_out, - struct Line_Table_Prefix_s *prefix_out, - /* The following 2 arguments are solely for warning users - * when there is a surprising 'gap' in the .debug_line info. */ - Dwarf_Small ** bogus_bytes_ptr, - Dwarf_Unsigned * bogus_bytes_count, - Dwarf_Error * err, - int * err_count_out); |