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 _DBE_FUNCTION_H 22*f22f0ef4Schristos #define _DBE_FUNCTION_H 23*f22f0ef4Schristos 24*f22f0ef4Schristos // A Function object represents an individual function in a .o file. 25*f22f0ef4Schristos 26*f22f0ef4Schristos #include "util.h" 27*f22f0ef4Schristos #include "Histable.h" 28*f22f0ef4Schristos #include "SourceFile.h" 29*f22f0ef4Schristos 30*f22f0ef4Schristos class Module; 31*f22f0ef4Schristos class Symbol; 32*f22f0ef4Schristos class InlinedSubr; 33*f22f0ef4Schristos struct SrcInfo; 34*f22f0ef4Schristos struct PCInfo; 35*f22f0ef4Schristos template <class ITEM> class Vector; 36*f22f0ef4Schristos 37*f22f0ef4Schristos const uint64_t FUNC_NO_SAVE = (uint64_t) - 1; 38*f22f0ef4Schristos const uint64_t FUNC_ROOT = (uint64_t) - 2; 39*f22f0ef4Schristos 40*f22f0ef4Schristos enum 41*f22f0ef4Schristos { 42*f22f0ef4Schristos FUNC_FLAG_PLT = 1, 43*f22f0ef4Schristos FUNC_FLAG_DYNAMIC = 2, 44*f22f0ef4Schristos FUNC_FLAG_RESDER = 4, // set if derived function resolution has been done 45*f22f0ef4Schristos FUNC_FLAG_NO_OFFSET = 8, // set if disassembly should not show offset from function 46*f22f0ef4Schristos FUNC_FLAG_SIMULATED = 16, // not a real function like <Total>, <Unknown>, etc. 47*f22f0ef4Schristos FUNC_FLAG_NATIVE = 32, // no byte code for JMethod 48*f22f0ef4Schristos FUNC_NOT_JNI = 64, // a function name is not "Java_..." 49*f22f0ef4Schristos FUNC_JNI_CHECKED = 128 // already checked for "Java_..." 50*f22f0ef4Schristos }; 51*f22f0ef4Schristos 52*f22f0ef4Schristos const int MAXDBUF = 32768; // the longest demangled name handled 53*f22f0ef4Schristos 54*f22f0ef4Schristos class Function : public Histable 55*f22f0ef4Schristos { 56*f22f0ef4Schristos public: 57*f22f0ef4Schristos 58*f22f0ef4Schristos enum MPFuncTypes 59*f22f0ef4Schristos { 60*f22f0ef4Schristos MPF_DOALL, 61*f22f0ef4Schristos MPF_PAR, 62*f22f0ef4Schristos MPF_SECT, 63*f22f0ef4Schristos MPF_TASK, 64*f22f0ef4Schristos MPF_CLONE, 65*f22f0ef4Schristos MPF_OUTL 66*f22f0ef4Schristos }; 67*f22f0ef4Schristos 68*f22f0ef4Schristos Function (uint64_t _id); 69*f22f0ef4Schristos virtual ~Function (); 70*f22f0ef4Schristos 71*f22f0ef4Schristos virtual uint64_t get_addr (); 72*f22f0ef4Schristos virtual char *get_name (NameFormat = NA); 73*f22f0ef4Schristos virtual Vector<Histable*> *get_comparable_objs (); 74*f22f0ef4Schristos virtual void set_name (char *); // Set the demangled name 75*f22f0ef4Schristos virtual Histable *convertto (Histable_type type, Histable *obj = NULL); 76*f22f0ef4Schristos 77*f22f0ef4Schristos virtual Histable_type get_type()78*f22f0ef4Schristos get_type () 79*f22f0ef4Schristos { 80*f22f0ef4Schristos return FUNCTION; 81*f22f0ef4Schristos }; 82*f22f0ef4Schristos 83*f22f0ef4Schristos virtual int64_t get_size()84*f22f0ef4Schristos get_size () 85*f22f0ef4Schristos { 86*f22f0ef4Schristos return size; 87*f22f0ef4Schristos }; 88*f22f0ef4Schristos 89*f22f0ef4Schristos void set_comparable_name (const char *string); 90*f22f0ef4Schristos void set_mangled_name (const char *string); 91*f22f0ef4Schristos void set_match_name (const char *string); 92*f22f0ef4Schristos 93*f22f0ef4Schristos // Find any derived functions, and set their derivedNode 94*f22f0ef4Schristos void findDerivedFunctions (); 95*f22f0ef4Schristos void findKrakatoaDerivedFunctions (); 96*f22f0ef4Schristos void add_PC_info (uint64_t offset, int lineno, SourceFile *cur_src = NULL); 97*f22f0ef4Schristos void pushSrcFile (SourceFile* source, int lineno); 98*f22f0ef4Schristos SourceFile *popSrcFile (); 99*f22f0ef4Schristos int func_cmp (Function *func, SourceFile *srcContext = NULL); 100*f22f0ef4Schristos void copy_PCInfo (Function *f); 101*f22f0ef4Schristos DbeLine *mapPCtoLine (uint64_t addr, SourceFile *src = NULL); 102*f22f0ef4Schristos DbeInstr *mapLineToPc (DbeLine *dbeLine); 103*f22f0ef4Schristos DbeInstr *find_dbeinstr (int flag, uint64_t addr); 104*f22f0ef4Schristos DbeInstr *create_hide_instr (DbeInstr *instr); 105*f22f0ef4Schristos uint64_t find_previous_addr (uint64_t addr); 106*f22f0ef4Schristos SourceFile *getDefSrc (); 107*f22f0ef4Schristos char *getDefSrcName (); 108*f22f0ef4Schristos void setDefSrc (SourceFile *sf); 109*f22f0ef4Schristos void setLineFirst (int lineno); 110*f22f0ef4Schristos Vector<SourceFile*> *get_sources (); 111*f22f0ef4Schristos 112*f22f0ef4Schristos char * get_mangled_name()113*f22f0ef4Schristos get_mangled_name () 114*f22f0ef4Schristos { 115*f22f0ef4Schristos return mangled_name; 116*f22f0ef4Schristos } 117*f22f0ef4Schristos 118*f22f0ef4Schristos char * get_match_name()119*f22f0ef4Schristos get_match_name () 120*f22f0ef4Schristos { 121*f22f0ef4Schristos return match_name; 122*f22f0ef4Schristos } 123*f22f0ef4Schristos 124*f22f0ef4Schristos inline Function * cardinal()125*f22f0ef4Schristos cardinal () 126*f22f0ef4Schristos { 127*f22f0ef4Schristos return alias ? alias : this; 128*f22f0ef4Schristos } 129*f22f0ef4Schristos 130*f22f0ef4Schristos unsigned int flags; // FUNC_FLAG_* 131*f22f0ef4Schristos Module *module; // pointer to module containing source 132*f22f0ef4Schristos int line_first; // range of line numbers for function 133*f22f0ef4Schristos int line_last; 134*f22f0ef4Schristos int64_t size; // size of the function in bytes 135*f22f0ef4Schristos uint64_t save_addr; // used for detection of leaf routines 136*f22f0ef4Schristos DbeInstr *derivedNode; // If derived from another function 137*f22f0ef4Schristos bool isOutlineFunction; // if outline (save assumed) 138*f22f0ef4Schristos unsigned int chksum; // check sum of instructions 139*f22f0ef4Schristos char *img_fname; // file containing function image 140*f22f0ef4Schristos uint64_t img_offset; // file offset of the image 141*f22f0ef4Schristos SourceFile *curr_srcfile; 142*f22f0ef4Schristos DbeLine *defaultDbeLine; 143*f22f0ef4Schristos Function *usrfunc; // User function 144*f22f0ef4Schristos Function *alias; 145*f22f0ef4Schristos bool isUsed; 146*f22f0ef4Schristos bool isHideFunc; 147*f22f0ef4Schristos SourceFile *def_source; 148*f22f0ef4Schristos Function *indexStabsLink; // correspondent function for the .o file 149*f22f0ef4Schristos Symbol *elfSym; 150*f22f0ef4Schristos InlinedSubr *inlinedSubr; 151*f22f0ef4Schristos int inlinedSubrCnt; 152*f22f0ef4Schristos 153*f22f0ef4Schristos private: 154*f22f0ef4Schristos DbeInstr **instHTable; // hash table for DbeInstr 155*f22f0ef4Schristos int *addrIndexHTable; // hash table for addrs index 156*f22f0ef4Schristos void setSource (); 157*f22f0ef4Schristos PCInfo *lookup_PCInfo (uint64_t offset); 158*f22f0ef4Schristos SrcInfo *new_srcInfo (); 159*f22f0ef4Schristos 160*f22f0ef4Schristos char *mangled_name; 161*f22f0ef4Schristos char *match_name; // mangled name, with globalization stripped 162*f22f0ef4Schristos char *comparable_name; // demangled name, with globalization and blanks stripped 163*f22f0ef4Schristos char *name_buf; 164*f22f0ef4Schristos NameFormat current_name_format; 165*f22f0ef4Schristos Vector<PCInfo*> *linetab; 166*f22f0ef4Schristos Vector<DbeInstr*> *instrs; 167*f22f0ef4Schristos Vector<uint64_t> *addrs; 168*f22f0ef4Schristos uint64_t instr_id; 169*f22f0ef4Schristos Vector<SourceFile*> *sources; 170*f22f0ef4Schristos SrcInfo *curr_srcinfo; // the current source stack of the function 171*f22f0ef4Schristos SrcInfo *srcinfo_list; // master list for SrcInfo 172*f22f0ef4Schristos }; 173*f22f0ef4Schristos 174*f22f0ef4Schristos class JMethod : public Function 175*f22f0ef4Schristos { 176*f22f0ef4Schristos public: 177*f22f0ef4Schristos JMethod (uint64_t _id); 178*f22f0ef4Schristos virtual ~JMethod (); 179*f22f0ef4Schristos virtual void set_name (char *); 180*f22f0ef4Schristos virtual uint64_t get_addr (); 181*f22f0ef4Schristos 182*f22f0ef4Schristos void set_addr(Vaddr _addr)183*f22f0ef4Schristos set_addr (Vaddr _addr) 184*f22f0ef4Schristos { 185*f22f0ef4Schristos addr = _addr; 186*f22f0ef4Schristos } 187*f22f0ef4Schristos 188*f22f0ef4Schristos uint64_t get_mid()189*f22f0ef4Schristos get_mid () 190*f22f0ef4Schristos { 191*f22f0ef4Schristos return mid; 192*f22f0ef4Schristos } 193*f22f0ef4Schristos 194*f22f0ef4Schristos void set_mid(uint64_t _mid)195*f22f0ef4Schristos set_mid (uint64_t _mid) 196*f22f0ef4Schristos { 197*f22f0ef4Schristos mid = _mid; 198*f22f0ef4Schristos } 199*f22f0ef4Schristos 200*f22f0ef4Schristos char * get_signature()201*f22f0ef4Schristos get_signature () 202*f22f0ef4Schristos { 203*f22f0ef4Schristos return signature; 204*f22f0ef4Schristos } 205*f22f0ef4Schristos 206*f22f0ef4Schristos void set_signature(const char * s)207*f22f0ef4Schristos set_signature (const char *s) 208*f22f0ef4Schristos { 209*f22f0ef4Schristos signature = dbe_strdup (s); 210*f22f0ef4Schristos } 211*f22f0ef4Schristos 212*f22f0ef4Schristos // Returns true if func's name matches method's as its JNI implementation 213*f22f0ef4Schristos bool jni_match (Function *func); 214*f22f0ef4Schristos 215*f22f0ef4Schristos private: 216*f22f0ef4Schristos uint64_t mid; 217*f22f0ef4Schristos Vaddr addr; 218*f22f0ef4Schristos char *signature; 219*f22f0ef4Schristos Function *jni_function; 220*f22f0ef4Schristos }; 221*f22f0ef4Schristos 222*f22f0ef4Schristos #endif /* _DBE_FUNCTION_H */ 223