Automatic date update in version.in
[binutils-gdb.git] / gprofng / src / LoadObject.h
blob0c997e3f2e8c967ca03d03f570b9b3bd23645ef4
1 /* Copyright (C) 2021 Free Software Foundation, Inc.
2 Contributed by Oracle.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 #ifndef _LOADOBJECT_H
22 #define _LOADOBJECT_H
24 // A Segment object represents a segment of the program text.
26 #include "Histable.h"
27 #include "Stabs.h"
28 #include "DbeLock.h"
30 #define JAVA_COMPILED_METHODS "JAVA_COMPILED_METHODS"
31 #define DYNFUNC_SEGMENT "DYNAMIC_FUNCTIONS"
32 #define SEG_FLAG_DYNAMIC 0x01
33 #define SEG_FLAG_JVM 0x02
34 #define SEG_FLAG_OMP 0x04
35 #define SEG_FLAG_EXE 0x08
36 #define SEG_FLAG_REORDER 0x10
38 /* Hash name for all comparable executions */
39 #define COMP_EXE_NAME "<COMP_EXE_NAME>"
41 class Emsg;
42 class Elf;
43 class Experiment;
44 class Function;
45 class Module;
46 template <typename Key_t, typename Value_t> class HashMap;
47 template <typename Key_t, typename Value_t> class Map;
48 template <class ITEM> class Vector;
50 enum
52 CMP_PATH = 1,
53 CMP_RUNTIMEPATH = 2,
54 CMP_CHKSUM = 4
57 class LoadObject : public HistableFile, public DbeLock
59 public:
61 // The various segments types.
62 enum seg_type
64 SEG_TEXT,
65 SEG_DATA,
66 SEG_BSS,
67 SEG_HEAP,
68 SEG_STACK,
69 SEG_DEVICE,
70 SEG_UNKNOWN
73 // These codes are stored in *.archive files
74 enum Arch_status
76 ARCHIVE_SUCCESS,
77 ARCHIVE_EXIST,
78 ARCHIVE_BAD_STABS,
79 ARCHIVE_ERR_SEG,
80 ARCHIVE_ERR_OPEN,
81 ARCHIVE_ERR_MAP,
82 ARCHIVE_WARN_MTIME,
83 ARCHIVE_WARN_HOST,
84 ARCHIVE_ERR_VERSION,
85 ARCHIVE_NO_STABS,
86 ARCHIVE_WRONG_ARCH,
87 ARCHIVE_NO_LIBDWARF,
88 ARCHIVE_NO_DWARF,
89 ARCHIVE_WARN_CHECKSUM
92 LoadObject (const char *loname);
94 static LoadObject *create_item (const char *nm, int64_t chksum);
95 static LoadObject *create_item (const char *nm, const char *_runTimePath, DbeFile *df);
97 virtual ~LoadObject ();
98 virtual void set_name (char *string);
99 virtual uint64_t get_addr ();
100 virtual Vector<Histable*> *get_comparable_objs ();
102 virtual Histable_type
103 get_type ()
105 return LOADOBJECT;
108 virtual int64_t
109 get_size ()
111 return size;
114 char *
115 get_pathname ()
117 return pathname;
120 void
121 set_archname (char *aname)
123 free (arch_name);
124 arch_name = aname;
127 bool
128 is_relocatable ()
130 return isRelocatable;
133 bool compare (const char *nm, int64_t _checksum);
134 int compare (const char *_path, const char *_runTimePath, DbeFile *df);
135 void set_platform (Platform_t pltf, int wsz);
136 void dump_functions (FILE *);
137 int get_index (Function *func);
138 char *get_alias (Function *func);
139 DbeInstr *find_dbeinstr (uint64_t file_off);
140 Function *find_function (uint64_t offset);
141 Function *find_function (char *fname);
142 Function *find_function (char *fname, unsigned int chksum);
143 Module *find_module (char *mname);
144 Module *get_comparable_Module (Module *mod);
145 void append_module (Module *mod);
146 Elf *get_elf ();
147 Stabs *openDebugInfo (char *fname, Stabs::Stab_status *stp = NULL);
148 Arch_status read_stabs ();
149 Arch_status sync_read_stabs ();
150 void post_process_functions ();
151 char *status_str (Arch_status rv, char *arg = NULL);
152 Function *get_hide_function ();
153 DbeInstr *get_hide_instr (DbeInstr *instr);
154 uint32_t get_checksum ();
156 Emsg *
157 fetch_warnings (void) // fetch the queue of warning messages
159 return warnq->fetch ();
162 Emsg *
163 fetch_comments (void) // fetch the queue of comment messages
165 return commentq->fetch ();
168 unsigned int flags; // SEG_FLAG_*
169 bool isReadStabs;
170 bool need_swap_endian;
171 int seg_idx; // for compatibility (ADDRESS)
172 seg_type type;
173 int64_t size; // size of loadobject in bytes
174 int64_t max_size; // Maximum size of loadobject in bytes
175 int64_t min_size; // Min size of loadobject in bytes.
176 Vector<Function*> *functions; // Ordered list of functions
177 Vector<Module*> *seg_modules; // list of modules
178 HashMap<char*, Module*> *modules;
179 Module *noname; // Module pointer to unknown name
180 Platform_t platform; // Sparc, Sparcv9, Intel
181 WSize_t wsize; // word size: 32,64
182 Stabs *objStabs;
183 HashMap<char*, Function*> *comp_funcs; // list of comparable functions
184 Experiment *firstExp;
185 char *runTimePath;
186 time_t mtime; // file timestamp (in seconds)
187 int64_t checksum; // file checksum
189 private:
190 Elf *elf_lo;
191 bool elf_inited;
192 DbeInstr **instHTable; // hash table for DbeInstr
193 char *pathname; // User name of object file
194 ino64_t inode; // inode number of segment file
195 bool isRelocatable; // is relocatable .o
196 char *arch_name; // .archive name
197 Emsgqueue *warnq;
198 Emsgqueue *commentq;
199 Function **funcHTable; // hash table for functions
200 Function *h_function; // hide pseudo function
201 DbeInstr *h_instr; // hide pseudo instr
202 HashMap<char*, Module*> *seg_modules_map; // to find a comparable module
204 static int func_compare (const void *p1, const void *p2);
205 int read_archive ();
206 void init_datatypes ();
207 void update_datatypes (Module*, Vaddr, uint32_t datatype_id);
210 #endif /* _LOADOBJECT_H */