diff options
Diffstat (limited to 'gprofng/src/Module.h')
-rw-r--r-- | gprofng/src/Module.h | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/gprofng/src/Module.h b/gprofng/src/Module.h new file mode 100644 index 0000000..39c4322 --- /dev/null +++ b/gprofng/src/Module.h @@ -0,0 +1,284 @@ +/* Copyright (C) 2021 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 */ |