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 _MODULE_H
22#define _MODULE_H
23
24// A Module object represents a .o file that was used to build up a segement.
25//	Its main function is to compute source and disassembly annotations
26// Text reordering and/or function outlining imply that a module may
27//	not be contiguous.
28
29#include "Histable.h"
30#include "Hist_data.h"
31
32#define MOD_FLAG_UNKNOWN 0x01
33
34class LoadObject;
35class MetricList;
36class ComC;
37class Disasm;
38class Hist_data;
39class Stabs;
40class SourceFile;
41class DataObject;
42class JMethod;
43template <class ITEM> class Vector;
44
45class InlinedSubr
46{
47public:
48  InlinedSubr ();
49  DbeLine *dbeLine;
50  Function *func;
51  char *fname;
52  uint64_t low_pc;
53  uint64_t high_pc;
54  int level;
55
56  bool
57  contains (InlinedSubr *p)
58  {
59    return low_pc <= p->low_pc && high_pc >= p->high_pc;
60  }
61
62  bool
63  contains (uint64_t pc)
64  {
65    return low_pc <= pc && high_pc > pc;
66  }
67};
68
69class Module : public HistableFile
70{
71public:
72  // Annotated Source or Disassembly
73  enum Anno_Errors
74  {
75    AE_OK,
76    AE_NOTREAD,
77    AE_NOSRC,
78    AE_NOOBJ,
79    AE_NOLOBJ,
80    AE_NOSTABS,
81    AE_NOSYMTAB,
82    AE_TIMESRC,
83    AE_TIMEDIS,
84    AE_TIMESTABS,
85    AE_TIMESTABS_DIFF,
86    AE_OTHER
87  };
88
89  // The following enums are duplicated in Java
90  enum Anno_Types
91  {
92    AT_LIST = 0,
93    AT_SRC,
94    AT_SRC_ONLY,
95    AT_DIS,
96    AT_COM,
97    AT_QUOTE,
98    AT_FUNC,
99    AT_EMPTY,
100    AT_DIS_ONLY
101  };
102
103  Module ();
104  virtual ~Module ();
105  virtual int64_t get_size ();
106  virtual void set_name (char *str);
107  virtual Vector<Histable*> *get_comparable_objs ();
108  virtual int readFile ();
109
110  virtual Histable_type
111  get_type ()
112  {
113    return MODULE;
114  }
115
116  inline Anno_Errors
117  get_status ()
118  {
119    return status;
120  }
121
122  inline void
123  set_file_name (char *fnm)
124  {
125    free (file_name);
126    file_name = fnm;
127  }
128
129  // get error string
130  char *anno_str (char *fnm = NULL);
131
132  // generate annotated source/disassembly data
133  Hist_data *get_data (DbeView *dbev, MetricList *mlist,
134		       Histable::Type type, TValue *ftotal, SourceFile *srcFile,
135		       Function *func, Vector<int> *marks, int threshold,
136		       int vis_bits, int src_visible, bool hex_visible,
137		       bool func_scope, bool src_only,
138		       Vector<int_pair_t> *marks2d = NULL,
139		       Vector<int_pair_t> *marks2d_inc = NULL);
140
141  Vector<uint64_t> *getAddrs (Function *func);
142  SourceFile *setIncludeFile (char *includeFile);
143
144  SourceFile *
145  getIncludeFile ()
146  {
147    return curr_inc;
148  }
149
150  SourceFile *
151  getMainSrc ()
152  {
153    return main_source;
154  }
155
156  char *
157  getResolvedObjectPath ()
158  {
159    return stabsPath ? stabsPath : get_name ();
160  }
161
162  char *
163  getDebugPath ()
164  {
165    setFile ();
166    return stabsPath;
167  }
168
169  void read_stabs (bool all = true);
170  void dump_dataobjects (FILE *out);
171  DataObject *get_dobj (uint32_t dtype_id);
172  void reset_datatypes ();
173  void read_hwcprof_info ();
174  bool is_fortran ();
175  SourceFile *findSource (const char *fname, bool create);
176  bool openStabs (bool all = true);
177  LoadObject *createLoadObject (const char *lo_name);
178  JMethod *find_jmethod (const char *nm, const char *sig);
179
180  unsigned int flags;               // flags used for marking traversals
181  Sp_lang_code lang_code;           // What is source lang. in module
182  char *file_name;                  // Full path to actual source file
183  Vector<Function*> *functions;     // Unordered list of functions
184  LoadObject *loadobject;           // Parent loadobject
185  LoadObject *dot_o_file;           // The .o file with debug information
186  unsigned fragmented;              // -xF used when compiling module
187  int real_timestamp;               // Linked timestamp from N_OPT stab
188  int curr_timestamp;               // Current object timestamp from N_OPT stab
189  char *comp_flags;                 // compiler flags used to compile module
190  char *comp_dir;                   // directory used to compile module
191  char *linkerStabName;             // Name from 'N_UNDF' stab
192  Stabs *objStabs;                  // stabs of object file
193  bool readStabs;
194  bool hasStabs;
195  bool hasDwarf;
196  uint64_t hdrOffset;               // offset in .debug_info
197  unsigned hwcprof;                 // hwcprof info status
198  Vector<inst_info_t*> *infoList;   // merged list
199  Vector<memop_info_t*> ldMemops;   // load instructions
200  Vector<memop_info_t*> stMemops;   // store instructions
201  Vector<memop_info_t*> pfMemops;   // prefetch instructions
202  Vector<target_info_t*> bTargets;  // branch targets
203  Vector<datatype_t*> *datatypes;   // object type descriptors
204  Vector<SourceFile*> *includes;
205  Module *indexStabsLink;           // correspondent module for the .o file
206  InlinedSubr *inlinedSubr;
207
208protected:
209  void removeStabsTmp (); // Remove temporary *.o (got from *.a)
210
211  // Check timestamp, warn users if src/dis/stabs later than exp.
212  Anno_Errors checkTimeStamp (bool chkDis);
213
214  // Set paths for reading Stabs and Symbols
215  bool read_ar (int ar, int obj, char *obj_base);
216  bool setFile ();
217
218  // Open appropriate symbol tables, construct set of PC ranges,
219  //	and maps to source lines for each PC
220  Stabs *openDebugInfo ();
221
222  // Construct PC index table
223  bool openDisPC ();
224
225  // Compute data--scan data to compute metrics per-src-line/dis-line
226  bool computeMetrics (DbeView *dbev, Function *func, MetricList *mlist,
227		       Histable::Type type, bool src_metric,
228		       bool func_scope, SourceFile *source);
229  void init_line ();
230  void init_index (Hist_data *witems, int &wlindex, int &wmsize, int &wmindex);
231
232  void set_src_data (Function *func, int vis_bits, int cmpline_visible,
233		     int funcline_visible);
234  void set_dis_data (Function *func, int vis_bits, int cmpline_visible,
235		     int src_visible, bool hex_vis, bool func_scope,
236		     int funcline_visible);
237  void set_src (Anno_Types type, DbeLine *dbeline);
238  void set_dis (DbeInstr *instr, Anno_Types type, bool nextFile, char *dis_str);
239  void set_MPSlave ();
240  void set_one (Hist_data::HistItem *org_item, Anno_Types type, const char *text);
241  void set_ComCom (int vis_bits);
242
243  virtual char *get_disasm (uint64_t inst_address, uint64_t end_address,
244			    uint64_t start_address, uint64_t f_offset,
245			    int64_t &inst_size);
246
247  Anno_Errors status;
248  Anno_Errors openSourceFlag;
249  bool hexVisible;          // show hex code in disasm
250  time_t disMTime;          // Creating time for disassembly
251  time_t stabsMTime;        // Creating time for stabs
252  SourceFile *main_source;
253  SourceFile *curr_inc;     // pointer to include file or NULL
254  SourceFile *srcContext;
255  Vector<ComC*> *comComs;   // table of compiler comments
256  Disasm *disasm;
257  Hist_data *src_items;
258  Hist_data *dis_items;
259  Hist_data *data_items;
260  DbeView * cur_dbev;
261  TValue *total;
262  TValue *maximum;
263  TValue *maximum_inc;
264  TValue *empty;
265  int name_idx;         // index of name metric in list for src/dis
266  int size_index;       // index of size metric in list for src/dis
267  int addr_index;       // index of address metric in list for src/dis
268
269  int curline;          // line# of next source line to be processed
270  int cindex, cline;    // index and src line of next compiler-comment
271  int sindex, sline;    // index and src line of next item in src_items
272  int dindex;
273  DbeInstr *daddr;      // pointer to next DbeInstr with metrics
274  int mindex;           // MP index and src line of next metric-value
275  int mline;            // MP line to be processed by source
276
277  char *disPath;        // path for disassembly
278  char *stabsPath;      // path for reading stabs
279  char *stabsTmp;       // temporary *.o from *.a
280  char *disName;        // library/path for disassembly
281  char *stabsName;      // library/path for stabs
282};
283
284#endif /* _MODULE_H */
285