1 /* Convert symbols from GDB to GCC
3 Copyright (C) 2014-2015 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"
24 #include "parser-defs.h"
29 #include "exceptions.h"
31 #include "dwarf2loc.h"
35 /* Object of this type are stored in the compiler's symbol_err_map. */
41 const struct symbol
*sym
;
43 /* The error message to emit. This is malloc'd and owned by the
49 /* Hash function for struct symbol_error. */
52 hash_symbol_error (const void *a
)
54 const struct symbol_error
*se
= a
;
56 return htab_hash_pointer (se
->sym
);
59 /* Equality function for struct symbol_error. */
62 eq_symbol_error (const void *a
, const void *b
)
64 const struct symbol_error
*sea
= a
;
65 const struct symbol_error
*seb
= b
;
67 return sea
->sym
== seb
->sym
;
70 /* Deletion function for struct symbol_error. */
73 del_symbol_error (void *a
)
75 struct symbol_error
*se
= a
;
81 /* Associate SYMBOL with some error text. */
84 insert_symbol_error (htab_t hash
, const struct symbol
*sym
, const char *text
)
86 struct symbol_error e
;
90 slot
= htab_find_slot (hash
, &e
, INSERT
);
93 struct symbol_error
*e
= XNEW (struct symbol_error
);
96 e
->message
= xstrdup (text
);
101 /* Emit the error message corresponding to SYM, if one exists, and
102 arrange for it not to be emitted again. */
105 error_symbol_once (struct compile_c_instance
*context
,
106 const struct symbol
*sym
)
108 struct symbol_error search
;
109 struct symbol_error
*err
;
112 if (context
->symbol_err_map
== NULL
)
116 err
= htab_find (context
->symbol_err_map
, &search
);
117 if (err
== NULL
|| err
->message
== NULL
)
120 message
= err
->message
;
122 make_cleanup (xfree
, message
);
123 error (_("%s"), message
);
128 /* Compute the name of the pointer representing a local symbol's
132 symbol_substitution_name (struct symbol
*sym
)
134 return 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
,
151 const char *filename
= symbol_symtab (sym
)->filename
;
152 unsigned short line
= SYMBOL_LINE (sym
);
154 error_symbol_once (context
, sym
);
156 if (SYMBOL_CLASS (sym
) == LOC_LABEL
)
159 sym_type
= convert_type (context
, SYMBOL_TYPE (sym
));
161 if (SYMBOL_DOMAIN (sym
) == 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
),
166 sym_type
, filename
, line
);
171 enum gcc_c_symbol_kind kind
;
173 char *symbol_name
= NULL
;
175 switch (SYMBOL_CLASS (sym
))
178 kind
= GCC_C_SYMBOL_TYPEDEF
;
182 kind
= GCC_C_SYMBOL_LABEL
;
183 addr
= SYMBOL_VALUE_ADDRESS (sym
);
187 kind
= GCC_C_SYMBOL_FUNCTION
;
188 addr
= BLOCK_START (SYMBOL_BLOCK_VALUE (sym
));
189 if (is_global
&& TYPE_GNU_IFUNC (SYMBOL_TYPE (sym
)))
190 addr
= gnu_ifunc_resolve_addr (target_gdbarch (), addr
);
194 if (TYPE_CODE (SYMBOL_TYPE (sym
)) == TYPE_CODE_ENUM
)
196 /* Already handled by convert_enum. */
199 C_CTX (context
)->c_ops
->build_constant (C_CTX (context
), sym_type
,
200 SYMBOL_NATURAL_NAME (sym
),
205 case LOC_CONST_BYTES
:
206 error (_("Unsupported LOC_CONST_BYTES for symbol \"%s\"."),
207 SYMBOL_PRINT_NAME (sym
));
210 internal_error (__FILE__
, __LINE__
, _("LOC_UNDEF found for \"%s\"."),
211 SYMBOL_PRINT_NAME (sym
));
213 case LOC_COMMON_BLOCK
:
214 error (_("Fortran common block is unsupported for compilation "
215 "evaluaton of symbol \"%s\"."),
216 SYMBOL_PRINT_NAME (sym
));
218 case LOC_OPTIMIZED_OUT
:
219 error (_("Symbol \"%s\" cannot be used for compilation evaluation "
220 "as it is optimized out."),
221 SYMBOL_PRINT_NAME (sym
));
226 /* Probably TLS here. */
227 warning (_("Symbol \"%s\" is thread-local and currently can only "
228 "be referenced from the current thread in "
230 SYMBOL_PRINT_NAME (sym
));
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
239 struct frame_info
*frame
= NULL
;
241 if (symbol_read_needs_frame (sym
))
243 frame
= get_selected_frame (NULL
);
245 error (_("Symbol \"%s\" cannot be used because "
246 "there is no selected frame"),
247 SYMBOL_PRINT_NAME (sym
));
250 val
= read_var_value (sym
, frame
);
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."),
254 SYMBOL_PRINT_NAME (sym
));
256 kind
= GCC_C_SYMBOL_VARIABLE
;
257 addr
= value_address (val
);
265 case LOC_REGPARM_ADDR
:
268 kind
= GCC_C_SYMBOL_VARIABLE
;
269 symbol_name
= symbol_substitution_name (sym
);
273 kind
= GCC_C_SYMBOL_VARIABLE
;
274 addr
= SYMBOL_VALUE_ADDRESS (sym
);
277 case LOC_FINAL_VALUE
:
279 gdb_assert_not_reached ("Unreachable case in convert_one_symbol.");
283 /* Don't emit local variable decls for a raw expression. */
284 if (context
->base
.scope
!= COMPILE_I_RAW_SCOPE
285 || symbol_name
== NULL
)
287 decl
= C_CTX (context
)->c_ops
->build_decl (C_CTX (context
),
288 SYMBOL_NATURAL_NAME (sym
),
294 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 symbol
*sym
, domain_enum domain
)
309 const struct block
*static_block
, *found_block
;
312 found_block
= block_found
;
314 /* If we found a symbol and it is not in the static or global
315 scope, then we should first convert any static or global scope
316 symbol of the same name. This lets this unusual case work:
322 // At this spot, evaluate "extern int x; x"
326 static_block
= block_static_block (found_block
);
327 /* STATIC_BLOCK is NULL if FOUND_BLOCK is the global block. */
328 is_local_symbol
= (found_block
!= static_block
&& static_block
!= NULL
);
331 struct symbol
*global_sym
;
333 global_sym
= lookup_symbol (identifier
, NULL
, domain
, NULL
);
334 /* If the outer symbol is in the static block, we ignore it, as
335 it cannot be referenced. */
336 if (global_sym
!= NULL
337 && block_found
!= block_static_block (block_found
))
340 fprintf_unfiltered (gdb_stdlog
,
341 "gcc_convert_symbol \"%s\": global symbol\n",
343 convert_one_symbol (context
, global_sym
, 1, 0);
348 fprintf_unfiltered (gdb_stdlog
,
349 "gcc_convert_symbol \"%s\": local symbol\n",
351 convert_one_symbol (context
, sym
, 0, is_local_symbol
);
354 /* Convert a minimal symbol to its gcc form. CONTEXT is the compiler
355 to use and BMSYM is the minimal symbol to convert. */
358 convert_symbol_bmsym (struct compile_c_instance
*context
,
359 struct bound_minimal_symbol bmsym
)
361 struct minimal_symbol
*msym
= bmsym
.minsym
;
362 struct objfile
*objfile
= bmsym
.objfile
;
364 enum gcc_c_symbol_kind kind
;
369 addr
= MSYMBOL_VALUE_ADDRESS (objfile
, msym
);
371 /* Conversion copied from write_exp_msymbol. */
372 switch (MSYMBOL_TYPE (msym
))
376 case mst_solib_trampoline
:
377 type
= objfile_type (objfile
)->nodebug_text_symbol
;
378 kind
= GCC_C_SYMBOL_FUNCTION
;
381 case mst_text_gnu_ifunc
:
382 /* nodebug_text_gnu_ifunc_symbol would cause:
383 function return type cannot be function */
384 type
= objfile_type (objfile
)->nodebug_text_symbol
;
385 kind
= GCC_C_SYMBOL_FUNCTION
;
386 addr
= gnu_ifunc_resolve_addr (target_gdbarch (), addr
);
393 type
= objfile_type (objfile
)->nodebug_data_symbol
;
394 kind
= GCC_C_SYMBOL_VARIABLE
;
397 case mst_slot_got_plt
:
398 type
= objfile_type (objfile
)->nodebug_got_plt_symbol
;
399 kind
= GCC_C_SYMBOL_FUNCTION
;
403 type
= objfile_type (objfile
)->nodebug_unknown_symbol
;
404 kind
= GCC_C_SYMBOL_VARIABLE
;
408 sym_type
= convert_type (context
, type
);
409 decl
= C_CTX (context
)->c_ops
->build_decl (C_CTX (context
),
410 MSYMBOL_NATURAL_NAME (msym
),
411 kind
, sym_type
, NULL
, addr
,
413 C_CTX (context
)->c_ops
->bind (C_CTX (context
), decl
, 1 /* is_global */);
416 /* See compile-internal.h. */
419 gcc_convert_symbol (void *datum
,
420 struct gcc_c_context
*gcc_context
,
421 enum gcc_c_oracle_request request
,
422 const char *identifier
)
424 struct compile_c_instance
*context
= datum
;
430 case GCC_C_ORACLE_SYMBOL
:
433 case GCC_C_ORACLE_TAG
:
434 domain
= STRUCT_DOMAIN
;
436 case GCC_C_ORACLE_LABEL
:
437 domain
= LABEL_DOMAIN
;
440 gdb_assert_not_reached ("Unrecognized oracle request.");
443 /* We can't allow exceptions to escape out of this callback. Safest
444 is to simply emit a gcc error. */
449 sym
= lookup_symbol (identifier
, context
->base
.block
, domain
, NULL
);
452 convert_symbol_sym (context
, identifier
, sym
, domain
);
455 else if (domain
== VAR_DOMAIN
)
457 struct bound_minimal_symbol bmsym
;
459 bmsym
= lookup_minimal_symbol (identifier
, NULL
, NULL
);
460 if (bmsym
.minsym
!= NULL
)
462 convert_symbol_bmsym (context
, bmsym
);
468 CATCH (e
, RETURN_MASK_ALL
)
470 C_CTX (context
)->c_ops
->error (C_CTX (context
), e
.message
);
474 if (compile_debug
&& !found
)
475 fprintf_unfiltered (gdb_stdlog
,
476 "gcc_convert_symbol \"%s\": lookup_symbol failed\n",
481 /* See compile-internal.h. */
484 gcc_symbol_address (void *datum
, struct gcc_c_context
*gcc_context
,
485 const char *identifier
)
487 struct compile_c_instance
*context
= datum
;
488 gcc_address result
= 0;
491 /* We can't allow exceptions to escape out of this callback. Safest
492 is to simply emit a gcc error. */
497 /* We only need global functions here. */
498 sym
= lookup_symbol (identifier
, NULL
, VAR_DOMAIN
, NULL
);
499 if (sym
!= NULL
&& SYMBOL_CLASS (sym
) == LOC_BLOCK
)
502 fprintf_unfiltered (gdb_stdlog
,
503 "gcc_symbol_address \"%s\": full symbol\n",
505 result
= BLOCK_START (SYMBOL_BLOCK_VALUE (sym
));
506 if (TYPE_GNU_IFUNC (SYMBOL_TYPE (sym
)))
507 result
= gnu_ifunc_resolve_addr (target_gdbarch (), result
);
512 struct bound_minimal_symbol msym
;
514 msym
= lookup_bound_minimal_symbol (identifier
);
515 if (msym
.minsym
!= NULL
)
518 fprintf_unfiltered (gdb_stdlog
,
519 "gcc_symbol_address \"%s\": minimal "
522 result
= BMSYMBOL_VALUE_ADDRESS (msym
);
523 if (MSYMBOL_TYPE (msym
.minsym
) == mst_text_gnu_ifunc
)
524 result
= gnu_ifunc_resolve_addr (target_gdbarch (), result
);
530 CATCH (e
, RETURN_MASK_ERROR
)
532 C_CTX (context
)->c_ops
->error (C_CTX (context
), e
.message
);
536 if (compile_debug
&& !found
)
537 fprintf_unfiltered (gdb_stdlog
,
538 "gcc_symbol_address \"%s\": failed\n",
545 /* A hash function for symbol names. */
548 hash_symname (const void *a
)
550 const struct symbol
*sym
= a
;
552 return htab_hash_string (SYMBOL_NATURAL_NAME (sym
));
555 /* A comparison function for hash tables that just looks at symbol
559 eq_symname (const void *a
, const void *b
)
561 const struct symbol
*syma
= a
;
562 const struct symbol
*symb
= b
;
564 return strcmp (SYMBOL_NATURAL_NAME (syma
), SYMBOL_NATURAL_NAME (symb
)) == 0;
567 /* If a symbol with the same name as SYM is already in HASHTAB, return
568 1. Otherwise, add SYM to HASHTAB and return 0. */
571 symbol_seen (htab_t hashtab
, struct symbol
*sym
)
575 slot
= htab_find_slot (hashtab
, sym
, INSERT
);
583 /* Generate C code to compute the length of a VLA. */
586 generate_vla_size (struct compile_c_instance
*compiler
,
587 struct ui_file
*stream
,
588 struct gdbarch
*gdbarch
,
589 unsigned char *registers_used
,
594 type
= check_typedef (type
);
596 if (TYPE_CODE (type
) == TYPE_CODE_REF
)
597 type
= check_typedef (TYPE_TARGET_TYPE (type
));
599 switch (TYPE_CODE (type
))
601 case TYPE_CODE_RANGE
:
603 if (TYPE_HIGH_BOUND_KIND (type
) == PROP_LOCEXPR
604 || TYPE_HIGH_BOUND_KIND (type
) == PROP_LOCLIST
)
606 const struct dynamic_prop
*prop
= &TYPE_RANGE_DATA (type
)->high
;
607 char *name
= c_get_range_decl_name (prop
);
608 struct cleanup
*cleanup
= make_cleanup (xfree
, name
);
610 dwarf2_compile_property_to_c (stream
, name
,
611 gdbarch
, registers_used
,
613 do_cleanups (cleanup
);
618 case TYPE_CODE_ARRAY
:
619 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
620 TYPE_INDEX_TYPE (type
), sym
);
621 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
622 TYPE_TARGET_TYPE (type
), sym
);
625 case TYPE_CODE_UNION
:
626 case TYPE_CODE_STRUCT
:
630 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
631 if (!field_is_static (&TYPE_FIELD (type
, i
)))
632 generate_vla_size (compiler
, stream
, gdbarch
, registers_used
, pc
,
633 TYPE_FIELD_TYPE (type
, i
), sym
);
639 /* Generate C code to compute the address of SYM. */
642 generate_c_for_for_one_variable (struct compile_c_instance
*compiler
,
643 struct ui_file
*stream
,
644 struct gdbarch
*gdbarch
,
645 unsigned char *registers_used
,
652 if (is_dynamic_type (SYMBOL_TYPE (sym
)))
654 struct ui_file
*size_file
= mem_fileopen ();
655 struct cleanup
*cleanup
= make_cleanup_ui_file_delete (size_file
);
657 generate_vla_size (compiler
, size_file
, gdbarch
, registers_used
, pc
,
658 SYMBOL_TYPE (sym
), sym
);
659 ui_file_put (size_file
, ui_file_write_for_put
, stream
);
661 do_cleanups (cleanup
);
664 if (SYMBOL_COMPUTED_OPS (sym
) != NULL
)
666 char *generated_name
= symbol_substitution_name (sym
);
667 struct cleanup
*cleanup
= make_cleanup (xfree
, generated_name
);
668 /* We need to emit to a temporary buffer in case an error
669 occurs in the middle. */
670 struct ui_file
*local_file
= mem_fileopen ();
672 make_cleanup_ui_file_delete (local_file
);
673 SYMBOL_COMPUTED_OPS (sym
)->generate_c_location (sym
, local_file
,
677 ui_file_put (local_file
, ui_file_write_for_put
, stream
);
679 do_cleanups (cleanup
);
683 switch (SYMBOL_CLASS (sym
))
688 case LOC_REGPARM_ADDR
:
690 error (_("Local symbol unhandled when generating C code."));
693 gdb_assert_not_reached (_("LOC_COMPUTED variable "
694 "missing a method."));
697 /* Nothing to do for all other cases, as they don't represent
704 CATCH (e
, RETURN_MASK_ERROR
)
706 if (compiler
->symbol_err_map
== NULL
)
707 compiler
->symbol_err_map
= htab_create_alloc (10,
713 insert_symbol_error (compiler
->symbol_err_map
, sym
, e
.message
);
718 /* See compile-internal.h. */
721 generate_c_for_variable_locations (struct compile_c_instance
*compiler
,
722 struct ui_file
*stream
,
723 struct gdbarch
*gdbarch
,
724 const struct block
*block
,
727 struct cleanup
*cleanup
, *outer
;
729 const struct block
*static_block
= block_static_block (block
);
730 unsigned char *registers_used
;
732 /* If we're already in the static or global block, there is nothing
734 if (static_block
== NULL
|| block
== static_block
)
737 registers_used
= XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch
));
738 outer
= make_cleanup (xfree
, registers_used
);
740 /* Ensure that a given name is only entered once. This reflects the
741 reality of shadowing. */
742 symhash
= htab_create_alloc (1, hash_symname
, eq_symname
, NULL
,
744 cleanup
= make_cleanup_htab_delete (symhash
);
749 struct block_iterator iter
;
751 /* Iterate over symbols in this block, generating code to
752 compute the location of each local variable. */
753 for (sym
= block_iterator_first (block
, &iter
);
755 sym
= block_iterator_next (&iter
))
757 if (!symbol_seen (symhash
, sym
))
758 generate_c_for_for_one_variable (compiler
, stream
, gdbarch
,
759 registers_used
, pc
, sym
);
762 /* If we just finished the outermost block of a function, we're
764 if (BLOCK_FUNCTION (block
) != NULL
)
766 block
= BLOCK_SUPERBLOCK (block
);
769 do_cleanups (cleanup
);
770 discard_cleanups (outer
);
771 return registers_used
;