| /* Copyright (C) 2021-2025 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 _MODULE_H | 
 | #define _MODULE_H | 
 |  | 
 | // A Module object represents a .o file that was used to build up a segement. | 
 | //	Its main function is to compute source and disassembly annotations | 
 | // Text reordering and/or function outlining imply that a module may | 
 | //	not be contiguous. | 
 |  | 
 | #include "Histable.h" | 
 | #include "Hist_data.h" | 
 |  | 
 | #define MOD_FLAG_UNKNOWN 0x01 | 
 |  | 
 | class LoadObject; | 
 | class MetricList; | 
 | class ComC; | 
 | class Disasm; | 
 | class Hist_data; | 
 | class Stabs; | 
 | class SourceFile; | 
 | class DataObject; | 
 | class JMethod; | 
 | template <class ITEM> class Vector; | 
 |  | 
 | class InlinedSubr | 
 | { | 
 | public: | 
 |   InlinedSubr (); | 
 |   DbeLine *dbeLine; | 
 |   Function *func; | 
 |   char *fname; | 
 |   uint64_t low_pc; | 
 |   uint64_t high_pc; | 
 |   int level; | 
 |  | 
 |   bool | 
 |   contains (InlinedSubr *p) | 
 |   { | 
 |     return low_pc <= p->low_pc && high_pc >= p->high_pc; | 
 |   } | 
 |  | 
 |   bool | 
 |   contains (uint64_t pc) | 
 |   { | 
 |     return low_pc <= pc && high_pc > pc; | 
 |   } | 
 | }; | 
 |  | 
 | class Module : public HistableFile | 
 | { | 
 | public: | 
 |   // Annotated Source or Disassembly | 
 |   enum Anno_Errors | 
 |   { | 
 |     AE_OK, | 
 |     AE_NOTREAD, | 
 |     AE_NOSRC, | 
 |     AE_NOOBJ, | 
 |     AE_NOLOBJ, | 
 |     AE_NOSTABS, | 
 |     AE_NOSYMTAB, | 
 |     AE_TIMESRC, | 
 |     AE_TIMEDIS, | 
 |     AE_TIMESTABS, | 
 |     AE_TIMESTABS_DIFF, | 
 |     AE_OTHER | 
 |   }; | 
 |  | 
 |   // The following enums are duplicated in Java | 
 |   enum Anno_Types | 
 |   { | 
 |     AT_LIST = 0, | 
 |     AT_SRC, | 
 |     AT_SRC_ONLY, | 
 |     AT_DIS, | 
 |     AT_COM, | 
 |     AT_QUOTE, | 
 |     AT_FUNC, | 
 |     AT_EMPTY, | 
 |     AT_DIS_ONLY | 
 |   }; | 
 |  | 
 |   Module (); | 
 |   virtual ~Module (); | 
 |   virtual int64_t get_size (); | 
 |   virtual void set_name (char *str); | 
 |   virtual Vector<Histable*> *get_comparable_objs (); | 
 |   virtual int readFile (); | 
 |  | 
 |   virtual Histable_type | 
 |   get_type () | 
 |   { | 
 |     return MODULE; | 
 |   } | 
 |  | 
 |   inline Anno_Errors | 
 |   get_status () | 
 |   { | 
 |     return status; | 
 |   } | 
 |  | 
 |   inline void | 
 |   set_file_name (char *fnm) | 
 |   { | 
 |     free (file_name); | 
 |     file_name = fnm; | 
 |   } | 
 |  | 
 |   // get error string | 
 |   char *anno_str (char *fnm = NULL); | 
 |  | 
 |   // generate annotated source/disassembly data | 
 |   Hist_data *get_data (DbeView *dbev, MetricList *mlist, | 
 | 		       Histable::Type type, TValue *ftotal, SourceFile *srcFile, | 
 | 		       Function *func, Vector<int> *marks, int threshold, | 
 | 		       int vis_bits, int src_visible, bool hex_visible, | 
 | 		       bool func_scope, bool src_only, | 
 | 		       Vector<int_pair_t> *marks2d = NULL, | 
 | 		       Vector<int_pair_t> *marks2d_inc = NULL); | 
 |  | 
 |   Vector<uint64_t> *getAddrs (Function *func); | 
 |   SourceFile *setIncludeFile (char *includeFile); | 
 |  | 
 |   SourceFile * | 
 |   getIncludeFile () | 
 |   { | 
 |     return curr_inc; | 
 |   } | 
 |  | 
 |   SourceFile * | 
 |   getMainSrc () | 
 |   { | 
 |     return main_source; | 
 |   } | 
 |  | 
 |   char * | 
 |   getResolvedObjectPath () | 
 |   { | 
 |     return stabsPath ? stabsPath : get_name (); | 
 |   } | 
 |  | 
 |   char * | 
 |   getDebugPath () | 
 |   { | 
 |     setFile (); | 
 |     return stabsPath; | 
 |   } | 
 |  | 
 |   void read_stabs (bool all = true); | 
 |   void dump_dataobjects (FILE *out); | 
 |   DataObject *get_dobj (uint32_t dtype_id); | 
 |   void reset_datatypes (); | 
 |   void read_hwcprof_info (); | 
 |   bool is_fortran (); | 
 |   SourceFile *findSource (const char *fname, bool create); | 
 |   bool openStabs (bool all = true); | 
 |   LoadObject *createLoadObject (const char *lo_name); | 
 |   JMethod *find_jmethod (const char *nm, const char *sig); | 
 |  | 
 |   unsigned int flags;               // flags used for marking traversals | 
 |   Sp_lang_code lang_code;           // What is source lang. in module | 
 |   char *file_name;                  // Full path to actual source file | 
 |   Vector<Function*> *functions;     // Unordered list of functions | 
 |   LoadObject *loadobject;           // Parent loadobject | 
 |   LoadObject *dot_o_file;           // The .o file with debug information | 
 |   unsigned fragmented;              // -xF used when compiling module | 
 |   int real_timestamp;               // Linked timestamp from N_OPT stab | 
 |   int curr_timestamp;               // Current object timestamp from N_OPT stab | 
 |   char *comp_flags;                 // compiler flags used to compile module | 
 |   char *comp_dir;                   // directory used to compile module | 
 |   char *linkerStabName;             // Name from 'N_UNDF' stab | 
 |   Stabs *objStabs;                  // stabs of object file | 
 |   bool readStabs; | 
 |   bool hasStabs; | 
 |   bool hasDwarf; | 
 |   uint64_t hdrOffset;               // offset in .debug_info | 
 |   unsigned hwcprof;                 // hwcprof info status | 
 |   Vector<inst_info_t*> *infoList;   // merged list | 
 |   Vector<memop_info_t*> ldMemops;   // load instructions | 
 |   Vector<memop_info_t*> stMemops;   // store instructions | 
 |   Vector<memop_info_t*> pfMemops;   // prefetch instructions | 
 |   Vector<target_info_t*> bTargets;  // branch targets | 
 |   Vector<datatype_t*> *datatypes;   // object type descriptors | 
 |   Vector<SourceFile*> *includes; | 
 |   Module *indexStabsLink;           // correspondent module for the .o file | 
 |   InlinedSubr *inlinedSubr; | 
 |  | 
 | protected: | 
 |   void removeStabsTmp (); // Remove temporary *.o (got from *.a) | 
 |  | 
 |   // Check timestamp, warn users if src/dis/stabs later than exp. | 
 |   Anno_Errors checkTimeStamp (bool chkDis); | 
 |  | 
 |   // Set paths for reading Stabs and Symbols | 
 |   bool read_ar (int ar, int obj, char *obj_base); | 
 |   bool setFile (); | 
 |  | 
 |   // Open appropriate symbol tables, construct set of PC ranges, | 
 |   //	and maps to source lines for each PC | 
 |   Stabs *openDebugInfo (); | 
 |  | 
 |   // Construct PC index table | 
 |   bool openDisPC (); | 
 |  | 
 |   // Compute data--scan data to compute metrics per-src-line/dis-line | 
 |   bool computeMetrics (DbeView *dbev, Function *func, MetricList *mlist, | 
 | 		       Histable::Type type, bool src_metric, | 
 | 		       bool func_scope, SourceFile *source); | 
 |   void init_line (); | 
 |   void init_index (Hist_data *witems, int &wlindex, int &wmsize, int &wmindex); | 
 |  | 
 |   void set_src_data (Function *func, int vis_bits, int cmpline_visible, | 
 | 		     int funcline_visible); | 
 |   void set_dis_data (Function *func, int vis_bits, int cmpline_visible, | 
 | 		     int src_visible, bool hex_vis, bool func_scope, | 
 | 		     int funcline_visible); | 
 |   void set_src (Anno_Types type, DbeLine *dbeline); | 
 |   void set_dis (DbeInstr *instr, Anno_Types type, bool nextFile, char *dis_str); | 
 |   void set_MPSlave (); | 
 |   void set_one (Hist_data::HistItem *org_item, Anno_Types type, const char *text); | 
 |   void set_ComCom (int vis_bits); | 
 |  | 
 |   virtual char *get_disasm (uint64_t inst_address, uint64_t end_address, | 
 | 			    uint64_t start_address, uint64_t f_offset, | 
 | 			    int64_t &inst_size); | 
 |  | 
 |   Anno_Errors status; | 
 |   Anno_Errors openSourceFlag; | 
 |   bool hexVisible;          // show hex code in disasm | 
 |   time_t disMTime;          // Creating time for disassembly | 
 |   time_t stabsMTime;        // Creating time for stabs | 
 |   SourceFile *main_source; | 
 |   SourceFile *curr_inc;     // pointer to include file or NULL | 
 |   SourceFile *srcContext; | 
 |   Vector<ComC*> *comComs;   // table of compiler comments | 
 |   Disasm *disasm; | 
 |   Hist_data *src_items; | 
 |   Hist_data *dis_items; | 
 |   Hist_data *data_items; | 
 |   DbeView * cur_dbev; | 
 |   TValue *total; | 
 |   TValue *maximum; | 
 |   TValue *maximum_inc; | 
 |   TValue *empty; | 
 |   int name_idx;         // index of name metric in list for src/dis | 
 |   int size_index;       // index of size metric in list for src/dis | 
 |   int addr_index;       // index of address metric in list for src/dis | 
 |  | 
 |   int curline;          // line# of next source line to be processed | 
 |   int cindex, cline;    // index and src line of next compiler-comment | 
 |   int sindex, sline;    // index and src line of next item in src_items | 
 |   int dindex; | 
 |   DbeInstr *daddr;      // pointer to next DbeInstr with metrics | 
 |   int mindex;           // MP index and src line of next metric-value | 
 |   int mline;            // MP line to be processed by source | 
 |  | 
 |   char *disPath;        // path for disassembly | 
 |   char *stabsPath;      // path for reading stabs | 
 |   char *stabsTmp;       // temporary *.o from *.a | 
 |   char *disName;        // library/path for disassembly | 
 |   char *stabsName;      // library/path for stabs | 
 | }; | 
 |  | 
 | #endif /* _MODULE_H */ |