aboutsummaryrefslogtreecommitdiff
path: root/gprofng/src/Module.h
diff options
context:
space:
mode:
Diffstat (limited to 'gprofng/src/Module.h')
-rw-r--r--gprofng/src/Module.h284
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 */