diff options
Diffstat (limited to 'dwarfdump2/globals.h')
-rw-r--r-- | dwarfdump2/globals.h | 587 |
1 files changed, 587 insertions, 0 deletions
diff --git a/dwarfdump2/globals.h b/dwarfdump2/globals.h new file mode 100644 index 0000000..11aa961 --- /dev/null +++ b/dwarfdump2/globals.h @@ -0,0 +1,587 @@ +/* + Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2007-2011 David Anderson. All Rights Reserved. + Portions Copyright (C) 2011 SN Systems Ltd. All Rights Reserved. + + This program is free software; you can redistribute it and/or modify it + under the terms of version 2 of the GNU 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 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 + + + +$Header: /plroot/cmplrs.src/v7.4.5m/.RCS/PL/dwarfdump/RCS/globals.h,v 1.25 2006/04/17 00:09:56 davea Exp $ */ + +#ifndef globals_INCLUDED +#define globals_INCLUDED + +#include "config.h" +#if (!defined(HAVE_RAW_LIBELF_OK) && defined(HAVE_LIBELF_OFF64_OK) ) +/* At a certain point libelf.h requires _GNU_SOURCE. + here we assume the criteria in configure determine that + usefully. +*/ +#define _GNU_SOURCE 1 +#endif + + +/* We want __uint32_t and __uint64_t and __int32_t __int64_t + properly defined but not duplicated, since duplicate typedefs + are not legal C. +*/ +/* + HAVE___UINT32_T + HAVE___UINT64_T will be set by configure if + our 4 types are predefined in compiler +*/ + + +#if (!defined(HAVE___UINT32_T)) && defined(HAVE_SGIDEFS_H) +#include <sgidefs.h> /* sgidefs.h defines them */ +#define HAVE___UINT32_T 1 +#define HAVE___UINT64_T 1 +#endif + + + +#if (!defined(HAVE___UINT32_T)) && defined(HAVE_SYS_TYPES_H) && defined(HAVE___UINT32_T_IN_SYS_TYPES_H) +# include <sys/types.h> +/* We assume __[u]int32_t and __[u]int64_t defined + since __uint32_t defined in the sys/types.h in use */ +#define HAVE___UINT32_T 1 +#define HAVE___UINT64_T 1 +#endif + +#ifndef HAVE___UINT32_T +typedef int __int32_t; +typedef unsigned __uint32_t; +#define HAVE___UINT32_T 1 +#endif +#ifndef HAVE___UINT64_T +typedef long long __int64_t; +typedef unsigned long long __uint64_t; +#define HAVE___UINT64_T 1 +#endif + + +#include <stdio.h> +#include <stdlib.h> +#include <string> +#include <iostream> +#include <sstream> // For IToDec +#include <iomanip> // For setw +#include <list> +#include <map> +#include <set> +#include <string.h> +#ifdef HAVE_ELF_H +#include <elf.h> +#endif +#ifdef HAVE_LIBELF_H +#include <libelf.h> +#else +#ifdef HAVE_LIBELF_LIBELF_H +#include <libelf/libelf.h> +#endif +#endif +#include <dwarf.h> +#include <libdwarf.h> +#ifdef HAVE_REGEX +#include <regex.h> +#endif + +#ifndef FAILED +#define FAILED 1 +#endif + +#include "dieholder.h" +#include "srcfilesholder.h" +#include "checkutil.h" + +struct Dwarf_Check_Result { + Dwarf_Check_Result ():checks_(0),errors_(0) {}; + ~Dwarf_Check_Result() {}; + int checks_; + int errors_; +}; + +extern bool search_is_on; +extern std::string search_any_text; +extern std::string search_match_text; +extern std::string search_regex_text; +#ifdef HAVE_REGEX +extern regex_t search_re; +#endif +extern bool is_strstrnocase(const char * container, const char * contained); + + +extern bool do_check_dwarf; +extern bool do_print_dwarf; +extern bool record_dwarf_error; /* A test has failed, this + is normally set FALSE shortly after being set TRUE, it is + a short-range hint we should print something we might not + otherwise print (under the circumstances). */ + +// Compilation Unit information for improved error messages. +struct Error_Message_Data { + Error_Message_Data(): + seen_PU(false), + seen_CU(false), + need_CU_name(false), + need_CU_base_address(false), + need_CU_high_address(false), + need_PU_valid_code(false), + seen_PU_base_address(false), + seen_PU_high_address(false), + PU_base_address(0), + PU_high_address(0), + DIE_offset(0), + DIE_overall_offset(0), + DIE_CU_offset(0), + DIE_CU_overall_offset(0), + current_section_id(0), + CU_base_address(0), + CU_high_address(0), + elf_max_address(0), + elf_address_size(0) + {}; + ~Error_Message_Data() {}; + std::string PU_name; + std::string CU_name; + std::string CU_producer; + bool seen_PU; // Detected a PU. + bool seen_CU; // Detected a CU. + bool need_CU_name; + bool need_CU_base_address; // Need CU Base address. + bool need_CU_high_address; // Need CU High address. + bool need_PU_valid_code; // Need PU valid code. + + bool seen_PU_base_address; // Detected a Base address for PU + bool seen_PU_high_address; // Detected a High address for PU + Dwarf_Addr PU_base_address;// PU Base address + Dwarf_Addr PU_high_address;// PU High address + + Dwarf_Off DIE_offset; // DIE offset in compile unit. + Dwarf_Off DIE_overall_offset; // DIE offset in .debug_info. + + Dwarf_Off DIE_CU_offset; // CU DIE offset in compile unit + Dwarf_Off DIE_CU_overall_offset; // CU DIE offset in .debug_info + int current_section_id; // Section being process. + + Dwarf_Addr CU_base_address;// CU Base address. + Dwarf_Addr CU_high_address;// CU High address. + + Dwarf_Addr elf_max_address;// Largest representable address offset. + Dwarf_Half elf_address_size;// Target pointer size. +}; +extern struct Error_Message_Data error_message_data; + +// Display parent/children when in wide format. +extern bool display_parent_tree; +extern bool display_children_tree; +extern int stop_indent_level; + +// Print search results when in wide format. +extern bool search_wide_format; +extern bool search_is_on; + +extern std::string search_any_text; +extern std::string search_match_text; +extern std::string search_regex_text; +#ifdef HAVE_REGEX +extern regex_t search_re; +#endif +extern bool is_strstrnocase(const char *data, const char *pattern); + +// Options to enable debug tracing. +#define MAX_TRACE_LEVEL 10 +extern int nTrace[MAX_TRACE_LEVEL + 1]; +#define DUMP_RANGES_INFO 1 // Dump RangesInfo Table. +#define DUMP_LOCATION_SECTION_INFO 2 // Dump Location (.debug_loc) Info. +#define DUMP_RANGES_SECTION_INFO 3 // Dump Ranges (.debug_ranges) Info. +#define DUMP_LINKONCE_INFO 4 // Dump Linkonce Table. +#define DUMP_VISITED_INFO 5 // Dump Visited Info. + +#define dump_ranges_info nTrace[DUMP_RANGES_INFO] +#define dump_location_section_info nTrace[DUMP_LOCATION_SECTION_INFO] +#define dump_ranges_section_info nTrace[DUMP_RANGES_SECTION_INFO] +#define dump_linkonce_info nTrace[DUMP_LINKONCE_INFO] +#define dump_visited_info nTrace[DUMP_VISITED_INFO] + +/* Section IDs */ +#define DEBUG_ABBREV 1 +#define DEBUG_ARANGES 2 +#define DEBUG_FRAME 3 +#define DEBUG_INFO 4 +#define DEBUG_LINE 5 +#define DEBUG_LOC 6 +#define DEBUG_MACINFO 7 +#define DEBUG_PUBNAMES 8 +#define DEBUG_RANGES 9 +#define DEBUG_STATIC_VARS 10 +#define DEBUG_STATIC_FUNC 11 +#define DEBUG_STR 12 +#define DEBUG_WEAKNAMES 13 +#define DEBUG_TYPES 14 + +extern int verbose; +extern bool dense; +extern bool ellipsis; +extern bool use_mips_regnames; +extern bool show_global_offsets; +extern bool show_form_used; +extern bool display_offsets; + +extern bool check_pubname_attr; +extern bool check_attr_tag; +extern bool check_tag_tree; +extern bool check_type_offset; +extern bool check_decl_file; +extern bool check_lines; +extern bool check_ranges; +extern bool check_fdes; +extern bool check_aranges; +extern bool check_harmless; +extern bool check_abbreviations; +extern bool check_dwarf_constants; +extern bool check_di_gaps; +extern bool check_forward_decl; +extern bool check_self_references; +extern bool suppress_nested_name_search; +extern bool suppress_check_extensions_tables; + +extern int break_after_n_units; + +extern bool check_names; // Check for invalid names. +extern bool check_verbose_mode; // During '-k' mode, display errors. +extern bool check_frames; // Frames check. +extern bool check_frames_extended;// Extensive frames check. +extern bool check_locations; // Location list check. + + +// Check categories corresponding to the -k option +enum Dwarf_Check_Categories{ // Dwarf_Check_Categories + abbrev_code_result, // 0 + pubname_attr_result, + reloc_offset_result, + attr_tag_result, + tag_tree_result, + type_offset_result, // 5 + decl_file_result, + ranges_result, + lines_result, //8 + aranges_result, + // Harmless errors are errors detected inside libdwarf but + // not reported via DW_DLE_ERROR returns because the errors + // won't really affect client code. The 'harmless' errors + // are reported and otherwise ignored. It is difficult to report + // the error when the error is noticed by libdwarf, the error + // is reported at a later time. + // The other errors dwarfdump reports are also generally harmless + // but are detected by dwarfdump so it's possble to report the + // error as soon as the error is discovered. + harmless_result, //10 + fde_duplication, + frames_result, + locations_result, + names_result, + abbreviations_result, // 15 + dwarf_constants_result, + di_gaps_result, + forward_decl_result, + self_references_result, + total_check_result, //20 + LAST_CATEGORY // Must be last. +} ; + + +extern bool info_flag; +extern bool line_flag; +extern bool use_old_dwarf_loclist; +extern bool producer_children_flag; // List of CUs per compiler + +extern std::string cu_name; +extern bool cu_name_flag; +extern Dwarf_Unsigned cu_offset; +extern Dwarf_Off fde_offset_for_cu_low; +extern Dwarf_Off fde_offset_for_cu_high; + +/* Process TAGs for checking mode and reset pRangesInfo table + if appropriate. */ +extern void tag_specific_checks_setup(Dwarf_Half val,int die_indent_level); + +extern std::string program_name; +extern Dwarf_Error err; + +extern void print_error_and_continue (Dwarf_Debug dbg, const std::string& msg,int res, Dwarf_Error err); +extern void print_error (Dwarf_Debug dbg, const std::string& msg,int res, Dwarf_Error err); + +// The dwarf_names_print_on_error is so other apps (tag_tree.cc) +// can use the generated code in dwarf_names.cc (etc) easily. +// It is not ever set false in dwarfdump. +extern bool dwarf_names_print_on_error; + +extern void print_line_numbers_this_cu (DieHolder &hdie); +struct dwconf_s; +extern void print_frames (Dwarf_Debug dbg, int print_debug_frame, + int print_eh_frame,struct dwconf_s *); +extern void print_ranges (Dwarf_Debug dbg); +extern void print_pubnames (Dwarf_Debug dbg); +extern void print_macinfo (Dwarf_Debug dbg); +extern void print_infos (Dwarf_Debug dbg,bool is_info); +extern void print_locs (Dwarf_Debug dbg); +extern void print_abbrevs (Dwarf_Debug dbg); +extern void print_strings (Dwarf_Debug dbg); +extern void print_aranges (Dwarf_Debug dbg); +extern void print_relocinfo (Dwarf_Debug dbg, unsigned reloc_map); +extern void print_static_funcs(Dwarf_Debug dbg); +extern void print_static_vars(Dwarf_Debug dbg); +enum type_type_e {SGI_TYPENAME, DWARF_PUBTYPES} ; +extern void print_types(Dwarf_Debug dbg,enum type_type_e type_type); +extern void print_weaknames(Dwarf_Debug dbg); +extern void print_exception_tables(Dwarf_Debug dbg); +struct esb_s; +extern std::string print_ranges_list_to_extra(Dwarf_Debug dbg, + Dwarf_Unsigned off, + Dwarf_Ranges *rangeset, + Dwarf_Signed rangecount, + Dwarf_Unsigned bytecount); +extern bool should_skip_this_cu(DieHolder &cu_die, Dwarf_Error err); + +int get_cu_name(DieHolder &hcu_die, + Dwarf_Error err,std::string &short_name_out,std::string &long_name_out); +int get_producer_name(DieHolder &hcu_die, + Dwarf_Error err,std::string &producer_name_out); + +/* Get number of abbreviations for a CU */ +extern void get_abbrev_array_info(Dwarf_Debug dbg,Dwarf_Unsigned offset); +/* Validate an abbreviation */ +extern void validate_abbrev_code(Dwarf_Debug dbg,Dwarf_Unsigned abbrev_code); + +extern void print_die_and_children( + DieHolder &in_die, + Dwarf_Bool is_info, + SrcfilesHolder &srcfiles); +extern bool print_one_die( + DieHolder &hdie_in, + bool print_information, + int indent_level, + SrcfilesHolder &srcfiles, + bool ignore_die_printed_flag); + +// Check for specific compiler. +extern bool checking_this_compiler(); +extern void update_compiler_target(const std::string & producer_name); +extern void add_cu_name_compiler_target(const std::string &name); + + +/* General error reporting routines. These were + macros for a short time and when changed into functions + they kept (for now) their capitalization. + The capitalization will likely change. */ +extern void PRINT_CU_INFO(); +extern void DWARF_CHECK_COUNT(Dwarf_Check_Categories category, int inc); +extern void DWARF_ERROR_COUNT(Dwarf_Check_Categories category, int inc); +extern void DWARF_CHECK_ERROR_PRINT_CU(); +extern void DWARF_CHECK_ERROR(Dwarf_Check_Categories category, + const std::string &str); +extern void DWARF_CHECK_ERROR2(Dwarf_Check_Categories category, + const std::string &str1, + const std::string &str2); +extern void DWARF_CHECK_ERROR3(Dwarf_Check_Categories category, + const std::string & str1, + const std::string & str2, + const std::string & strexpl); + + +extern void printreg(Dwarf_Signed reg,struct dwconf_s *config_data); +extern void print_frame_inst_bytes(Dwarf_Debug dbg, + Dwarf_Ptr cie_init_inst, Dwarf_Signed len, + Dwarf_Signed data_alignment_factor, + int code_alignment_factor, Dwarf_Half addr_size, + struct dwconf_s *config_data); + +bool +get_proc_name(Dwarf_Debug dbg, Dwarf_Die die, + std::string & proc_name, Dwarf_Addr & low_pc_out); + + +void get_attr_value(Dwarf_Debug dbg, Dwarf_Half tag, + Dwarf_Die die, + Dwarf_Attribute attrib, + SrcfilesHolder &srcfiles, + std::string &str_out,bool show_form, + int local_verbose); + + + +extern Dwarf_Unsigned local_dwarf_decode_u_leb128(unsigned char *leb128, + unsigned int *leb128_length); + +extern Dwarf_Signed local_dwarf_decode_s_leb128(unsigned char *leb128, + unsigned int *leb128_length); + +extern void dump_block(const std::string &prefix, char *data, Dwarf_Signed len); + +extern void format_sig8_string(Dwarf_Sig8 *data,std::string &out); + +int +dwarfdump_print_one_locdesc(Dwarf_Debug dbg, + Dwarf_Locdesc * llbuf, + int skip_locdesc_header, + std::string &string_out); +void clean_up_syms_malloc_data(); + +void print_any_harmless_errors(Dwarf_Debug dbg); + +/* Definitions for printing relocations. */ +#define DW_SECTION_REL_DEBUG_INFO 0 +#define DW_SECTION_REL_DEBUG_LINE 1 +#define DW_SECTION_REL_DEBUG_PUBNAMES 2 +#define DW_SECTION_REL_DEBUG_ABBREV 3 +#define DW_SECTION_REL_DEBUG_ARANGES 4 +#define DW_SECTION_REL_DEBUG_FRAME 5 +#define DW_SECTION_REL_DEBUG_LOC 6 +#define DW_SECTION_REL_DEBUG_RANGES 7 +#define DW_SECTION_REL_DEBUG_TYPES 8 + +template <typename T > +std::string IToDec(T v,unsigned l=0) +{ + std::ostringstream s; + if (l > 0) { + s << std::setw(l) << v; + } else { + s << v ; + } + return s.str(); +}; +template <typename T > +std::string IToHex(T v,unsigned l=0) +{ + if(v == 0) { + // For a zero value, above does not insert 0x. + // So we do zeroes here. + std::string out = "0x0"; + if(l > 3) { + out.append(l-3,'0'); + } + return out; + } + std::ostringstream s; + s.setf(std::ios::hex,std::ios::basefield); + s.setf(std::ios::showbase); + if (l > 0) { + s << std::setw(l); + } + s << v ; + return s.str(); +}; + +inline std::string IToHex02(unsigned v) +{ + std::ostringstream s; + // NO showbase here. + s.setf(std::ios::hex,std::ios::basefield); + s << std::setfill('0'); + s << std::setw(2) << (0xff & v); + return s.str(); +} +template <typename T> +std::string IToHex0N(T v,unsigned len=0) +{ + std::ostringstream s; + s.setf(std::ios::hex,std::ios::basefield); + //s.setf(std::ios::showbase); + s << std::setfill('0'); + if(len > 2 ) { + s << std::setw(len-2) << v; + } else { + s << v; + } + return std::string("0x") + s.str(); +} +template <typename T> +std::string IToDec0N(T v,unsigned len=0) +{ + std::ostringstream s; + if (v < 0 && len > 2 ) { + // Special handling for negatives: + // 000-27 is not what we want for example. + s << v; + // ASSERT: s.str().size() >= 1 + if( len > ((s.str().size()))) { + // Ignore the leading - and take the rest. + std::string rest = s.str().substr(1); + std::string::size_type zeroscount = len - (rest.size()+1); + std::string final; + if(zeroscount > 0) { + final.append(zeroscount,'0'); + final.append(rest); + } else { + final = rest; + } + return std::string("-") + final; + } + return s.str(); + } + s << std::setfill('0'); + if(len > 0) { + s << std::setw(len) << v; + } else { + s << v; + } + return s.str(); +} +inline std::string LeftAlign(unsigned minlen,const std::string &s) +{ + if(minlen <= s.size()) { + return s; + } + std::string out = s; + std::string::size_type spaces = minlen - out.size(); + out.append(spaces,' '); + return out; +} + +inline std::string SpaceSurround(const std::string &s) +{ + std::string out(" "); + out.append(s); + out.append(" "); + return out; +}; +inline std::string BracketSurround(const std::string &s) +{ + std::string out("<"); + out.append(s); + out.append(">"); + return out; +}; + + +#endif /* globals_INCLUDED */ + |