1 /* Convert symbols from GDB to GCC
3 Copyright (C) 2014-2018 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
22 #include "compile-internal.h"
23 #include "compile-c.h"
25 #include "parser-defs.h"
30 #include "exceptions.h"
32 #include "dwarf2loc.h"
36 /* Object of this type are stored in the compiler's symbol_err_map. */
42 const struct symbol
*sym
;
44 /* The error message to emit. This is malloc'd and owned by the
50 /* Hash function for struct symbol_error. */
53 hash_symbol_error (const void *a
)
55 const struct symbol_error
*se
= (const struct symbol_error
*) a
;
57 return htab_hash_pointer (se
->sym
);
60 /* Equality function for struct symbol_error. */
63 eq_symbol_error (const void *a
, const void *b
)
65 const struct symbol_error
*sea
= (const struct symbol_error
*) a
;
66 const struct symbol_error
*seb
= (const struct symbol_error
*) b
;
68 return sea
->sym
== seb
->sym
;
71 /* Deletion function for struct symbol_error. */
74 del_symbol_error (void *a
)
76 struct symbol_error
*se
= (struct symbol_error
*) a
;
82 /* Associate SYMBOL with some error text. */
85 insert_symbol_error (htab_t hash
, const struct symbol
*sym
, const char *text
)
87 struct symbol_error e
;
91 slot
= htab_find_slot (hash
, &e
, INSERT
);
94 struct symbol_error
*e
= XNEW (struct symbol_error
);
97 e
->message
= xstrdup (text
);
102 /* Emit the error message corresponding to SYM, if one exists, and
103 arrange for it not to be emitted again. */
106 error_symbol_once (struct compile_c_instance
*context
,
107 const struct symbol
*sym
)
109 struct symbol_error search
;
110 struct symbol_error
*err
;
112 if (context
->symbol_err_map
== NULL
)
116 err
= (struct symbol_error
*) htab_find (context
->symbol_err_map
, &search
);
117 if (err
== NULL
|| err
->message
== NULL
)
120 gdb::unique_xmalloc_ptr
<char> message (err
->message
);
122 error (_("%s"), message
.get ());
127 /* Compute the name of the pointer representing a local symbol's
130 static gdb::unique_xmalloc_ptr
<char>
131 c_symbol_substitution_name (struct symbol
*sym
)
133 return gdb::unique_xmalloc_ptr
<char>
134 (concat ("__", SYMBOL_NATURAL_NAME (sym
), "_ptr", (char *) NULL
));
137 /* Convert a given symbol, SYM, to the compiler's representation.
138 CONTEXT is the compiler instance. IS_GLOBAL is true if the
139 symbol came from the global scope. IS_LOCAL is true if the symbol
140 came from a local scope. (Note that the two are not strictly
141 inverses because the symbol might have come from the static
145 convert_one_symbol (struct compile_c_instance
*context
,
146 struct block_symbol sym
,
151 const char *filename
= symbol_symtab (sym
.symbol
)->filename
;
152 unsigned short line
= SYMBOL_LINE (sym
.symbol
);
154 error_symbol_once (context
, sym
.symbol
);
156 if (SYMBOL_CLASS (sym
.symbol
) == LOC_LABEL
)
159 sym_type
= convert_type (context
, SYMBOL_TYPE (sym
.symbol
));
161 if (SYMBOL_DOMAIN (sym
.symbol
) == STRUCT_DOMAIN
)
163 /* Binding a tag, so we don't need to build a decl. */
164 C_CTX (context
)->c_ops
->tagbind (C_CTX (context
),
165 SYMBOL_NATURAL_NAME (sym
.symbol
),
166 sym_type
, filename
, line
);
171 enum gcc_c_symbol_kind kind
;
173 gdb::unique_xmalloc_ptr
<char> symbol_name
;
175 switch (SYMBOL_CLASS (sym
.symbol
))
178 kind
= GCC_C_SYMBOL_TYPEDEF
;
182 kind
= GCC_C_SYMBOL_LABEL
;
183 addr
= SYMBOL_VALUE_ADDRESS (sym
.symbol
);
187 kind
= GCC_C_SYMBOL_FUNCTION
;
188 addr
= BLOCK_START (SYMBOL_BLOCK_VALUE (sym
.symbol
));
189 if (is_global
&& TYPE_GNU_IFUNC (SYMBOL_TYPE (sym
.symbol
)))
190 addr
= gnu_ifunc_resolve_addr (target_gdbarch (), addr
);
194 if (TYPE_CODE (SYMBOL_TYPE (sym
.symbol
)) == TYPE_CODE_ENUM
)
196 /* Already handled by convert_enum. */
199 C_CTX (context
)->c_ops
->build_constant
201 sym_type
, SYMBOL_NATURAL_NAME (sym
.symbol
),
202 SYMBOL_VALUE (sym
.symbol
),
206 case LOC_CONST_BYTES
:
207 error (_("Unsupported LOC_CONST_BYTES for symbol \"%s\"."),
208 SYMBOL_PRINT_NAME (sym
.symbol
));
211 internal_error (__FILE__
, __LINE__
, _("LOC_UNDEF found for \"%s\"."),
212 SYMBOL_PRINT_NAME (sym
.symbol
));
214 case LOC_COMMON_BLOCK
:
215 error (_("Fortran common block is unsupported for compilation "
216 "evaluaton of symbol \"%s\"."),
217 SYMBOL_PRINT_NAME (sym
.symbol
));
219 case LOC_OPTIMIZED_OUT
:
220 error (_("Symbol \"%s\" cannot be used for compilation evaluation "
221 "as it is optimized out."),
222 SYMBOL_PRINT_NAME (sym
.symbol
));
227 /* Probably TLS here. */
228 warning (_("Symbol \"%s\" is thread-local and currently can only "
229 "be referenced from the current thread in "
231 SYMBOL_PRINT_NAME (sym
.symbol
));
234 /* 'symbol_name' cannot be used here as that one is used only for
235 local variables from compile_dwarf_expr_to_c.
236 Global variables can be accessed by GCC only by their address, not
240 struct frame_info
*frame
= NULL
;
242 if (symbol_read_needs_frame (sym
.symbol
))
244 frame
= get_selected_frame (NULL
);
246 error (_("Symbol \"%s\" cannot be used because "
247 "there is no selected frame"),
248 SYMBOL_PRINT_NAME (sym
.symbol
));
251 val
= read_var_value (sym
.symbol
, sym
.block
, frame
);
252 if (VALUE_LVAL (val
) != lval_memory
)
253 error (_("Symbol \"%s\" cannot be used for compilation "
254 "evaluation as its address has not been found."),
255 SYMBOL_PRINT_NAME (sym
.symbol
));
257 kind
= GCC_C_SYMBOL_VARIABLE
;
258 addr
= value_address (val
);
266 case LOC_REGPARM_ADDR
:
269 kind
= GCC_C_SYMBOL_VARIABLE
;
270 symbol_name
= c_symbol_substitution_name (sym
.symbol
);
274 kind
= GCC_C_SYMBOL_VARIABLE
;
275 addr
= SYMBOL_VALUE_ADDRESS (sym
.symbol
);
278 case LOC_FINAL_VALUE
:
280 gdb_assert_not_reached ("Unreachable case in convert_one_symbol.");
284 /* Don't emit local variable decls for a raw expression. */
285 if (context
->base
.scope
!= COMPILE_I_RAW_SCOPE
286 || symbol_name
== NULL
)
288 decl
= C_CTX (context
)->c_ops
->build_decl
290 SYMBOL_NATURAL_NAME (sym
.symbol
),
293 symbol_name
.get (), addr
,
296 C_CTX (context
)->c_ops
->bind (C_CTX (context
), decl
, is_global
);
301 /* Convert a full symbol to its gcc form. CONTEXT is the compiler to
302 use, IDENTIFIER is the name of the symbol, SYM is the symbol
303 itself, and DOMAIN is the domain which was searched. */
306 convert_symbol_sym (struct compile_c_instance
*context
, const char *identifier
,
307 struct block_symbol sym
, domain_enum domain
)
309 const struct block
*static_block
;
312 /* If we found a symbol and it is not in the static or global
313 scope, then we should first convert any static or global scope
314 symbol of the same name. This lets this unusual case work:
320 // At this spot, evaluate "extern int x; x"
324 static_block
= block_static_block (sym
.block
);
325 /* STATIC_BLOCK is NULL if FOUND_BLOCK is the global block. */
326 is_local_symbol
= (sym
.block
!= static_block
&& static_block
!= NULL
);
329 struct block_symbol global_sym
;
331 global_sym
= lookup_symbol (identifier
, NULL
, domain
, NULL
);
332 /* If the outer symbol is in the static block, we ignore it, as
333 it cannot be referenced. */
334 if (global_sym
.symbol
!= NULL
335 && global_sym
.block
!= block_static_block (global_sym
.block
))
338 fprintf_unfiltered (gdb_stdlog
,
339 "gcc_convert_symbol \"%s\": global symbol\n",
341 convert_one_symbol (context
, global_sym
, 1, 0);
346 fprintf_unfiltered (gdb_stdlog
,
347 "gcc_convert_symbol \"%s\": local symbol\n",
349 convert_one_symbol (context
, sym
, 0, is_local_symbol
);
352 /* Convert a minimal symbol to its gcc form. CONTEXT is the compiler
353 to use and BMSYM is the minimal symbol to convert. */
356 convert_symbol_bmsym (struct compile_c_instance
*context
,
357 struct bound_minimal_symbol bmsym
)
359 struct minimal_symbol
*msym
= bmsym
.minsym
;
360 struct objfile
*objfile
= bmsym
.objfile
;
362 enum gcc_c_symbol_kind kind
;
367 addr
= MSYMBOL_VALUE_ADDRESS (objfile
, msym
);
369 /* Conversion copied from write_exp_msymbol. */
370 switch (MSYMBOL_TYPE (msym
))
374 case mst_solib_trampoline
:
375 type
= objfile_type (objfile
)->nodebug_text_symbol
;
376 kind
= GCC_C_SYMBOL_FUNCTION
;
379 case mst_text_gnu_ifunc
:
380 type
= objfile_type (objfile
)->nodebug_text_gnu_ifunc_symbol
;
381 kind
= GCC_C_SYMBOL_FUNCTION
;
382 addr
= gnu_ifunc_resolve_addr (target_gdbarch (), addr
);
389 type
= objfile_type (objfile
)->nodebug_data_symbol
;
390 kind
= GCC_C_SYMBOL_VARIABLE
;
393 case mst_slot_got_plt
:
394 type
= objfile_type (objfile
)->nodebug_got_plt_symbol
;
395 kind
= GCC_C_SYMBOL_FUNCTION
;
399 type
= objfile_type (objfile
)->nodebug_unknown_symbol
;
400 kind
= GCC_C_SYMBOL_VARIABLE
;
404 sym_type
= convert_type (context
, type
);
405 decl
= C_CTX (context
)->c_ops
->build_decl (C_CTX (context
),
406 MSYMBOL_NATURAL_NAME (msym
),
407 kind
, sym_type
, NULL
, addr
,
409 C_CTX (context
)->c_ops
->bind (C_CTX (context
), decl
, 1 /* is_global */);
412 /* See compile-internal.h. */
415 gcc_convert_symbol (void *datum
,
416 struct gcc_c_context
*gcc_context
,
417 enum gcc_c_oracle_request request
,
418 const char *identifier
)
420 struct compile_c_instance
*context
= (struct compile_c_instance
*) datum
;
426 case GCC_C_ORACLE_SYMBOL
:
429 case GCC_C_ORACLE_TAG
:
430 domain
= STRUCT_DOMAIN
;
432 case GCC_C_ORACLE_LABEL
:
433 domain
= LABEL_DOMAIN
;
436 gdb_assert_not_reached ("Unrecognized oracle request.");
439 /* We can't allow exceptions to escape out of this callback. Safest
440 is to simply emit a gcc error. */
443 struct block_symbol sym
;
445 sym
= lookup_symbol (identifier
, context
->base
.block
, domain
, NULL
);
446 if (sym
.symbol
!= NULL
)
448 convert_symbol_sym (context
, identifier
, sym
, domain
);
451 else if (domain
== VAR_DOMAIN
)
453 struct bound_minimal_symbol bmsym
;
455 bmsym
= lookup_minimal_symbol (identifier
, NULL
, NULL
);
456 if (bmsym
.minsym
!= NULL
)
458 convert_symbol_bmsym (context
, bmsym
);
464 CATCH (e
, RETURN_MASK_ALL
)
466 C_CTX (context
)->c_ops
->error (C_CTX (context
), e
.message
);
470 if (compile_debug
&& !found
)
471 fprintf_unfiltered (gdb_stdlog
,
472 "gcc_convert_symbol \"%s\": lookup_symbol failed\n",
477 /* See compile-internal.h. */
480 gcc_symbol_address (void *datum
, struct gcc_c_context
*gcc_context
,
481 const char *identifier
)
483 struct compile_c_instance
*context
= (struct compile_c_instance
*) datum
;
484 gcc_address result
= 0;
487 /* We can't allow exceptions to escape out of this callback. Safest
488 is to simply emit a gcc error. */
493 /* We only need global functions here. */
494 sym
= lookup_symbol (identifier
, NULL
, VAR_DOMAIN
, NULL
).symbol
;
495 if (sym
!= NULL
&& SYMBOL_CLASS (sym
) == LOC_BLOCK
)
498 fprintf_unfiltered (gdb_stdlog
,
499 "gcc_symbol_address \"%s\": full symbol\n",
501 result
= BLOCK_START (SYMBOL_BLOCK_VALUE (sym
));
502 if (TYPE_GNU_IFUNC (SYMBOL_TYPE (sym
)))
503 result
= gnu_ifunc_resolve_addr (target_gdbarch (), result
);
508 struct bound_minimal_symbol msym
;
510 msym
= lookup_bound_minimal_symbol (identifier
);
511 if (msym
.minsym
!= NULL
)
514 fprintf_unfiltered (gdb_stdlog
,
515 "gcc_symbol_address \"%s\": minimal "
518 result
= BMSYMBOL_VALUE_ADDRESS (msym
);
519 if (MSYMBOL_TYPE (msym
.minsym
) == mst_text_gnu_ifunc
)
520 result
= gnu_ifunc_resolve_addr (target_gdbarch (), result
);
526 CATCH (e
, RETURN_MASK_ERROR
)
528 C_CTX (context
)->c_ops
->error (C_CTX (context
), e
.message
);
532 if (compile_debug
&& !found
)
533 fprintf_unfiltered (gdb_stdlog
,
534 "gcc_symbol_address \"%s\": failed\n",
541 /* A hash function for symbol names. */
544 hash_symname (const void *a
)
546 const struct symbol
*sym
= (const struct symbol
*) a
;
548 return htab_hash_string (SYMBOL_NATURAL_NAME (sym
));
551 /* A comparison function for hash tables that just looks at symbol
555 eq_symname (const void *a
, const void *b
)
557 const struct symbol
*syma
= (const struct symbol
*) a
;
558 const struct symbol
*symb
= (const struct symbol
*) b
;
560 return strcmp (SYMBOL_NATURAL_NAME (syma
), SYMBOL_NATURAL_NAME (symb
)) == 0;
563 /* If a symbol with the same name as SYM is already in HASHTAB, return
564 1. Otherwise, add SYM to HASHTAB and return 0. */
567 symbol_seen (htab_t hashtab
, struct symbol
*sym
)
571 slot
= htab_find_slot (hashtab
, sym
, INSERT
);
579 /* Generate C code to compute the length of a VLA. */
582 generate_vla_size (struct compile_c_instance
*compiler
,
584 struct gdbarch
*gdbarch
,
585 unsigned char *registers_used
,
590 type
= check_typedef (type
);
592 if (TYPE_IS_REFERENCE (type
))
593 type
= check_typedef (TYPE_TARGET_TYPE (type
));
595 switch (TYPE_CODE (type
))
597 case TYPE_CODE_RANGE
:
599 if (TYPE_HIGH_BOUND_KIND (type
) == PROP_LOCEXPR
600 || TYPE_HIGH_BOUND_KIND (type
) == PROP_LOCLIST
)
602 const struct dynamic_prop
*prop
= &TYPE_RANGE_DATA (type
)->high
;
603 std::string name
= c_get_range_decl_name (prop
);
605 dwarf2_compile_property_to_c (stream
, name
.c_str (),
606 gdbarch
, registers_used
,
612 case TYPE_CODE_ARRAY
:
613 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
614 TYPE_INDEX_TYPE (type
), sym
);
615 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
616 TYPE_TARGET_TYPE (type
), sym
);
619 case TYPE_CODE_UNION
:
620 case TYPE_CODE_STRUCT
:
624 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
625 if (!field_is_static (&TYPE_FIELD (type
, i
)))
626 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
627 TYPE_FIELD_TYPE (type
, i
), sym
);
633 /* Generate C code to compute the address of SYM. */
636 generate_c_for_for_one_variable (struct compile_c_instance
*compiler
,
638 struct gdbarch
*gdbarch
,
639 unsigned char *registers_used
,
646 if (is_dynamic_type (SYMBOL_TYPE (sym
)))
648 /* We need to emit to a temporary buffer in case an error
649 occurs in the middle. */
650 string_file local_file
;
652 generate_vla_size (compiler
, local_file
, gdbarch
, registers_used
, pc
,
653 SYMBOL_TYPE (sym
), sym
);
655 stream
.write (local_file
.c_str (), local_file
.size ());
658 if (SYMBOL_COMPUTED_OPS (sym
) != NULL
)
660 gdb::unique_xmalloc_ptr
<char> generated_name
661 = c_symbol_substitution_name (sym
);
662 /* We need to emit to a temporary buffer in case an error
663 occurs in the middle. */
664 string_file local_file
;
666 SYMBOL_COMPUTED_OPS (sym
)->generate_c_location (sym
, local_file
,
670 generated_name
.get ());
671 stream
.write (local_file
.c_str (), local_file
.size ());
675 switch (SYMBOL_CLASS (sym
))
680 case LOC_REGPARM_ADDR
:
682 error (_("Local symbol unhandled when generating C code."));
685 gdb_assert_not_reached (_("LOC_COMPUTED variable "
686 "missing a method."));
689 /* Nothing to do for all other cases, as they don't represent
696 CATCH (e
, RETURN_MASK_ERROR
)
698 if (compiler
->symbol_err_map
== NULL
)
699 compiler
->symbol_err_map
= htab_create_alloc (10,
705 insert_symbol_error (compiler
->symbol_err_map
, sym
, e
.message
);
710 /* See compile-c.h. */
712 gdb::unique_xmalloc_ptr
<unsigned char>
713 generate_c_for_variable_locations (struct compile_c_instance
*compiler
,
715 struct gdbarch
*gdbarch
,
716 const struct block
*block
,
719 const struct block
*static_block
= block_static_block (block
);
721 /* If we're already in the static or global block, there is nothing
723 if (static_block
== NULL
|| block
== static_block
)
726 gdb::unique_xmalloc_ptr
<unsigned char> registers_used
727 (XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch
)));
729 /* Ensure that a given name is only entered once. This reflects the
730 reality of shadowing. */
731 htab_up
symhash (htab_create_alloc (1, hash_symname
, eq_symname
, NULL
,
737 struct block_iterator iter
;
739 /* Iterate over symbols in this block, generating code to
740 compute the location of each local variable. */
741 for (sym
= block_iterator_first (block
, &iter
);
743 sym
= block_iterator_next (&iter
))
745 if (!symbol_seen (symhash
.get (), sym
))
746 generate_c_for_for_one_variable (compiler
, stream
, gdbarch
,
747 registers_used
.get (), pc
, sym
);
750 /* If we just finished the outermost block of a function, we're
752 if (BLOCK_FUNCTION (block
) != NULL
)
754 block
= BLOCK_SUPERBLOCK (block
);
757 return registers_used
;