Retro68/binutils/gprofng/src/Module.h
Wolfgang Thaller f485e125c4 binutils 2.39
2022-10-27 20:45:45 +02:00

285 lines
8.3 KiB
C++

/* 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 */