diff options
Diffstat (limited to 'gprofng/src/Function.h')
-rw-r--r-- | gprofng/src/Function.h | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/gprofng/src/Function.h b/gprofng/src/Function.h new file mode 100644 index 0000000..b0a856b --- /dev/null +++ b/gprofng/src/Function.h @@ -0,0 +1,222 @@ +/* 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 _DBE_FUNCTION_H +#define _DBE_FUNCTION_H + +// A Function object represents an individual function in a .o file. + +#include "util.h" +#include "Histable.h" +#include "SourceFile.h" + +class Module; +class Symbol; +class InlinedSubr; +struct SrcInfo; +struct PCInfo; +template <class ITEM> class Vector; + +const uint64_t FUNC_NO_SAVE = (uint64_t) - 1; +const uint64_t FUNC_ROOT = (uint64_t) - 2; + +enum +{ + FUNC_FLAG_PLT = 1, + FUNC_FLAG_DYNAMIC = 2, + FUNC_FLAG_RESDER = 4, // set if derived function resolution has been done + FUNC_FLAG_NO_OFFSET = 8, // set if disassembly should not show offset from function + FUNC_FLAG_SIMULATED = 16, // not a real function like <Total>, <Unknown>, etc. + FUNC_FLAG_NATIVE = 32, // no byte code for JMethod + FUNC_NOT_JNI = 64, // a function name is not "Java_..." + FUNC_JNI_CHECKED = 128 // already checked for "Java_..." +}; + +const int MAXDBUF = 32768; // the longest demangled name handled + +class Function : public Histable +{ +public: + + enum MPFuncTypes + { + MPF_DOALL, + MPF_PAR, + MPF_SECT, + MPF_TASK, + MPF_CLONE, + MPF_OUTL + }; + + Function (uint64_t _id); + virtual ~Function (); + + virtual uint64_t get_addr (); + virtual char *get_name (NameFormat = NA); + virtual Vector<Histable*> *get_comparable_objs (); + virtual void set_name (char *); // Set the demangled name + virtual Histable *convertto (Histable_type type, Histable *obj = NULL); + + virtual Histable_type + get_type () + { + return FUNCTION; + }; + + virtual int64_t + get_size () + { + return size; + }; + + void set_comparable_name (const char *string); + void set_mangled_name (const char *string); + void set_match_name (const char *string); + + // Find any derived functions, and set their derivedNode + void findDerivedFunctions (); + void findKrakatoaDerivedFunctions (); + void add_PC_info (uint64_t offset, int lineno, SourceFile *cur_src = NULL); + void pushSrcFile (SourceFile* source, int lineno); + SourceFile *popSrcFile (); + int func_cmp (Function *func, SourceFile *srcContext = NULL); + void copy_PCInfo (Function *f); + DbeLine *mapPCtoLine (uint64_t addr, SourceFile *src = NULL); + DbeInstr *mapLineToPc (DbeLine *dbeLine); + DbeInstr *find_dbeinstr (int flag, uint64_t addr); + DbeInstr *create_hide_instr (DbeInstr *instr); + uint64_t find_previous_addr (uint64_t addr); + SourceFile *getDefSrc (); + char *getDefSrcName (); + void setDefSrc (SourceFile *sf); + void setLineFirst (int lineno); + Vector<SourceFile*> *get_sources (); + + char * + get_mangled_name () + { + return mangled_name; + } + + char * + get_match_name () + { + return match_name; + } + + inline Function * + cardinal () + { + return alias ? alias : this; + } + + unsigned int flags; // FUNC_FLAG_* + Module *module; // pointer to module containing source + int line_first; // range of line numbers for function + int line_last; + int64_t size; // size of the function in bytes + uint64_t save_addr; // used for detection of leaf routines + DbeInstr *derivedNode; // If derived from another function + bool isOutlineFunction; // if outline (save assumed) + unsigned int chksum; // check sum of instructions + char *img_fname; // file containing function image + uint64_t img_offset; // file offset of the image + SourceFile *curr_srcfile; + DbeLine *defaultDbeLine; + Function *usrfunc; // User function + Function *alias; + bool isUsed; + bool isHideFunc; + SourceFile *def_source; + Function *indexStabsLink; // correspondent function for the .o file + Symbol *elfSym; + InlinedSubr *inlinedSubr; + int inlinedSubrCnt; + +private: + DbeInstr **instHTable; // hash table for DbeInstr + int *addrIndexHTable; // hash table for addrs index + void setSource (); + PCInfo *lookup_PCInfo (uint64_t offset); + SrcInfo *new_srcInfo (); + + char *mangled_name; + char *match_name; // mangled name, with globalization stripped + char *comparable_name; // demangled name, with globalization and blanks stripped + char *name_buf; + NameFormat current_name_format; + Vector<PCInfo*> *linetab; + Vector<DbeInstr*> *instrs; + Vector<uint64_t> *addrs; + uint64_t instr_id; + Vector<SourceFile*> *sources; + SrcInfo *curr_srcinfo; // the current source stack of the function + SrcInfo *srcinfo_list; // master list for SrcInfo +}; + +class JMethod : public Function +{ +public: + JMethod (uint64_t _id); + virtual ~JMethod (); + virtual void set_name (char *); + virtual uint64_t get_addr (); + + void + set_addr (Vaddr _addr) + { + addr = _addr; + } + + uint64_t + get_mid () + { + return mid; + } + + void + set_mid (uint64_t _mid) + { + mid = _mid; + } + + char * + get_signature () + { + return signature; + } + + void + set_signature (const char *s) + { + signature = dbe_strdup (s); + } + + // Returns true if func's name matches method's as its JNI implementation + bool jni_match (Function *func); + +private: + uint64_t mid; + Vaddr addr; + char *signature; + Function *jni_function; +}; + +#endif /* _DBE_FUNCTION_H */ |