1*f22f0ef4Schristos /* Copyright (C) 2021 Free Software Foundation, Inc. 2*f22f0ef4Schristos Contributed by Oracle. 3*f22f0ef4Schristos 4*f22f0ef4Schristos This file is part of GNU Binutils. 5*f22f0ef4Schristos 6*f22f0ef4Schristos This program is free software; you can redistribute it and/or modify 7*f22f0ef4Schristos it under the terms of the GNU General Public License as published by 8*f22f0ef4Schristos the Free Software Foundation; either version 3, or (at your option) 9*f22f0ef4Schristos any later version. 10*f22f0ef4Schristos 11*f22f0ef4Schristos This program is distributed in the hope that it will be useful, 12*f22f0ef4Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 13*f22f0ef4Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*f22f0ef4Schristos GNU General Public License for more details. 15*f22f0ef4Schristos 16*f22f0ef4Schristos You should have received a copy of the GNU General Public License 17*f22f0ef4Schristos along with this program; if not, write to the Free Software 18*f22f0ef4Schristos Foundation, 51 Franklin Street - Fifth Floor, Boston, 19*f22f0ef4Schristos MA 02110-1301, USA. */ 20*f22f0ef4Schristos 21*f22f0ef4Schristos #ifndef _HISTABLE_H 22*f22f0ef4Schristos #define _HISTABLE_H 23*f22f0ef4Schristos 24*f22f0ef4Schristos // 25*f22f0ef4Schristos // The Histable class hierarchy is used to build up a representation of 26*f22f0ef4Schristos // the codeobjects (functions, modules, loadObjects, etc.) that make up the 27*f22f0ef4Schristos // text address space of a program. The hierarchy is as follows: 28*f22f0ef4Schristos // 29*f22f0ef4Schristos // Histable (public) 30*f22f0ef4Schristos // LoadObject (public) 31*f22f0ef4Schristos // Module (public) 32*f22f0ef4Schristos // Function (public) 33*f22f0ef4Schristos // 34*f22f0ef4Schristos // Dataobjects are objects from the data address space of a program. 35*f22f0ef4Schristos // The reason for calling the base class "Histable" is because these 36*f22f0ef4Schristos // objects are all valid objects for computing histograms on. 37*f22f0ef4Schristos 38*f22f0ef4Schristos // A Histable object represents an object in the program text or data. 39*f22f0ef4Schristos 40*f22f0ef4Schristos #include "dbe_structs.h" 41*f22f0ef4Schristos #include "Emsg.h" 42*f22f0ef4Schristos #include "Expression.h" 43*f22f0ef4Schristos 44*f22f0ef4Schristos class DataObject; 45*f22f0ef4Schristos class Function; 46*f22f0ef4Schristos class SourceFile; 47*f22f0ef4Schristos class DbeFile; 48*f22f0ef4Schristos class DbeLine; 49*f22f0ef4Schristos template <class ITEM> class Vector; 50*f22f0ef4Schristos 51*f22f0ef4Schristos class Histable 52*f22f0ef4Schristos { 53*f22f0ef4Schristos friend class Hist_data; 54*f22f0ef4Schristos public: 55*f22f0ef4Schristos 56*f22f0ef4Schristos enum Type 57*f22f0ef4Schristos { 58*f22f0ef4Schristos INSTR, LINE, FUNCTION, MODULE, LOADOBJECT, 59*f22f0ef4Schristos EADDR, MEMOBJ, INDEXOBJ, PAGE, DOBJECT, 60*f22f0ef4Schristos SOURCEFILE, IOACTFILE, IOACTVFD, IOCALLSTACK, 61*f22f0ef4Schristos HEAPCALLSTACK, EXPERIMENT, OTHER 62*f22f0ef4Schristos }; 63*f22f0ef4Schristos 64*f22f0ef4Schristos // NameFormat for functions and function based objects 65*f22f0ef4Schristos 66*f22f0ef4Schristos enum NameFormat 67*f22f0ef4Schristos { 68*f22f0ef4Schristos NA, LONG, SHORT, MANGLED, SONAME = 0x10 69*f22f0ef4Schristos }; 70*f22f0ef4Schristos 71*f22f0ef4Schristos static NameFormat 72*f22f0ef4Schristos make_fmt (int fnfmt, bool sofmt = false) 73*f22f0ef4Schristos { 74*f22f0ef4Schristos return (NameFormat) (sofmt ? fnfmt | SONAME : fnfmt); 75*f22f0ef4Schristos } 76*f22f0ef4Schristos 77*f22f0ef4Schristos static int fname_fmt(NameFormat fmt)78*f22f0ef4Schristos fname_fmt (NameFormat fmt) 79*f22f0ef4Schristos { 80*f22f0ef4Schristos return (fmt & ~SONAME); 81*f22f0ef4Schristos } 82*f22f0ef4Schristos 83*f22f0ef4Schristos static bool soname_fmt(NameFormat fmt)84*f22f0ef4Schristos soname_fmt (NameFormat fmt) 85*f22f0ef4Schristos { 86*f22f0ef4Schristos return (fmt & SONAME); 87*f22f0ef4Schristos } 88*f22f0ef4Schristos 89*f22f0ef4Schristos Histable (); 90*f22f0ef4Schristos char *dump (); 91*f22f0ef4Schristos 92*f22f0ef4Schristos virtual ~Histable (); 93*f22f0ef4Schristos 94*f22f0ef4Schristos virtual char * 95*f22f0ef4Schristos get_name (NameFormat = NA) 96*f22f0ef4Schristos { 97*f22f0ef4Schristos return name; // Return the name of the object 98*f22f0ef4Schristos } 99*f22f0ef4Schristos 100*f22f0ef4Schristos virtual void set_name(char * _name)101*f22f0ef4Schristos set_name (char * _name) 102*f22f0ef4Schristos { 103*f22f0ef4Schristos name = _name; 104*f22f0ef4Schristos } 105*f22f0ef4Schristos set_name_from_context(Expression::Context *)106*f22f0ef4Schristos virtual void set_name_from_context (Expression::Context *) { } 107*f22f0ef4Schristos virtual Type get_type () = 0; 108*f22f0ef4Schristos 109*f22f0ef4Schristos virtual int64_t get_size()110*f22f0ef4Schristos get_size () 111*f22f0ef4Schristos { 112*f22f0ef4Schristos return 0; 113*f22f0ef4Schristos } 114*f22f0ef4Schristos 115*f22f0ef4Schristos virtual uint64_t get_addr()116*f22f0ef4Schristos get_addr () 117*f22f0ef4Schristos { 118*f22f0ef4Schristos return 0ULL; 119*f22f0ef4Schristos } 120*f22f0ef4Schristos 121*f22f0ef4Schristos virtual Vector<Histable*> *get_comparable_objs (); 122*f22f0ef4Schristos Histable *get_compare_obj (); 123*f22f0ef4Schristos 124*f22f0ef4Schristos virtual Histable * 125*f22f0ef4Schristos convertto (Type, Histable* = NULL) 126*f22f0ef4Schristos { 127*f22f0ef4Schristos return this; 128*f22f0ef4Schristos } 129*f22f0ef4Schristos 130*f22f0ef4Schristos Vector<Histable*> *comparable_objs; 131*f22f0ef4Schristos int64_t id; // A unique id of this object, within its specific Type 132*f22f0ef4Schristos 133*f22f0ef4Schristos protected: 134*f22f0ef4Schristos char *name; // Object name 135*f22f0ef4Schristos int phaseCompareIdx; 136*f22f0ef4Schristos void update_comparable_objs (); 137*f22f0ef4Schristos void dump_comparable_objs (); 138*f22f0ef4Schristos char *type_to_string (); 139*f22f0ef4Schristos void delete_comparable_objs (); 140*f22f0ef4Schristos }; 141*f22f0ef4Schristos 142*f22f0ef4Schristos typedef Histable::Type Histable_type; 143*f22f0ef4Schristos 144*f22f0ef4Schristos // An Other object represents some random histable object 145*f22f0ef4Schristos class Other : public Histable 146*f22f0ef4Schristos { 147*f22f0ef4Schristos public: 148*f22f0ef4Schristos 149*f22f0ef4Schristos virtual Type get_type()150*f22f0ef4Schristos get_type () 151*f22f0ef4Schristos { 152*f22f0ef4Schristos return OTHER; 153*f22f0ef4Schristos } 154*f22f0ef4Schristos 155*f22f0ef4Schristos uint64_t value64; 156*f22f0ef4Schristos uint32_t tag; 157*f22f0ef4Schristos }; 158*f22f0ef4Schristos 159*f22f0ef4Schristos // DbeInstr represents an instruction. 160*f22f0ef4Schristos // 161*f22f0ef4Schristos // Used by Analyzer for: Disassembly, PCs, Timeline, and Event tabs. 162*f22f0ef4Schristos // 163*f22f0ef4Schristos class DbeInstr : public Histable 164*f22f0ef4Schristos { 165*f22f0ef4Schristos public: 166*f22f0ef4Schristos DbeInstr (uint64_t _id, int _flags, Function *_func, uint64_t _addr); 167*f22f0ef4Schristos 168*f22f0ef4Schristos virtual Type get_type()169*f22f0ef4Schristos get_type () 170*f22f0ef4Schristos { 171*f22f0ef4Schristos return INSTR; 172*f22f0ef4Schristos } 173*f22f0ef4Schristos 174*f22f0ef4Schristos virtual char *get_name (NameFormat = NA); 175*f22f0ef4Schristos virtual int64_t get_size (); 176*f22f0ef4Schristos virtual uint64_t get_addr (); 177*f22f0ef4Schristos virtual Histable *convertto (Type type, Histable *obj = NULL); 178*f22f0ef4Schristos DbeLine *mapPCtoLine (SourceFile *sf); 179*f22f0ef4Schristos void add_inlined_info (StringBuilder *sb); 180*f22f0ef4Schristos char *get_descriptor (); 181*f22f0ef4Schristos int pc_cmp (DbeInstr *instr2); 182*f22f0ef4Schristos 183*f22f0ef4Schristos uint64_t addr; 184*f22f0ef4Schristos uint64_t img_offset; // file offset of the image 185*f22f0ef4Schristos int flags; 186*f22f0ef4Schristos Function *func; 187*f22f0ef4Schristos int lineno; 188*f22f0ef4Schristos int inlinedInd; 189*f22f0ef4Schristos int64_t size; 190*f22f0ef4Schristos bool isUsed; 191*f22f0ef4Schristos 192*f22f0ef4Schristos private: 193*f22f0ef4Schristos NameFormat current_name_format; 194*f22f0ef4Schristos }; 195*f22f0ef4Schristos 196*f22f0ef4Schristos class DbeEA : public Histable 197*f22f0ef4Schristos { 198*f22f0ef4Schristos public: 199*f22f0ef4Schristos DbeEA(DataObject * _dobj,Vaddr _eaddr)200*f22f0ef4Schristos DbeEA (DataObject *_dobj, Vaddr _eaddr) 201*f22f0ef4Schristos { 202*f22f0ef4Schristos dobj = _dobj; 203*f22f0ef4Schristos eaddr = _eaddr; 204*f22f0ef4Schristos }; 205*f22f0ef4Schristos 206*f22f0ef4Schristos virtual Type get_type()207*f22f0ef4Schristos get_type () 208*f22f0ef4Schristos { 209*f22f0ef4Schristos return EADDR; 210*f22f0ef4Schristos }; 211*f22f0ef4Schristos 212*f22f0ef4Schristos virtual int64_t get_size()213*f22f0ef4Schristos get_size () 214*f22f0ef4Schristos { 215*f22f0ef4Schristos return 1; 216*f22f0ef4Schristos }; 217*f22f0ef4Schristos 218*f22f0ef4Schristos virtual uint64_t get_addr()219*f22f0ef4Schristos get_addr () 220*f22f0ef4Schristos { 221*f22f0ef4Schristos return eaddr; 222*f22f0ef4Schristos }; 223*f22f0ef4Schristos 224*f22f0ef4Schristos virtual char *get_name (NameFormat = NA); 225*f22f0ef4Schristos virtual Histable *convertto (Type type, Histable *obj = NULL); 226*f22f0ef4Schristos 227*f22f0ef4Schristos DataObject *dobj; 228*f22f0ef4Schristos Vaddr eaddr; 229*f22f0ef4Schristos }; 230*f22f0ef4Schristos 231*f22f0ef4Schristos // DbeLine represents a line in a source file. 232*f22f0ef4Schristos // 233*f22f0ef4Schristos // For each top-level DbeLine instance, there are three DbeLine subtypes: 234*f22f0ef4Schristos // 235*f22f0ef4Schristos // A The top-level DbeLine is associated with a sourceFile & lineno, but 236*f22f0ef4Schristos // not any particular function. This form of DbeLine is used 237*f22f0ef4Schristos // to represent Analyzer Source tab lines. 238*f22f0ef4Schristos // 239*f22f0ef4Schristos // B Function-specific lines, those associated with a function in addition 240*f22f0ef4Schristos // to the the sourceFile & lineno, are stored in a linked list. 241*f22f0ef4Schristos // (see "dbeline_func_next"). 242*f22f0ef4Schristos // This subtype is used to differentiate a line found in #included source 243*f22f0ef4Schristos // that is referenced by multiple functions. 244*f22f0ef4Schristos // It is used in the Analyzer Lines tab. 245*f22f0ef4Schristos // 246*f22f0ef4Schristos // C Function-specific "lines" that don't have line number info are referenced 247*f22f0ef4Schristos // from each linked-list element's "dbeline_func_pseudo" field. 248*f22f0ef4Schristos // This subtype is needed when a binary doesn't identify line numbers. 249*f22f0ef4Schristos // It is used in the Analyzer Lines tab. 250*f22f0ef4Schristos // 251*f22f0ef4Schristos // When the user switches views between tabs, a selected object in the old 252*f22f0ef4Schristos // tab must be translated to an approprate object in the new tab. 253*f22f0ef4Schristos // When switching to the Source Tab, the top-level DbeLine (dbeline_base) 254*f22f0ef4Schristos // should be used. 255*f22f0ef4Schristos // When switching to the Lines Tab, a function-specific dbeline_func_* 256*f22f0ef4Schristos // should be used. 257*f22f0ef4Schristos // 258*f22f0ef4Schristos 259*f22f0ef4Schristos class DbeLine : public Histable 260*f22f0ef4Schristos { 261*f22f0ef4Schristos public: 262*f22f0ef4Schristos 263*f22f0ef4Schristos enum Flag 264*f22f0ef4Schristos { 265*f22f0ef4Schristos OMPPRAGMA = 1 266*f22f0ef4Schristos }; 267*f22f0ef4Schristos 268*f22f0ef4Schristos DbeLine (Function *_func, SourceFile *sf, int _lineno); 269*f22f0ef4Schristos virtual ~DbeLine (); 270*f22f0ef4Schristos virtual char *get_name (NameFormat = NA); 271*f22f0ef4Schristos virtual int64_t get_size (); 272*f22f0ef4Schristos virtual uint64_t get_addr (); 273*f22f0ef4Schristos virtual Histable *convertto (Type type, Histable *obj = NULL); 274*f22f0ef4Schristos 275*f22f0ef4Schristos void init_Offset (uint64_t p_offset); 276*f22f0ef4Schristos int line_cmp (DbeLine *dbl); 277*f22f0ef4Schristos 278*f22f0ef4Schristos virtual Type get_type()279*f22f0ef4Schristos get_type () 280*f22f0ef4Schristos { 281*f22f0ef4Schristos return LINE; 282*f22f0ef4Schristos } 283*f22f0ef4Schristos 284*f22f0ef4Schristos void set_flag(Flag flag)285*f22f0ef4Schristos set_flag (Flag flag) 286*f22f0ef4Schristos { 287*f22f0ef4Schristos flags |= flag; 288*f22f0ef4Schristos } 289*f22f0ef4Schristos 290*f22f0ef4Schristos bool is_set(Flag flag)291*f22f0ef4Schristos is_set (Flag flag) 292*f22f0ef4Schristos { 293*f22f0ef4Schristos return (flags & flag) != 0; 294*f22f0ef4Schristos } 295*f22f0ef4Schristos 296*f22f0ef4Schristos Function *func; // note: will be NULL in the base (head) dbeline 297*f22f0ef4Schristos int lineno; 298*f22f0ef4Schristos int64_t size; 299*f22f0ef4Schristos SourceFile *sourceFile; // Default source file 300*f22f0ef4Schristos SourceFile *include; // included source file or NULL 301*f22f0ef4Schristos 302*f22f0ef4Schristos DbeLine *dbeline_base; 303*f22f0ef4Schristos // Head of list, a dbeline associated with sourceFile & lineno, but not func: 304*f22f0ef4Schristos // dbeline_base->lineno: non-zero 305*f22f0ef4Schristos // dbeline_base->sourceFile: non-null 306*f22f0ef4Schristos // dbeline_base->func: NULL 307*f22f0ef4Schristos // dbeline_base->dbeline_base: this 308*f22f0ef4Schristos // dbeline_base->dbeline_func_next: first func-specific dbeline 309*f22f0ef4Schristos 310*f22f0ef4Schristos DbeLine *dbeline_func_next; 311*f22f0ef4Schristos // If non-null, pointer to a function-specific dbeline where: 312*f22f0ef4Schristos // dbeline_func_next->lineno: same as dbeline_base->lineno 313*f22f0ef4Schristos // dbeline_func_next->sourceFile: same as dbeline_base->sourceFile 314*f22f0ef4Schristos // dbeline_func_next->func: pointer to unique function 315*f22f0ef4Schristos // dbeline_func_next->dbeline_base: head of the linked list. 316*f22f0ef4Schristos // dbeline_func_next->dbeline_func_next: next function-specific dbeline. 317*f22f0ef4Schristos 318*f22f0ef4Schristos private: 319*f22f0ef4Schristos int current_name_format; 320*f22f0ef4Schristos int64_t offset; 321*f22f0ef4Schristos int flags; 322*f22f0ef4Schristos }; 323*f22f0ef4Schristos 324*f22f0ef4Schristos class HistableFile : public Histable, public DbeMessages 325*f22f0ef4Schristos { 326*f22f0ef4Schristos public: 327*f22f0ef4Schristos HistableFile (); 328*f22f0ef4Schristos 329*f22f0ef4Schristos bool isUsed; 330*f22f0ef4Schristos DbeFile *dbeFile; 331*f22f0ef4Schristos }; 332*f22f0ef4Schristos 333*f22f0ef4Schristos #endif /* _HISTABLE_H */ 334