| /* Copyright (C) 2021-2024 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 _STABS_H | |
| #define _STABS_H | |
| #include "dbe_structs.h" | |
| #include "vec.h" | |
| enum cpf_instr_type_t { | |
| CPF_INSTR_TYPE_LD = 0, // profiled load instruction | |
| CPF_INSTR_TYPE_ST, // profiled store instruction | |
| CPF_INSTR_TYPE_PREFETCH, // profiled prefetch instruction | |
| CPF_INSTR_TYPE_BRTARGET, // branch target | |
| CPF_INSTR_TYPE_UNKNOWN, // unidentified instruction | |
| CPF_INSTR_TYPE_NTYPES // total # of instr types | |
| }; | |
| class Function; | |
| class LoadObject; | |
| class Module; | |
| class ComC; | |
| class Elf; | |
| class Dwarf; | |
| class Symbol; | |
| class Reloc; | |
| struct cpf_stabs_t; | |
| class SourceFile; | |
| template <typename Key_t, typename Value_t> class Map; | |
| class Include { | |
| public: | |
| typedef struct { | |
| SourceFile *srcfile; | |
| int lineno; | |
| } SrcFileInfo; | |
| Include(); | |
| ~Include(); | |
| void new_src_file(SourceFile *source, int lineno, Function *func = NULL); | |
| void new_include_file(SourceFile *source, Function *func); | |
| void end_include_file(Function *func); | |
| void push_src_files(Function *func); | |
| private: | |
| Vector<SrcFileInfo*> *stack; | |
| }; | |
| // Stabs object | |
| class Stabs { | |
| public: | |
| enum Stab_status { | |
| DBGD_ERR_NONE, | |
| DBGD_ERR_CANT_OPEN_FILE, | |
| DBGD_ERR_BAD_ELF_LIB, | |
| DBGD_ERR_BAD_ELF_FORMAT, | |
| DBGD_ERR_NO_STABS, | |
| DBGD_ERR_BAD_STABS, | |
| DBGD_ERR_NO_DWARF, | |
| DBGD_ERR_CHK_SUM | |
| }; | |
| static Stabs *NewStabs(char *_path, char *lo_name); | |
| Stabs(char *_path, char *_lo_name); | |
| ~Stabs(); | |
| bool is_relocatable(){ return isRelocatable; } | |
| long long get_textsz() { return textsz; } | |
| Platform_t get_platform() { return platform; } | |
| WSize_t get_class() { return wsize;} | |
| Stab_status get_status() { return status;} | |
| Stab_status read_stabs(ino64_t srcInode, Module *module, Vector<ComC*> *comComs, bool readDwarf = false); | |
| Stab_status read_archive(LoadObject *lo); | |
| bool read_symbols(Vector<Function*> *functions); | |
| uint64_t mapOffsetToAddress(uint64_t img_offset); | |
| char *sym_name(uint64_t target, uint64_t instr, int flag); | |
| Elf *openElf (bool dbg_info = false); | |
| void read_hwcprof_info(Module *module); | |
| void dump(); | |
| void read_dwarf_from_dot_o(Module *mod); | |
| static bool is_fortran(Sp_lang_code lc) { return (lc == Sp_lang_fortran) || (lc == Sp_lang_fortran90); } | |
| static Function *find_func(char *fname, Vector<Function*> *functions, bool fortran, bool inner_names=false); | |
| Module *append_Module(LoadObject *lo, char *name, int lastMod = 0); | |
| Function *append_Function(Module *module, char *fname); | |
| Function *append_Function(Module *module, char *linkerName, uint64_t pc); | |
| Function *map_PC_to_func(uint64_t pc, uint64_t &low_pc, Vector<Function*> *functions); | |
| char *path; // path to the object file | |
| char *lo_name; // User name of load object | |
| private: | |
| Elf *elfDbg; // ELF with debug info | |
| Elf *elfDis; // ELF for disasm | |
| Stab_status status; // current stabs status | |
| long long textsz; // text segment size | |
| Platform_t platform; // Sparc, Sparcv9, Intel | |
| WSize_t wsize; // word size: 32 or 64 | |
| bool isRelocatable; | |
| Symbol *last_PC_to_sym; | |
| Vector<cpf_stabs_t> analyzerInfoMap; // stabs->section mapping | |
| bool check_Comm(Vector<ComC*> *comComs); | |
| void check_Info(Vector<ComC*> *comComs); | |
| void check_Loop(Vector<ComC*> *comComs); | |
| void check_AnalyzerInfo(); | |
| void append_local_funcs(Module *module, int first_ind); | |
| Stab_status srcline_Stabs (Module *module, unsigned int StabSec, unsigned int StabStrSec, bool comdat); | |
| Stab_status archive_Stabs (LoadObject *lo, unsigned int StabSec, unsigned int StabStrSec, bool comdat); | |
| // Interface with Elf Symbol Table | |
| void check_Symtab(); | |
| void readSymSec(unsigned int sec, Elf *elf); | |
| void check_Relocs(); | |
| void get_save_addr(bool need_swap_endian); | |
| Symbol *map_PC_to_sym(uint64_t pc); | |
| Symbol *pltSym; | |
| Vector<Symbol*> *SymLst; // list of func symbols | |
| Vector<Symbol*> *SymLstByName; // list of func symbols sorted by Name | |
| Vector<Reloc*> *RelLst; // list of text relocations | |
| Vector<Reloc*> *RelPLTLst; // list of PLT relocations | |
| Vector<Symbol*> *LocalLst; // list of local func symbols | |
| Vector<char*> *LocalFile; // list of local files | |
| Vector<int> *LocalFileIdx; // start index in LocalLst | |
| Elf *openElf(char *fname, Stab_status &st); | |
| Map<const char*, Symbol*> *get_elf_symbols(); | |
| Dwarf *dwarf; | |
| bool st_check_symtab, st_check_relocs; | |
| Function *createFunction(LoadObject *lo, Module *module, Symbol *sym); | |
| void fixSymtabAlias(); | |
| // Interface with dwarf | |
| Dwarf *openDwarf(); | |
| Vector<Module*> *stabsModules; | |
| static char *get_type_name(int t); | |
| }; | |
| #endif /* _STABS_H */ |