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