| /* 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 _LOADOBJECT_H |
| #define _LOADOBJECT_H |
| |
| // A Segment object represents a segment of the program text. |
| |
| #include "Histable.h" |
| #include "Stabs.h" |
| #include "DbeLock.h" |
| |
| #define JAVA_COMPILED_METHODS "JAVA_COMPILED_METHODS" |
| #define DYNFUNC_SEGMENT "DYNAMIC_FUNCTIONS" |
| #define SEG_FLAG_DYNAMIC 0x01 |
| #define SEG_FLAG_JVM 0x02 |
| #define SEG_FLAG_OMP 0x04 |
| #define SEG_FLAG_EXE 0x08 |
| #define SEG_FLAG_REORDER 0x10 |
| |
| /* Hash name for all comparable executions */ |
| #define COMP_EXE_NAME "<COMP_EXE_NAME>" |
| |
| class Emsg; |
| class Elf; |
| class Experiment; |
| class Function; |
| class Module; |
| template <typename Key_t, typename Value_t> class HashMap; |
| template <typename Key_t, typename Value_t> class Map; |
| template <class ITEM> class Vector; |
| |
| enum |
| { |
| CMP_PATH = 1, |
| CMP_RUNTIMEPATH = 2, |
| CMP_CHKSUM = 4 |
| }; |
| |
| class LoadObject : public HistableFile, public DbeLock |
| { |
| public: |
| |
| // The various segments types. |
| enum seg_type |
| { |
| SEG_TEXT, |
| SEG_DATA, |
| SEG_BSS, |
| SEG_HEAP, |
| SEG_STACK, |
| SEG_DEVICE, |
| SEG_UNKNOWN |
| }; |
| |
| // These codes are stored in *.archive files |
| enum Arch_status |
| { |
| ARCHIVE_SUCCESS, |
| ARCHIVE_EXIST, |
| ARCHIVE_BAD_STABS, |
| ARCHIVE_ERR_SEG, |
| ARCHIVE_ERR_OPEN, |
| ARCHIVE_ERR_MAP, |
| ARCHIVE_WARN_MTIME, |
| ARCHIVE_WARN_HOST, |
| ARCHIVE_ERR_VERSION, |
| ARCHIVE_NO_STABS, |
| ARCHIVE_WRONG_ARCH, |
| ARCHIVE_NO_LIBDWARF, |
| ARCHIVE_NO_DWARF, |
| ARCHIVE_WARN_CHECKSUM |
| }; |
| |
| LoadObject (const char *loname); |
| |
| static LoadObject *create_item (const char *nm, int64_t chksum); |
| static LoadObject *create_item (const char *nm, const char *_runTimePath, DbeFile *df); |
| |
| virtual ~LoadObject (); |
| virtual void set_name (char *string); |
| virtual uint64_t get_addr (); |
| virtual Vector<Histable*> *get_comparable_objs (); |
| |
| virtual Histable_type |
| get_type () |
| { |
| return LOADOBJECT; |
| }; |
| |
| virtual int64_t |
| get_size () |
| { |
| return size; |
| } |
| |
| char * |
| get_pathname () |
| { |
| return pathname; |
| } |
| |
| void |
| set_archname (char *aname) |
| { |
| free (arch_name); |
| arch_name = aname; |
| } |
| |
| bool |
| is_relocatable () |
| { |
| return isRelocatable; |
| } |
| |
| bool compare (const char *nm, int64_t _checksum); |
| int compare (const char *_path, const char *_runTimePath, DbeFile *df); |
| void set_platform (Platform_t pltf, int wsz); |
| void dump_functions (FILE *); |
| int get_index (Function *func); |
| char *get_alias (Function *func); |
| DbeInstr *find_dbeinstr (uint64_t file_off); |
| Function *find_function (uint64_t offset); |
| Function *find_function (char *fname); |
| Function *find_function (char *fname, unsigned int chksum); |
| Module *find_module (char *mname); |
| Module *get_comparable_Module (Module *mod); |
| void append_module (Module *mod); |
| Elf *get_elf (); |
| Stabs *openDebugInfo (char *fname, Stabs::Stab_status *stp = NULL); |
| Arch_status read_stabs (); |
| Arch_status sync_read_stabs (); |
| void post_process_functions (); |
| char *status_str (Arch_status rv, char *arg = NULL); |
| Function *get_hide_function (); |
| DbeInstr *get_hide_instr (DbeInstr *instr); |
| uint32_t get_checksum (); |
| |
| Emsg * |
| fetch_warnings (void) // fetch the queue of warning messages |
| { |
| return warnq->fetch (); |
| } |
| |
| Emsg * |
| fetch_comments (void) // fetch the queue of comment messages |
| { |
| return commentq->fetch (); |
| } |
| |
| unsigned int flags; // SEG_FLAG_* |
| bool isReadStabs; |
| bool need_swap_endian; |
| int seg_idx; // for compatibility (ADDRESS) |
| seg_type type; |
| int64_t size; // size of loadobject in bytes |
| int64_t max_size; // Maximum size of loadobject in bytes |
| int64_t min_size; // Min size of loadobject in bytes. |
| Vector<Function*> *functions; // Ordered list of functions |
| Vector<Module*> *seg_modules; // list of modules |
| HashMap<char*, Module*> *modules; |
| Module *noname; // Module pointer to unknown name |
| Platform_t platform; // Sparc, Sparcv9, Intel |
| WSize_t wsize; // word size: 32,64 |
| Stabs *objStabs; |
| HashMap<char*, Function*> *comp_funcs; // list of comparable functions |
| Experiment *firstExp; |
| char *runTimePath; |
| time_t mtime; // file timestamp (in seconds) |
| int64_t checksum; // file checksum |
| |
| private: |
| Elf *elf_lo; |
| bool elf_inited; |
| DbeInstr **instHTable; // hash table for DbeInstr |
| char *pathname; // User name of object file |
| ino64_t inode; // inode number of segment file |
| bool isRelocatable; // is relocatable .o |
| char *arch_name; // .archive name |
| Emsgqueue *warnq; |
| Emsgqueue *commentq; |
| Function **funcHTable; // hash table for functions |
| Function *h_function; // hide pseudo function |
| DbeInstr *h_instr; // hide pseudo instr |
| HashMap<char*, Module*> *seg_modules_map; // to find a comparable module |
| |
| static int func_compare (const void *p1, const void *p2); |
| int read_archive (); |
| void init_datatypes (); |
| void update_datatypes (Module*, Vaddr, uint32_t datatype_id); |
| }; |
| |
| #endif /* _LOADOBJECT_H */ |