| /* Copyright (C) 2021-2023 Free Software Foundation, Inc. |
| Contributed by Oracle. |
| |
| This file is part of GNU Binutils. |
| |
| 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, 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, 51 Franklin Street - Fifth Floor, Boston, |
| MA 02110-1301, USA. */ |
| |
| #ifndef _DWARFLIB_H_ |
| #define _DWARFLIB_H_ |
| |
| #include "dwarf2.h" |
| |
| class ElfReloc; |
| class Dwr_type; |
| class SourceFile; |
| |
| template <class ITEM> class Vector; |
| template <class ITEM> class DbeArray; |
| template <typename Key_t, typename Value_t> class DefaultMap; |
| |
| typedef uint64_t ULEB128; |
| typedef int64_t SLEB128; |
| typedef unsigned short Dwarf_Half; |
| typedef unsigned char Dwarf_Small; |
| typedef uint64_t Dwarf_Off; |
| typedef uint64_t Dwarf_Addr; |
| typedef uint64_t Dwarf_Unsigned; |
| typedef int64_t Dwarf_Die; |
| typedef int32_t Dwarf_Debug; |
| typedef int32_t Dwarf_Attribute; |
| |
| |
| class DwrSec |
| { |
| public: |
| DwrSec (unsigned char *_data, uint64_t _size, bool _need_swap_endian, bool _addr32); |
| DwrSec (DwrSec *secp, uint64_t _offset); |
| ~DwrSec (); |
| unsigned char Get_8 (); |
| unsigned short Get_16 (); |
| uint32_t Get_32 (); |
| uint64_t Get_64 (); |
| uint64_t GetRef (); |
| uint64_t GetADDR (); |
| uint64_t GetADDR_32 (); |
| uint64_t GetADDR_64 (); |
| uint64_t GetLong (); |
| uint64_t ReadLength (); |
| SLEB128 GetSLEB128 (); |
| ULEB128 GetULEB128 (); |
| char *GetString (); |
| char *GetData (uint64_t len); |
| uint32_t Get_24 (); |
| uint64_t get_value (int dw_form); |
| void dump (char *msg); |
| |
| inline uint32_t |
| GetULEB128_32 () |
| { |
| return (uint32_t) GetULEB128 (); |
| } |
| |
| bool |
| inRange (uint64_t left, uint64_t right) |
| { |
| return (offset >= left) && (offset < right); |
| }; |
| |
| ElfReloc *reloc; |
| uint64_t sizeSec; |
| uint64_t size; |
| uint64_t offset; |
| bool fmt64; |
| bool addr32; |
| bool need_swap_endian; |
| int address_size; |
| int segment_selector_size; // DWARF 5 |
| |
| private: |
| bool isCopy; |
| unsigned char *data; |
| bool bounds_violation (uint64_t sz); |
| }; |
| |
| class DwrFileName |
| { |
| public: |
| DwrFileName (char *_fname); |
| ~DwrFileName (); |
| uint64_t timestamp; |
| uint64_t file_size; |
| int dir_index; |
| char *fname; |
| char *path; |
| bool isUsed; |
| }; |
| |
| class DwrLine |
| { |
| public: |
| DwrLine (); |
| ~DwrLine (); |
| uint64_t address; |
| uint32_t file; |
| uint32_t line; |
| uint32_t column; |
| }; |
| |
| class DwrInlinedSubr |
| { |
| public: |
| DwrInlinedSubr (int64_t _abstract_origin, uint64_t _low_pc, uint64_t _high_pc, |
| int _file, int _line, int _level); |
| void dump (); |
| int64_t abstract_origin; |
| uint64_t low_pc; |
| uint64_t high_pc; |
| int file; |
| int line; |
| int level; |
| }; |
| |
| class DwrLineRegs |
| { |
| public: |
| DwrLineRegs (Dwarf *_dwarf, DwrSec *_secp, char *dirName); |
| ~DwrLineRegs (); |
| char *getPath (int fn); |
| Vector<DwrLine *> *get_lines (); |
| void dump (); |
| |
| Vector<DwrFileName *> *file_names; |
| |
| private: |
| void DoExtendedOpcode (); |
| void DoStandardOpcode (int opcode); |
| void DoSpecialOpcode (int opcode); |
| void EmitLine (); |
| void reset (); |
| Vector <DwrFileName *> *read_file_names_dwarf5 (); |
| |
| Dwarf *dwarf; |
| char *fname; |
| uint64_t dir_index; |
| uint64_t timestamp; |
| uint64_t file_size; |
| uint64_t address; |
| int file; |
| int line; |
| int column; |
| Dwarf_Half version; |
| uint64_t op_index_register; |
| Dwarf_Small maximum_operations_per_instruction; |
| Dwarf_Small minimum_instruction_length; |
| Dwarf_Small default_is_stmt; |
| Dwarf_Small line_range; |
| Dwarf_Small opcode_base; |
| signed char line_base; |
| bool is_stmt; |
| bool basic_block; |
| bool end_sequence; |
| Vector<DwrLine *> *lines; |
| Vector<DwrFileName *> *dir_names; |
| Dwarf_Small *standard_opcode_length; |
| DwrSec *debug_lineSec; |
| uint64_t header_length; |
| uint64_t opcode_start; |
| }; |
| |
| typedef struct Dwr_Attr |
| { |
| union |
| { |
| char *str; |
| unsigned char *block; |
| uint64_t offset; |
| int64_t val; |
| } u; |
| uint64_t len; // length of u.str |
| int at_form; |
| int at_name; |
| } Dwr_Attr; |
| |
| typedef struct Dwr_Tag |
| { |
| public: |
| Dwr_Attr *get_attr (Dwarf_Half attr); |
| void dump (); |
| |
| DbeArray<Dwr_Attr> *abbrevAtForm; |
| int64_t die; |
| int64_t offset; |
| int firstAttribute; |
| int lastAttribute; |
| int tag; |
| int hasChild; |
| int num; |
| int level; |
| } Dwr_Tag; |
| |
| enum |
| { |
| DW_DLV_OK, |
| DW_DLV_NO_ENTRY, |
| DW_DLV_ERROR, |
| DW_DLV_BAD_ELF, |
| DW_DLV_NO_DWARF, |
| DW_DLV_WRONG_ARG |
| }; |
| |
| typedef struct DwrLocation |
| { |
| uint64_t offset; |
| uint64_t lc_number; |
| uint64_t lc_number2; |
| uint32_t op; |
| } DwrLocation; |
| |
| typedef struct DwrAbbrevTable |
| { |
| int64_t offset; |
| int firstAtForm; |
| int lastAtForm; |
| int code; |
| int tag; |
| bool hasChild; |
| } DwrAbbrevTable; |
| |
| class Dwarf_cnt |
| { |
| public: |
| Dwarf_cnt (); |
| int64_t cu_offset; |
| int64_t parent; |
| int64_t size; |
| Module *module; |
| char *name; |
| Function *func; |
| Function *fortranMAIN; |
| datatype_t *dtype; |
| DwrInlinedSubr *inlinedSubr; |
| DefaultMap <int64_t, Dwr_type*> *dwr_types; |
| int level; |
| |
| Dwr_type *get_dwr_type (int64_t cu_die_offset); |
| Dwr_type *put_dwr_type (int64_t cu_die_offset, int tag); |
| Dwr_type *put_dwr_type (Dwr_Tag *dwrTag); |
| }; |
| |
| class DwrCU |
| { |
| public: |
| DwrCU (Dwarf *_dwarf); |
| ~DwrCU (); |
| Module *parse_cu_header (LoadObject *lo); |
| void parseChild (Dwarf_cnt *ctx); |
| void read_hwcprof_info (Dwarf_cnt *ctx); |
| void map_dwarf_lines (Module *mod); |
| int set_die (Dwarf_Die die); |
| DwrLineRegs *get_dwrLineReg (); |
| |
| static char *at2str (int tag); |
| static char *form2str (int tag); |
| static char *tag2str (int tag); |
| static char *lnct2str (int ty); |
| |
| uint64_t cu_header_offset; |
| uint64_t cu_offset; |
| uint64_t next_cu_offset; |
| Vector<DwrInlinedSubr*> *dwrInlinedSubrs; |
| Vector<SourceFile *> *srcFiles; |
| bool isMemop; |
| bool isGNU; |
| |
| private: |
| void build_abbrevTable (DwrSec *debug_abbrevSec, uint64_t stmt_list_offset); |
| Function *append_Function (Dwarf_cnt *ctx); |
| void parse_inlined_subroutine (Dwarf_cnt *ctx); |
| uint64_t get_low_pc (); |
| uint64_t get_high_pc (uint64_t low_pc); |
| DwrLocation *dwr_get_location (DwrSec *secp, DwrLocation *lp); |
| int read_data_attr (Dwarf_Half attr, int64_t *retVal); |
| int read_ref_attr (Dwarf_Half attr, int64_t *retVal); |
| char *get_linkage_name (); |
| char *Dwarf_string (Dwarf_Half attr); |
| int64_t Dwarf_data (Dwarf_Half attr); |
| int64_t Dwarf_ref (Dwarf_Half attr); |
| DwrSec *Dwarf_block (Dwarf_Half attr); |
| Dwarf_Addr Dwarf_addr (Dwarf_Half attr); |
| Dwarf_Addr Dwarf_location (Dwarf_Attribute attr); |
| Sp_lang_code Dwarf_lang (); |
| |
| Dwarf *dwarf; |
| DwrSec *debug_infoSec; |
| uint64_t debug_abbrev_offset; |
| uint64_t stmt_list_offset; // offset in .debug_line section (DW_AT_stmt_list) |
| char *comp_dir; // compilation directory (DW_AT_comp_dir) |
| Module *module; |
| int unit_type; |
| Dwarf_Half version; |
| Dwarf_Small address_size; |
| Dwr_Tag dwrTag; |
| DwrLineRegs *dwrLineReg; |
| DbeArray<DwrAbbrevTable> *abbrevTable; |
| DbeArray<Dwr_Attr> *abbrevAtForm; |
| }; |
| |
| #endif /* _DWARFLIB_H_ */ |