1 /* Copyright (C) 2021 Free Software Foundation, Inc.
2    Contributed by Oracle.
3 
4    This file is part of GNU Binutils.
5 
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.
10 
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.
15 
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.  */
20 
21 #ifndef _LOADOBJECT_H
22 #define _LOADOBJECT_H
23 
24 // A Segment object represents a segment of the program text.
25 
26 #include "Histable.h"
27 #include "Stabs.h"
28 #include "DbeLock.h"
29 
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
37 
38 /* Hash name for all comparable executions */
39 #define COMP_EXE_NAME       "<COMP_EXE_NAME>"
40 
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;
49 
50 enum
51 {
52   CMP_PATH          = 1,
53   CMP_RUNTIMEPATH   = 2,
54   CMP_CHKSUM        = 4
55 };
56 
57 class LoadObject : public HistableFile, public DbeLock
58 {
59 public:
60 
61   // The various segments types.
62   enum seg_type
63   {
64     SEG_TEXT,
65     SEG_DATA,
66     SEG_BSS,
67     SEG_HEAP,
68     SEG_STACK,
69     SEG_DEVICE,
70     SEG_UNKNOWN
71   };
72 
73   // These codes are stored in *.archive files
74   enum Arch_status
75   {
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
90   };
91 
92   LoadObject (const char *loname);
93 
94   static LoadObject *create_item (const char *nm, int64_t chksum);
95   static LoadObject *create_item (const char *nm, const char *_runTimePath, DbeFile *df);
96 
97   virtual ~LoadObject ();
98   virtual void set_name (char *string);
99   virtual uint64_t get_addr ();
100   virtual Vector<Histable*> *get_comparable_objs ();
101 
102   virtual Histable_type
get_type()103   get_type ()
104   {
105     return LOADOBJECT;
106   };
107 
108   virtual int64_t
get_size()109   get_size ()
110   {
111     return size;
112   }
113 
114   char *
get_pathname()115   get_pathname ()
116   {
117     return pathname;
118   }
119 
120   void
set_archname(char * aname)121   set_archname (char *aname)
122   {
123     free (arch_name);
124     arch_name = aname;
125   }
126 
127   bool
is_relocatable()128   is_relocatable ()
129   {
130     return isRelocatable;
131   }
132 
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 ();
155 
156   Emsg *
fetch_warnings(void)157   fetch_warnings (void) // fetch the queue of warning messages
158   {
159     return warnq->fetch ();
160   }
161 
162   Emsg *
fetch_comments(void)163   fetch_comments (void) // fetch the queue of comment messages
164   {
165     return commentq->fetch ();
166   }
167 
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
188 
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
203 
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);
208 };
209 
210 #endif /* _LOADOBJECT_H */
211