Return unique_xmalloc_ptr for generate_c_for_variable_locations
[deliverable/binutils-gdb.git] / gdb / compile / compile-c-symbols.c
CommitLineData
bb2ec1b3
TT
1/* Convert symbols from GDB to GCC
2
e2882c85 3 Copyright (C) 2014-2018 Free Software Foundation, Inc.
bb2ec1b3
TT
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20
21#include "defs.h"
22#include "compile-internal.h"
bb2ec1b3
TT
23#include "symtab.h"
24#include "parser-defs.h"
25#include "block.h"
26#include "objfiles.h"
27#include "compile.h"
28#include "value.h"
29#include "exceptions.h"
30#include "gdbtypes.h"
31#include "dwarf2loc.h"
32
33\f
34
35/* Object of this type are stored in the compiler's symbol_err_map. */
36
37struct symbol_error
38{
39 /* The symbol. */
40
41 const struct symbol *sym;
42
43 /* The error message to emit. This is malloc'd and owned by the
44 hash table. */
45
46 char *message;
47};
48
49/* Hash function for struct symbol_error. */
50
51static hashval_t
52hash_symbol_error (const void *a)
53{
9a3c8263 54 const struct symbol_error *se = (const struct symbol_error *) a;
bb2ec1b3
TT
55
56 return htab_hash_pointer (se->sym);
57}
58
59/* Equality function for struct symbol_error. */
60
61static int
62eq_symbol_error (const void *a, const void *b)
63{
9a3c8263
SM
64 const struct symbol_error *sea = (const struct symbol_error *) a;
65 const struct symbol_error *seb = (const struct symbol_error *) b;
bb2ec1b3
TT
66
67 return sea->sym == seb->sym;
68}
69
70/* Deletion function for struct symbol_error. */
71
72static void
73del_symbol_error (void *a)
74{
9a3c8263 75 struct symbol_error *se = (struct symbol_error *) a;
bb2ec1b3
TT
76
77 xfree (se->message);
78 xfree (se);
79}
80
81/* Associate SYMBOL with some error text. */
82
83static void
84insert_symbol_error (htab_t hash, const struct symbol *sym, const char *text)
85{
86 struct symbol_error e;
87 void **slot;
88
89 e.sym = sym;
90 slot = htab_find_slot (hash, &e, INSERT);
91 if (*slot == NULL)
92 {
93 struct symbol_error *e = XNEW (struct symbol_error);
94
95 e->sym = sym;
96 e->message = xstrdup (text);
97 *slot = e;
98 }
99}
100
101/* Emit the error message corresponding to SYM, if one exists, and
102 arrange for it not to be emitted again. */
103
104static void
105error_symbol_once (struct compile_c_instance *context,
106 const struct symbol *sym)
107{
108 struct symbol_error search;
109 struct symbol_error *err;
bb2ec1b3
TT
110
111 if (context->symbol_err_map == NULL)
112 return;
113
114 search.sym = sym;
9a3c8263 115 err = (struct symbol_error *) htab_find (context->symbol_err_map, &search);
bb2ec1b3
TT
116 if (err == NULL || err->message == NULL)
117 return;
118
8f84fb0e 119 gdb::unique_xmalloc_ptr<char> message (err->message);
bb2ec1b3 120 err->message = NULL;
8f84fb0e 121 error (_("%s"), message.get ());
bb2ec1b3
TT
122}
123
124\f
125
126/* Compute the name of the pointer representing a local symbol's
127 address. */
128
8f84fb0e 129static gdb::unique_xmalloc_ptr<char>
bb2ec1b3
TT
130symbol_substitution_name (struct symbol *sym)
131{
8f84fb0e
TT
132 return gdb::unique_xmalloc_ptr<char>
133 (concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL));
bb2ec1b3
TT
134}
135
136/* Convert a given symbol, SYM, to the compiler's representation.
137 CONTEXT is the compiler instance. IS_GLOBAL is true if the
138 symbol came from the global scope. IS_LOCAL is true if the symbol
139 came from a local scope. (Note that the two are not strictly
140 inverses because the symbol might have come from the static
141 scope.) */
142
143static void
144convert_one_symbol (struct compile_c_instance *context,
63e43d3a 145 struct block_symbol sym,
bb2ec1b3
TT
146 int is_global,
147 int is_local)
148{
149 gcc_type sym_type;
63e43d3a
PMR
150 const char *filename = symbol_symtab (sym.symbol)->filename;
151 unsigned short line = SYMBOL_LINE (sym.symbol);
bb2ec1b3 152
63e43d3a 153 error_symbol_once (context, sym.symbol);
bb2ec1b3 154
63e43d3a 155 if (SYMBOL_CLASS (sym.symbol) == LOC_LABEL)
bb2ec1b3
TT
156 sym_type = 0;
157 else
63e43d3a 158 sym_type = convert_type (context, SYMBOL_TYPE (sym.symbol));
bb2ec1b3 159
63e43d3a 160 if (SYMBOL_DOMAIN (sym.symbol) == STRUCT_DOMAIN)
bb2ec1b3
TT
161 {
162 /* Binding a tag, so we don't need to build a decl. */
163 C_CTX (context)->c_ops->tagbind (C_CTX (context),
63e43d3a 164 SYMBOL_NATURAL_NAME (sym.symbol),
bb2ec1b3
TT
165 sym_type, filename, line);
166 }
167 else
168 {
169 gcc_decl decl;
170 enum gcc_c_symbol_kind kind;
171 CORE_ADDR addr = 0;
8f84fb0e 172 gdb::unique_xmalloc_ptr<char> symbol_name;
bb2ec1b3 173
63e43d3a 174 switch (SYMBOL_CLASS (sym.symbol))
bb2ec1b3
TT
175 {
176 case LOC_TYPEDEF:
177 kind = GCC_C_SYMBOL_TYPEDEF;
178 break;
179
180 case LOC_LABEL:
181 kind = GCC_C_SYMBOL_LABEL;
63e43d3a 182 addr = SYMBOL_VALUE_ADDRESS (sym.symbol);
bb2ec1b3
TT
183 break;
184
185 case LOC_BLOCK:
186 kind = GCC_C_SYMBOL_FUNCTION;
63e43d3a
PMR
187 addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym.symbol));
188 if (is_global && TYPE_GNU_IFUNC (SYMBOL_TYPE (sym.symbol)))
081a1c2c 189 addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
bb2ec1b3
TT
190 break;
191
192 case LOC_CONST:
63e43d3a 193 if (TYPE_CODE (SYMBOL_TYPE (sym.symbol)) == TYPE_CODE_ENUM)
bb2ec1b3
TT
194 {
195 /* Already handled by convert_enum. */
196 return;
197 }
63e43d3a
PMR
198 C_CTX (context)->c_ops->build_constant
199 (C_CTX (context),
200 sym_type, SYMBOL_NATURAL_NAME (sym.symbol),
201 SYMBOL_VALUE (sym.symbol),
202 filename, line);
bb2ec1b3
TT
203 return;
204
205 case LOC_CONST_BYTES:
206 error (_("Unsupported LOC_CONST_BYTES for symbol \"%s\"."),
63e43d3a 207 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
208
209 case LOC_UNDEF:
210 internal_error (__FILE__, __LINE__, _("LOC_UNDEF found for \"%s\"."),
63e43d3a 211 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
212
213 case LOC_COMMON_BLOCK:
214 error (_("Fortran common block is unsupported for compilation "
215 "evaluaton of symbol \"%s\"."),
63e43d3a 216 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
217
218 case LOC_OPTIMIZED_OUT:
219 error (_("Symbol \"%s\" cannot be used for compilation evaluation "
220 "as it is optimized out."),
63e43d3a 221 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
222
223 case LOC_COMPUTED:
224 if (is_local)
225 goto substitution;
226 /* Probably TLS here. */
227 warning (_("Symbol \"%s\" is thread-local and currently can only "
228 "be referenced from the current thread in "
229 "compiled code."),
63e43d3a 230 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
231 /* FALLTHROUGH */
232 case LOC_UNRESOLVED:
233 /* 'symbol_name' cannot be used here as that one is used only for
234 local variables from compile_dwarf_expr_to_c.
235 Global variables can be accessed by GCC only by their address, not
236 by their name. */
237 {
238 struct value *val;
239 struct frame_info *frame = NULL;
240
63e43d3a 241 if (symbol_read_needs_frame (sym.symbol))
bb2ec1b3
TT
242 {
243 frame = get_selected_frame (NULL);
244 if (frame == NULL)
245 error (_("Symbol \"%s\" cannot be used because "
246 "there is no selected frame"),
63e43d3a 247 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
248 }
249
63e43d3a 250 val = read_var_value (sym.symbol, sym.block, frame);
bb2ec1b3
TT
251 if (VALUE_LVAL (val) != lval_memory)
252 error (_("Symbol \"%s\" cannot be used for compilation "
253 "evaluation as its address has not been found."),
63e43d3a 254 SYMBOL_PRINT_NAME (sym.symbol));
bb2ec1b3
TT
255
256 kind = GCC_C_SYMBOL_VARIABLE;
257 addr = value_address (val);
258 }
259 break;
260
261
262 case LOC_REGISTER:
263 case LOC_ARG:
264 case LOC_REF_ARG:
265 case LOC_REGPARM_ADDR:
266 case LOC_LOCAL:
267 substitution:
268 kind = GCC_C_SYMBOL_VARIABLE;
63e43d3a 269 symbol_name = symbol_substitution_name (sym.symbol);
bb2ec1b3
TT
270 break;
271
272 case LOC_STATIC:
273 kind = GCC_C_SYMBOL_VARIABLE;
63e43d3a 274 addr = SYMBOL_VALUE_ADDRESS (sym.symbol);
bb2ec1b3
TT
275 break;
276
277 case LOC_FINAL_VALUE:
278 default:
279 gdb_assert_not_reached ("Unreachable case in convert_one_symbol.");
280
281 }
282
283 /* Don't emit local variable decls for a raw expression. */
284 if (context->base.scope != COMPILE_I_RAW_SCOPE
285 || symbol_name == NULL)
286 {
63e43d3a
PMR
287 decl = C_CTX (context)->c_ops->build_decl
288 (C_CTX (context),
289 SYMBOL_NATURAL_NAME (sym.symbol),
290 kind,
291 sym_type,
8f84fb0e 292 symbol_name.get (), addr,
63e43d3a 293 filename, line);
bb2ec1b3
TT
294
295 C_CTX (context)->c_ops->bind (C_CTX (context), decl, is_global);
296 }
bb2ec1b3
TT
297 }
298}
299
300/* Convert a full symbol to its gcc form. CONTEXT is the compiler to
301 use, IDENTIFIER is the name of the symbol, SYM is the symbol
302 itself, and DOMAIN is the domain which was searched. */
303
304static void
305convert_symbol_sym (struct compile_c_instance *context, const char *identifier,
d12307c1 306 struct block_symbol sym, domain_enum domain)
bb2ec1b3 307{
d12307c1 308 const struct block *static_block;
bb2ec1b3
TT
309 int is_local_symbol;
310
bb2ec1b3
TT
311 /* If we found a symbol and it is not in the static or global
312 scope, then we should first convert any static or global scope
313 symbol of the same name. This lets this unusual case work:
314
315 int x; // Global.
316 int func(void)
317 {
318 int x;
319 // At this spot, evaluate "extern int x; x"
320 }
321 */
322
d12307c1 323 static_block = block_static_block (sym.block);
bb2ec1b3 324 /* STATIC_BLOCK is NULL if FOUND_BLOCK is the global block. */
d12307c1 325 is_local_symbol = (sym.block != static_block && static_block != NULL);
bb2ec1b3
TT
326 if (is_local_symbol)
327 {
d12307c1 328 struct block_symbol global_sym;
bb2ec1b3
TT
329
330 global_sym = lookup_symbol (identifier, NULL, domain, NULL);
331 /* If the outer symbol is in the static block, we ignore it, as
332 it cannot be referenced. */
d12307c1
PMR
333 if (global_sym.symbol != NULL
334 && global_sym.block != block_static_block (global_sym.block))
bb2ec1b3
TT
335 {
336 if (compile_debug)
a4063588 337 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
338 "gcc_convert_symbol \"%s\": global symbol\n",
339 identifier);
63e43d3a 340 convert_one_symbol (context, global_sym, 1, 0);
bb2ec1b3
TT
341 }
342 }
343
344 if (compile_debug)
a4063588 345 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
346 "gcc_convert_symbol \"%s\": local symbol\n",
347 identifier);
63e43d3a 348 convert_one_symbol (context, sym, 0, is_local_symbol);
bb2ec1b3
TT
349}
350
351/* Convert a minimal symbol to its gcc form. CONTEXT is the compiler
352 to use and BMSYM is the minimal symbol to convert. */
353
354static void
355convert_symbol_bmsym (struct compile_c_instance *context,
356 struct bound_minimal_symbol bmsym)
357{
358 struct minimal_symbol *msym = bmsym.minsym;
359 struct objfile *objfile = bmsym.objfile;
360 struct type *type;
361 enum gcc_c_symbol_kind kind;
362 gcc_type sym_type;
363 gcc_decl decl;
364 CORE_ADDR addr;
365
081a1c2c
JK
366 addr = MSYMBOL_VALUE_ADDRESS (objfile, msym);
367
bb2ec1b3
TT
368 /* Conversion copied from write_exp_msymbol. */
369 switch (MSYMBOL_TYPE (msym))
370 {
371 case mst_text:
372 case mst_file_text:
373 case mst_solib_trampoline:
374 type = objfile_type (objfile)->nodebug_text_symbol;
375 kind = GCC_C_SYMBOL_FUNCTION;
376 break;
377
378 case mst_text_gnu_ifunc:
7022349d 379 type = objfile_type (objfile)->nodebug_text_gnu_ifunc_symbol;
bb2ec1b3 380 kind = GCC_C_SYMBOL_FUNCTION;
081a1c2c 381 addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
bb2ec1b3
TT
382 break;
383
384 case mst_data:
385 case mst_file_data:
386 case mst_bss:
387 case mst_file_bss:
388 type = objfile_type (objfile)->nodebug_data_symbol;
389 kind = GCC_C_SYMBOL_VARIABLE;
390 break;
391
392 case mst_slot_got_plt:
393 type = objfile_type (objfile)->nodebug_got_plt_symbol;
394 kind = GCC_C_SYMBOL_FUNCTION;
395 break;
396
397 default:
398 type = objfile_type (objfile)->nodebug_unknown_symbol;
399 kind = GCC_C_SYMBOL_VARIABLE;
400 break;
401 }
402
403 sym_type = convert_type (context, type);
bb2ec1b3
TT
404 decl = C_CTX (context)->c_ops->build_decl (C_CTX (context),
405 MSYMBOL_NATURAL_NAME (msym),
406 kind, sym_type, NULL, addr,
407 NULL, 0);
408 C_CTX (context)->c_ops->bind (C_CTX (context), decl, 1 /* is_global */);
409}
410
411/* See compile-internal.h. */
412
413void
414gcc_convert_symbol (void *datum,
415 struct gcc_c_context *gcc_context,
416 enum gcc_c_oracle_request request,
417 const char *identifier)
418{
9a3c8263 419 struct compile_c_instance *context = (struct compile_c_instance *) datum;
bb2ec1b3 420 domain_enum domain;
bb2ec1b3
TT
421 int found = 0;
422
423 switch (request)
424 {
425 case GCC_C_ORACLE_SYMBOL:
426 domain = VAR_DOMAIN;
427 break;
428 case GCC_C_ORACLE_TAG:
429 domain = STRUCT_DOMAIN;
430 break;
431 case GCC_C_ORACLE_LABEL:
432 domain = LABEL_DOMAIN;
433 break;
434 default:
435 gdb_assert_not_reached ("Unrecognized oracle request.");
436 }
437
438 /* We can't allow exceptions to escape out of this callback. Safest
439 is to simply emit a gcc error. */
492d29ea 440 TRY
bb2ec1b3 441 {
d12307c1 442 struct block_symbol sym;
bb2ec1b3
TT
443
444 sym = lookup_symbol (identifier, context->base.block, domain, NULL);
d12307c1 445 if (sym.symbol != NULL)
bb2ec1b3
TT
446 {
447 convert_symbol_sym (context, identifier, sym, domain);
448 found = 1;
449 }
450 else if (domain == VAR_DOMAIN)
451 {
452 struct bound_minimal_symbol bmsym;
453
454 bmsym = lookup_minimal_symbol (identifier, NULL, NULL);
455 if (bmsym.minsym != NULL)
456 {
457 convert_symbol_bmsym (context, bmsym);
458 found = 1;
459 }
460 }
461 }
462
492d29ea
PA
463 CATCH (e, RETURN_MASK_ALL)
464 {
465 C_CTX (context)->c_ops->error (C_CTX (context), e.message);
466 }
467 END_CATCH
bb2ec1b3
TT
468
469 if (compile_debug && !found)
a4063588 470 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
471 "gcc_convert_symbol \"%s\": lookup_symbol failed\n",
472 identifier);
473 return;
474}
475
476/* See compile-internal.h. */
477
478gcc_address
479gcc_symbol_address (void *datum, struct gcc_c_context *gcc_context,
480 const char *identifier)
481{
9a3c8263 482 struct compile_c_instance *context = (struct compile_c_instance *) datum;
bb2ec1b3
TT
483 gcc_address result = 0;
484 int found = 0;
485
486 /* We can't allow exceptions to escape out of this callback. Safest
487 is to simply emit a gcc error. */
492d29ea 488 TRY
bb2ec1b3
TT
489 {
490 struct symbol *sym;
491
492 /* We only need global functions here. */
d12307c1 493 sym = lookup_symbol (identifier, NULL, VAR_DOMAIN, NULL).symbol;
bb2ec1b3
TT
494 if (sym != NULL && SYMBOL_CLASS (sym) == LOC_BLOCK)
495 {
496 if (compile_debug)
a4063588 497 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
498 "gcc_symbol_address \"%s\": full symbol\n",
499 identifier);
500 result = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
081a1c2c
JK
501 if (TYPE_GNU_IFUNC (SYMBOL_TYPE (sym)))
502 result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
bb2ec1b3
TT
503 found = 1;
504 }
505 else
506 {
507 struct bound_minimal_symbol msym;
508
509 msym = lookup_bound_minimal_symbol (identifier);
510 if (msym.minsym != NULL)
511 {
512 if (compile_debug)
a4063588 513 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
514 "gcc_symbol_address \"%s\": minimal "
515 "symbol\n",
516 identifier);
517 result = BMSYMBOL_VALUE_ADDRESS (msym);
081a1c2c
JK
518 if (MSYMBOL_TYPE (msym.minsym) == mst_text_gnu_ifunc)
519 result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
bb2ec1b3
TT
520 found = 1;
521 }
522 }
523 }
524
492d29ea
PA
525 CATCH (e, RETURN_MASK_ERROR)
526 {
527 C_CTX (context)->c_ops->error (C_CTX (context), e.message);
528 }
529 END_CATCH
bb2ec1b3
TT
530
531 if (compile_debug && !found)
a4063588 532 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
533 "gcc_symbol_address \"%s\": failed\n",
534 identifier);
535 return result;
536}
537
538\f
539
540/* A hash function for symbol names. */
541
542static hashval_t
543hash_symname (const void *a)
544{
9a3c8263 545 const struct symbol *sym = (const struct symbol *) a;
bb2ec1b3
TT
546
547 return htab_hash_string (SYMBOL_NATURAL_NAME (sym));
548}
549
550/* A comparison function for hash tables that just looks at symbol
551 names. */
552
553static int
554eq_symname (const void *a, const void *b)
555{
9a3c8263
SM
556 const struct symbol *syma = (const struct symbol *) a;
557 const struct symbol *symb = (const struct symbol *) b;
bb2ec1b3
TT
558
559 return strcmp (SYMBOL_NATURAL_NAME (syma), SYMBOL_NATURAL_NAME (symb)) == 0;
560}
561
562/* If a symbol with the same name as SYM is already in HASHTAB, return
563 1. Otherwise, add SYM to HASHTAB and return 0. */
564
565static int
566symbol_seen (htab_t hashtab, struct symbol *sym)
567{
568 void **slot;
569
570 slot = htab_find_slot (hashtab, sym, INSERT);
571 if (*slot != NULL)
572 return 1;
573
574 *slot = sym;
575 return 0;
576}
577
578/* Generate C code to compute the length of a VLA. */
579
580static void
581generate_vla_size (struct compile_c_instance *compiler,
d7e74731 582 string_file &stream,
bb2ec1b3
TT
583 struct gdbarch *gdbarch,
584 unsigned char *registers_used,
585 CORE_ADDR pc,
586 struct type *type,
587 struct symbol *sym)
588{
589 type = check_typedef (type);
590
aa006118 591 if (TYPE_IS_REFERENCE (type))
bb2ec1b3
TT
592 type = check_typedef (TYPE_TARGET_TYPE (type));
593
594 switch (TYPE_CODE (type))
595 {
596 case TYPE_CODE_RANGE:
597 {
598 if (TYPE_HIGH_BOUND_KIND (type) == PROP_LOCEXPR
599 || TYPE_HIGH_BOUND_KIND (type) == PROP_LOCLIST)
600 {
601 const struct dynamic_prop *prop = &TYPE_RANGE_DATA (type)->high;
8f84fb0e 602 std::string name = c_get_range_decl_name (prop);
bb2ec1b3 603
8f84fb0e 604 dwarf2_compile_property_to_c (stream, name.c_str (),
bb2ec1b3
TT
605 gdbarch, registers_used,
606 prop, pc, sym);
bb2ec1b3
TT
607 }
608 }
609 break;
610
611 case TYPE_CODE_ARRAY:
612 generate_vla_size (compiler, stream, gdbarch, registers_used, pc,
613 TYPE_INDEX_TYPE (type), sym);
614 generate_vla_size (compiler, stream, gdbarch, registers_used, pc,
615 TYPE_TARGET_TYPE (type), sym);
616 break;
617
618 case TYPE_CODE_UNION:
619 case TYPE_CODE_STRUCT:
620 {
621 int i;
622
623 for (i = 0; i < TYPE_NFIELDS (type); ++i)
624 if (!field_is_static (&TYPE_FIELD (type, i)))
625 generate_vla_size (compiler, stream, gdbarch, registers_used, pc,
626 TYPE_FIELD_TYPE (type, i), sym);
627 }
628 break;
629 }
630}
631
632/* Generate C code to compute the address of SYM. */
633
634static void
635generate_c_for_for_one_variable (struct compile_c_instance *compiler,
d7e74731 636 string_file &stream,
bb2ec1b3
TT
637 struct gdbarch *gdbarch,
638 unsigned char *registers_used,
639 CORE_ADDR pc,
640 struct symbol *sym)
641{
bb2ec1b3 642
492d29ea 643 TRY
bb2ec1b3
TT
644 {
645 if (is_dynamic_type (SYMBOL_TYPE (sym)))
646 {
d7e74731
PA
647 /* We need to emit to a temporary buffer in case an error
648 occurs in the middle. */
649 string_file local_file;
bb2ec1b3 650
d7e74731 651 generate_vla_size (compiler, local_file, gdbarch, registers_used, pc,
bb2ec1b3 652 SYMBOL_TYPE (sym), sym);
bb2ec1b3 653
d7e74731 654 stream.write (local_file.c_str (), local_file.size ());
bb2ec1b3
TT
655 }
656
657 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
658 {
8f84fb0e
TT
659 gdb::unique_xmalloc_ptr<char> generated_name
660 = symbol_substitution_name (sym);
bb2ec1b3
TT
661 /* We need to emit to a temporary buffer in case an error
662 occurs in the middle. */
d7e74731 663 string_file local_file;
bb2ec1b3 664
bb2ec1b3
TT
665 SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file,
666 gdbarch,
667 registers_used,
8f84fb0e
TT
668 pc,
669 generated_name.get ());
d7e74731 670 stream.write (local_file.c_str (), local_file.size ());
bb2ec1b3
TT
671 }
672 else
673 {
674 switch (SYMBOL_CLASS (sym))
675 {
676 case LOC_REGISTER:
677 case LOC_ARG:
678 case LOC_REF_ARG:
679 case LOC_REGPARM_ADDR:
680 case LOC_LOCAL:
681 error (_("Local symbol unhandled when generating C code."));
682
683 case LOC_COMPUTED:
684 gdb_assert_not_reached (_("LOC_COMPUTED variable "
685 "missing a method."));
686
687 default:
688 /* Nothing to do for all other cases, as they don't represent
689 local variables. */
690 break;
691 }
692 }
693 }
694
492d29ea 695 CATCH (e, RETURN_MASK_ERROR)
7556d4a4
PA
696 {
697 if (compiler->symbol_err_map == NULL)
698 compiler->symbol_err_map = htab_create_alloc (10,
699 hash_symbol_error,
700 eq_symbol_error,
701 del_symbol_error,
702 xcalloc,
703 xfree);
704 insert_symbol_error (compiler->symbol_err_map, sym, e.message);
705 }
492d29ea 706 END_CATCH
bb2ec1b3
TT
707}
708
709/* See compile-internal.h. */
710
bd923e51 711gdb::unique_xmalloc_ptr<unsigned char>
bb2ec1b3 712generate_c_for_variable_locations (struct compile_c_instance *compiler,
d7e74731 713 string_file &stream,
bb2ec1b3
TT
714 struct gdbarch *gdbarch,
715 const struct block *block,
716 CORE_ADDR pc)
717{
bb2ec1b3 718 const struct block *static_block = block_static_block (block);
bb2ec1b3
TT
719
720 /* If we're already in the static or global block, there is nothing
721 to write. */
722 if (static_block == NULL || block == static_block)
723 return NULL;
724
bd923e51
KS
725 gdb::unique_xmalloc_ptr<unsigned char> registers_used
726 (XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch)));
bb2ec1b3
TT
727
728 /* Ensure that a given name is only entered once. This reflects the
729 reality of shadowing. */
fc4007c9
TT
730 htab_up symhash (htab_create_alloc (1, hash_symname, eq_symname, NULL,
731 xcalloc, xfree));
bb2ec1b3
TT
732
733 while (1)
734 {
735 struct symbol *sym;
736 struct block_iterator iter;
737
738 /* Iterate over symbols in this block, generating code to
739 compute the location of each local variable. */
740 for (sym = block_iterator_first (block, &iter);
741 sym != NULL;
742 sym = block_iterator_next (&iter))
743 {
fc4007c9 744 if (!symbol_seen (symhash.get (), sym))
bb2ec1b3 745 generate_c_for_for_one_variable (compiler, stream, gdbarch,
bd923e51 746 registers_used.get (), pc, sym);
bb2ec1b3
TT
747 }
748
749 /* If we just finished the outermost block of a function, we're
750 done. */
751 if (BLOCK_FUNCTION (block) != NULL)
752 break;
753 block = BLOCK_SUPERBLOCK (block);
754 }
755
bb2ec1b3
TT
756 return registers_used;
757}
This page took 0.290141 seconds and 4 git commands to generate.