/* Copyright (C) 2021-2023 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 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 *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 *marks, int threshold, int vis_bits, int src_visible, bool hex_visible, bool func_scope, bool src_only, Vector *marks2d = NULL, Vector *marks2d_inc = NULL); Vector *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 *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 *infoList; // merged list Vector ldMemops; // load instructions Vector stMemops; // store instructions Vector pfMemops; // prefetch instructions Vector bTargets; // branch targets Vector *datatypes; // object type descriptors Vector *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 *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 */