| /* Copyright (C) 2021-2024 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 */ |