aboutsummaryrefslogtreecommitdiff
path: root/gdb/buildsym.h
blob: 32a2e1b7b7b2aa913401a7e83752ff8a341b043c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/* Build symbol tables in GDB's internal format.
   Copyright (C) 1986-2018 Free Software Foundation, Inc.

   This file is part of GDB.

   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 of the License, 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, see <http://www.gnu.org/licenses/>.  */

#if !defined (BUILDSYM_H)
#define BUILDSYM_H 1

struct objfile;
struct symbol;
struct addrmap;
struct compunit_symtab;
enum language;

/* This module provides definitions used for creating and adding to
   the symbol table.  These routines are called from various symbol-
   file-reading routines.

   They originated in dbxread.c of gdb-4.2, and were split out to
   make xcoffread.c more maintainable by sharing code.

   Variables declared in this file can be defined by #define-ing the
   name EXTERN to null.  It is used to declare variables that are
   normally extern, but which get defined in a single module using
   this technique.  */

struct block;
struct pending_block;

struct dynamic_prop;

#ifndef EXTERN
#define	EXTERN extern
#endif

/* The list of sub-source-files within the current individual
   compilation.  Each file gets its own symtab with its own linetable
   and associated info, but they all share one blockvector.  */

struct subfile
{
  struct subfile *next;
  /* Space for this is malloc'd.  */
  char *name;
  /* Space for this is malloc'd.  */
  struct linetable *line_vector;
  int line_vector_length;
  /* The "containing" compunit.  */
  struct buildsym_compunit *buildsym_compunit;
  enum language language;
  struct symtab *symtab;
};

EXTERN struct subfile *current_subfile;

/* Record the symbols defined for each context in a list.  We don't
   create a struct block for the context until we know how long to
   make it.  */

#define PENDINGSIZE 100

struct pending
  {
    struct pending *next;
    int nsyms;
    struct symbol *symbol[PENDINGSIZE];
  };

/* Here are the three lists that symbols are put on.  */

/* static at top level, and types */

EXTERN struct pending *file_symbols;

/* global functions and variables */

EXTERN struct pending *global_symbols;

/* everything local to lexical context */

EXTERN struct pending *local_symbols;

/* Stack representing unclosed lexical contexts (that will become
   blocks, eventually).  */

struct context_stack
  {
    /* Outer locals at the time we entered */

    struct pending *locals;

    /* Pending using directives at the time we entered.  */

    struct using_direct *local_using_directives;

    /* Pointer into blocklist as of entry */

    struct pending_block *old_blocks;

    /* Name of function, if any, defining context */

    struct symbol *name;

    /* Expression that computes the frame base of the lexically enclosing
       function, if any.  NULL otherwise.  */

    struct dynamic_prop *static_link;

    /* PC where this context starts */

    CORE_ADDR start_addr;

    /* Temp slot for exception handling.  */

    CORE_ADDR end_addr;

    /* For error-checking matching push/pop */

    int depth;

  };

/* The type of the record_line function.  */
typedef void (record_line_ftype) (struct subfile *subfile, int line,
				  CORE_ADDR pc);



extern void add_symbol_to_list (struct symbol *symbol,
				struct pending **listhead);

extern struct symbol *find_symbol_in_list (struct pending *list,
					   char *name, int length);

extern struct block *finish_block (struct symbol *symbol,
				   struct pending **listhead,
				   struct pending_block *old_blocks,
				   const struct dynamic_prop *static_link,
				   CORE_ADDR start,
				   CORE_ADDR end);

extern void record_block_range (struct block *,
                                CORE_ADDR start, CORE_ADDR end_inclusive);

class scoped_free_pendings
{
public:

  scoped_free_pendings ();
  ~scoped_free_pendings ();

  DISABLE_COPY_AND_ASSIGN (scoped_free_pendings);
};

extern void start_subfile (const char *name);

extern void patch_subfile_names (struct subfile *subfile, const char *name);

extern void push_subfile ();

extern const char *pop_subfile ();

extern struct block *end_symtab_get_static_block (CORE_ADDR end_addr,
						  int expandable,
						  int required);

extern struct compunit_symtab *
  end_symtab_from_static_block (struct block *static_block,
				int section, int expandable);

extern struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);

extern struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr,
						      int section);

extern void augment_type_symtab (void);

extern void buildsym_init ();

extern struct context_stack *push_context (int desc, CORE_ADDR valu);

extern struct context_stack pop_context ();

extern record_line_ftype record_line;

extern struct compunit_symtab *start_symtab (struct objfile *objfile,
					     const char *name,
					     const char *comp_dir,
					     CORE_ADDR start_addr,
					     enum language language);

extern void restart_symtab (struct compunit_symtab *cust,
			    const char *name, CORE_ADDR start_addr);

/* Record the name of the debug format in the current pending symbol
   table.  FORMAT must be a string with a lifetime at least as long as
   the symtab's objfile.  */

extern void record_debugformat (const char *format);

/* Record the name of the debuginfo producer (usually the compiler) in
   the current pending symbol table.  PRODUCER must be a string with a
   lifetime at least as long as the symtab's objfile.  */

extern void record_producer (const char *producer);

/* Set the name of the last source file.  NAME is copied by this
   function.  */

extern void set_last_source_file (const char *name);

/* Fetch the name of the last source file.  */

extern const char *get_last_source_file (void);

/* Return the compunit symtab object.
   It is only valid to call this between calls to start_symtab and the
   end_symtab* functions.  */

extern struct compunit_symtab *buildsym_compunit_symtab (void);

/* Return the macro table.
   Initialize it if this is the first use.
   It is only valid to call this between calls to start_symtab and the
   end_symtab* functions.  */

extern struct macro_table *get_macro_table (void);

/* Set the last source start address.  Can only be used between
   start_symtab and end_symtab* calls.  */

extern void set_last_source_start_addr (CORE_ADDR addr);

/* Get the last source start address.  Can only be used between
   start_symtab and end_symtab* calls.  */

extern CORE_ADDR get_last_source_start_addr ();

/* Return the local using directives.  */

extern struct using_direct **get_local_using_directives ();

/* Set the list of local using directives.  */

extern void set_local_using_directives (struct using_direct *new_local);

/* Return the global using directives.  */

extern struct using_direct **get_global_using_directives ();

/* True if the context stack is empty.  */

extern bool outermost_context_p ();

/* Return the top of the context stack, or nullptr if there is an
   entry.  */

extern struct context_stack *get_current_context_stack ();

/* Return the context stack depth.  */

extern int get_context_stack_depth ();

#undef EXTERN

#endif /* defined (BUILDSYM_H) */