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
30class Module;
31class Symbol;
32class InlinedSubr;
33struct SrcInfo;
34struct PCInfo;
35template <class ITEM> class Vector;
36
37const uint64_t FUNC_NO_SAVE = (uint64_t) - 1;
38const uint64_t FUNC_ROOT = (uint64_t) - 2;
39
40enum
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
52const int MAXDBUF = 32768; // the longest demangled name handled
53
54class Function : public Histable
55{
56public:
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
78  get_type ()
79  {
80    return FUNCTION;
81  };
82
83  virtual int64_t
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 *
113  get_mangled_name ()
114  {
115    return mangled_name;
116  }
117
118  char *
119  get_match_name ()
120  {
121    return match_name;
122  }
123
124  inline Function *
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
153private:
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
174class JMethod : public Function
175{
176public:
177  JMethod (uint64_t _id);
178  virtual ~JMethod ();
179  virtual void set_name (char *);
180  virtual uint64_t get_addr ();
181
182  void
183  set_addr (Vaddr _addr)
184  {
185    addr = _addr;
186  }
187
188  uint64_t
189  get_mid ()
190  {
191    return mid;
192  }
193
194  void
195  set_mid (uint64_t _mid)
196  {
197    mid = _mid;
198  }
199
200  char *
201  get_signature ()
202  {
203    return signature;
204  }
205
206  void
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
215private:
216  uint64_t mid;
217  Vaddr addr;
218  char *signature;
219  Function *jni_function;
220};
221
222#endif /* _DBE_FUNCTION_H */
223