diff options
Diffstat (limited to 'gprofng/src/LoadObject.h')
-rw-r--r-- | gprofng/src/LoadObject.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/gprofng/src/LoadObject.h b/gprofng/src/LoadObject.h new file mode 100644 index 0000000..0c997e3 --- /dev/null +++ b/gprofng/src/LoadObject.h @@ -0,0 +1,210 @@ +/* Copyright (C) 2021 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 */ |