| /* 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 _HISTABLE_H | |
| #define _HISTABLE_H | |
| // | |
| // The Histable class hierarchy is used to build up a representation of | |
| // the codeobjects (functions, modules, loadObjects, etc.) that make up the | |
| // text address space of a program. The hierarchy is as follows: | |
| // | |
| // Histable (public) | |
| // LoadObject (public) | |
| // Module (public) | |
| // Function (public) | |
| // | |
| // Dataobjects are objects from the data address space of a program. | |
| // The reason for calling the base class "Histable" is because these | |
| // objects are all valid objects for computing histograms on. | |
| // A Histable object represents an object in the program text or data. | |
| #include "dbe_structs.h" | |
| #include "Emsg.h" | |
| #include "Expression.h" | |
| class DataObject; | |
| class Function; | |
| class SourceFile; | |
| class DbeFile; | |
| class DbeLine; | |
| template <class ITEM> class Vector; | |
| class Histable | |
| { | |
| friend class Hist_data; | |
| public: | |
| enum Type | |
| { | |
| INSTR, LINE, FUNCTION, MODULE, LOADOBJECT, | |
| EADDR, MEMOBJ, INDEXOBJ, PAGE, DOBJECT, | |
| SOURCEFILE, IOACTFILE, IOACTVFD, IOCALLSTACK, | |
| HEAPCALLSTACK, EXPERIMENT, OTHER | |
| }; | |
| // NameFormat for functions and function based objects | |
| enum NameFormat | |
| { | |
| NA, LONG, SHORT, MANGLED, SONAME = 0x10 | |
| }; | |
| static NameFormat | |
| make_fmt (int fnfmt, bool sofmt = false) | |
| { | |
| return (NameFormat) (sofmt ? fnfmt | SONAME : fnfmt); | |
| } | |
| static int | |
| fname_fmt (NameFormat fmt) | |
| { | |
| return (fmt & ~SONAME); | |
| } | |
| static bool | |
| soname_fmt (NameFormat fmt) | |
| { | |
| return (fmt & SONAME); | |
| } | |
| Histable (); | |
| char *dump (); | |
| virtual ~Histable (); | |
| virtual char * | |
| get_name (NameFormat = NA) | |
| { | |
| return name; // Return the name of the object | |
| } | |
| virtual void | |
| set_name (char * _name) | |
| { | |
| name = _name; | |
| } | |
| virtual void set_name_from_context (Expression::Context *) { } | |
| virtual Type get_type () = 0; | |
| virtual int64_t | |
| get_size () | |
| { | |
| return 0; | |
| } | |
| virtual uint64_t | |
| get_addr () | |
| { | |
| return 0ULL; | |
| } | |
| virtual Vector<Histable*> *get_comparable_objs (); | |
| Histable *get_compare_obj (); | |
| virtual Histable * | |
| convertto (Type, Histable* = NULL) | |
| { | |
| return this; | |
| } | |
| Vector<Histable*> *comparable_objs; | |
| int64_t id; // A unique id of this object, within its specific Type | |
| protected: | |
| char *name; // Object name | |
| int phaseCompareIdx; | |
| void update_comparable_objs (); | |
| void dump_comparable_objs (); | |
| char *type_to_string (); | |
| void delete_comparable_objs (); | |
| }; | |
| typedef Histable::Type Histable_type; | |
| // An Other object represents some random histable object | |
| class Other : public Histable | |
| { | |
| public: | |
| virtual Type | |
| get_type () | |
| { | |
| return OTHER; | |
| } | |
| uint64_t value64; | |
| uint32_t tag; | |
| }; | |
| // DbeInstr represents an instruction. | |
| // | |
| // Used by Analyzer for: Disassembly, PCs, Timeline, and Event tabs. | |
| // | |
| class DbeInstr : public Histable | |
| { | |
| public: | |
| DbeInstr (uint64_t _id, int _flags, Function *_func, uint64_t _addr); | |
| virtual Type | |
| get_type () | |
| { | |
| return INSTR; | |
| } | |
| virtual char *get_name (NameFormat = NA); | |
| virtual int64_t get_size (); | |
| virtual uint64_t get_addr (); | |
| virtual Histable *convertto (Type type, Histable *obj = NULL); | |
| DbeLine *mapPCtoLine (SourceFile *sf); | |
| void add_inlined_info (StringBuilder *sb); | |
| char *get_descriptor (); | |
| int pc_cmp (DbeInstr *instr2); | |
| uint64_t addr; | |
| uint64_t img_offset; // file offset of the image | |
| int flags; | |
| Function *func; | |
| int lineno; | |
| int inlinedInd; | |
| int64_t size; | |
| bool isUsed; | |
| private: | |
| NameFormat current_name_format; | |
| }; | |
| class DbeEA : public Histable | |
| { | |
| public: | |
| DbeEA (DataObject *_dobj, Vaddr _eaddr) | |
| { | |
| dobj = _dobj; | |
| eaddr = _eaddr; | |
| }; | |
| virtual Type | |
| get_type () | |
| { | |
| return EADDR; | |
| }; | |
| virtual int64_t | |
| get_size () | |
| { | |
| return 1; | |
| }; | |
| virtual uint64_t | |
| get_addr () | |
| { | |
| return eaddr; | |
| }; | |
| virtual char *get_name (NameFormat = NA); | |
| virtual Histable *convertto (Type type, Histable *obj = NULL); | |
| DataObject *dobj; | |
| Vaddr eaddr; | |
| }; | |
| // DbeLine represents a line in a source file. | |
| // | |
| // For each top-level DbeLine instance, there are three DbeLine subtypes: | |
| // | |
| // A The top-level DbeLine is associated with a sourceFile & lineno, but | |
| // not any particular function. This form of DbeLine is used | |
| // to represent Analyzer Source tab lines. | |
| // | |
| // B Function-specific lines, those associated with a function in addition | |
| // to the the sourceFile & lineno, are stored in a linked list. | |
| // (see "dbeline_func_next"). | |
| // This subtype is used to differentiate a line found in #included source | |
| // that is referenced by multiple functions. | |
| // It is used in the Analyzer Lines tab. | |
| // | |
| // C Function-specific "lines" that don't have line number info are referenced | |
| // from each linked-list element's "dbeline_func_pseudo" field. | |
| // This subtype is needed when a binary doesn't identify line numbers. | |
| // It is used in the Analyzer Lines tab. | |
| // | |
| // When the user switches views between tabs, a selected object in the old | |
| // tab must be translated to an approprate object in the new tab. | |
| // When switching to the Source Tab, the top-level DbeLine (dbeline_base) | |
| // should be used. | |
| // When switching to the Lines Tab, a function-specific dbeline_func_* | |
| // should be used. | |
| // | |
| class DbeLine : public Histable | |
| { | |
| public: | |
| enum Flag | |
| { | |
| OMPPRAGMA = 1 | |
| }; | |
| DbeLine (Function *_func, SourceFile *sf, int _lineno); | |
| virtual ~DbeLine (); | |
| virtual char *get_name (NameFormat = NA); | |
| virtual int64_t get_size (); | |
| virtual uint64_t get_addr (); | |
| virtual Histable *convertto (Type type, Histable *obj = NULL); | |
| void init_Offset (uint64_t p_offset); | |
| int line_cmp (DbeLine *dbl); | |
| virtual Type | |
| get_type () | |
| { | |
| return LINE; | |
| } | |
| void | |
| set_flag (Flag flag) | |
| { | |
| flags |= flag; | |
| } | |
| bool | |
| is_set (Flag flag) | |
| { | |
| return (flags & flag) != 0; | |
| } | |
| Function *func; // note: will be NULL in the base (head) dbeline | |
| int lineno; | |
| int64_t size; | |
| SourceFile *sourceFile; // Default source file | |
| SourceFile *include; // included source file or NULL | |
| DbeLine *dbeline_base; | |
| // Head of list, a dbeline associated with sourceFile & lineno, but not func: | |
| // dbeline_base->lineno: non-zero | |
| // dbeline_base->sourceFile: non-null | |
| // dbeline_base->func: NULL | |
| // dbeline_base->dbeline_base: this | |
| // dbeline_base->dbeline_func_next: first func-specific dbeline | |
| DbeLine *dbeline_func_next; | |
| // If non-null, pointer to a function-specific dbeline where: | |
| // dbeline_func_next->lineno: same as dbeline_base->lineno | |
| // dbeline_func_next->sourceFile: same as dbeline_base->sourceFile | |
| // dbeline_func_next->func: pointer to unique function | |
| // dbeline_func_next->dbeline_base: head of the linked list. | |
| // dbeline_func_next->dbeline_func_next: next function-specific dbeline. | |
| private: | |
| int current_name_format; | |
| int64_t offset; | |
| int flags; | |
| }; | |
| class HistableFile : public Histable, public DbeMessages | |
| { | |
| public: | |
| HistableFile (); | |
| bool isUsed; | |
| DbeFile *dbeFile; | |
| }; | |
| #endif /* _HISTABLE_H */ |