Stop assuming no-debug-info functions return int
[deliverable/binutils-gdb.git] / gdb / compile / compile-c-symbols.c
1 /* Convert symbols from GDB to GCC
2
3 Copyright (C) 2014-2017 Free Software Foundation, Inc.
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"
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
37 struct 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
51 static hashval_t
52 hash_symbol_error (const void *a)
53 {
54 const struct symbol_error *se = (const struct symbol_error *) a;
55
56 return htab_hash_pointer (se->sym);
57 }
58
59 /* Equality function for struct symbol_error. */
60
61 static int
62 eq_symbol_error (const void *a, const void *b)
63 {
64 const struct symbol_error *sea = (const struct symbol_error *) a;
65 const struct symbol_error *seb = (const struct symbol_error *) b;
66
67 return sea->sym == seb->sym;
68 }
69
70 /* Deletion function for struct symbol_error. */
71
72 static void
73 del_symbol_error (void *a)
74 {
75 struct symbol_error *se = (struct symbol_error *) a;
76
77 xfree (se->message);
78 xfree (se);
79 }
80
81 /* Associate SYMBOL with some error text. */
82
83 static void
84 insert_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
104 static void
105 error_symbol_once (struct compile_c_instance *context,
106 const struct symbol *sym)
107 {
108 struct symbol_error search;
109 struct symbol_error *err;
110
111 if (context->symbol_err_map == NULL)
112 return;
113
114 search.sym = sym;
115 err = (struct symbol_error *) htab_find (context->symbol_err_map, &search);
116 if (err == NULL || err->message == NULL)
117 return;
118
119 gdb::unique_xmalloc_ptr<char> message (err->message);
120 err->message = NULL;
121 error (_("%s"), message.get ());
122 }
123
124 \f
125
126 /* Compute the name of the pointer representing a local symbol's
127 address. */
128
129 static gdb::unique_xmalloc_ptr<char>
130 symbol_substitution_name (struct symbol *sym)
131 {
132 return gdb::unique_xmalloc_ptr<char>
133 (concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL));
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
143 static void
144 convert_one_symbol (struct compile_c_instance *context,
145 struct block_symbol sym,
146 int is_global,
147 int is_local)
148 {
149 gcc_type sym_type;
150 const char *filename = symbol_symtab (sym.symbol)->filename;
151 unsigned short line = SYMBOL_LINE (sym.symbol);
152
153 error_symbol_once (context, sym.symbol);
154
155 if (SYMBOL_CLASS (sym.symbol) == LOC_LABEL)
156 sym_type = 0;
157 else
158 sym_type = convert_type (context, SYMBOL_TYPE (sym.symbol));
159
160 if (SYMBOL_DOMAIN (sym.symbol) == STRUCT_DOMAIN)
161 {
162 /* Binding a tag, so we don't need to build a decl. */
163 C_CTX (context)->c_ops->tagbind (C_CTX (context),
164 SYMBOL_NATURAL_NAME (sym.symbol),
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;
172 gdb::unique_xmalloc_ptr<char> symbol_name;
173
174 switch (SYMBOL_CLASS (sym.symbol))
175 {
176 case LOC_TYPEDEF:
177 kind = GCC_C_SYMBOL_TYPEDEF;
178 break;
179
180 case LOC_LABEL:
181 kind = GCC_C_SYMBOL_LABEL;
182 addr = SYMBOL_VALUE_ADDRESS (sym.symbol);
183 break;
184
185 case LOC_BLOCK:
186 kind = GCC_C_SYMBOL_FUNCTION;
187 addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym.symbol));
188 if (is_global && TYPE_GNU_IFUNC (SYMBOL_TYPE (sym.symbol)))
189 addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
190 break;
191
192 case LOC_CONST:
193 if (TYPE_CODE (SYMBOL_TYPE (sym.symbol)) == TYPE_CODE_ENUM)
194 {
195 /* Already handled by convert_enum. */
196 return;
197 }
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);
203 return;
204
205 case LOC_CONST_BYTES:
206 error (_("Unsupported LOC_CONST_BYTES for symbol \"%s\"."),
207 SYMBOL_PRINT_NAME (sym.symbol));
208
209 case LOC_UNDEF:
210 internal_error (__FILE__, __LINE__, _("LOC_UNDEF found for \"%s\"."),
211 SYMBOL_PRINT_NAME (sym.symbol));
212
213 case LOC_COMMON_BLOCK:
214 error (_("Fortran common block is unsupported for compilation "
215 "evaluaton of symbol \"%s\"."),
216 SYMBOL_PRINT_NAME (sym.symbol));
217
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.symbol));
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."),
230 SYMBOL_PRINT_NAME (sym.symbol));
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
241 if (symbol_read_needs_frame (sym.symbol))
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"),
247 SYMBOL_PRINT_NAME (sym.symbol));
248 }
249
250 val = read_var_value (sym.symbol, sym.block, 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.symbol));
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;
269 symbol_name = symbol_substitution_name (sym.symbol);
270 break;
271
272 case LOC_STATIC:
273 kind = GCC_C_SYMBOL_VARIABLE;
274 addr = SYMBOL_VALUE_ADDRESS (sym.symbol);
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 {
287 decl = C_CTX (context)->c_ops->build_decl
288 (C_CTX (context),
289 SYMBOL_NATURAL_NAME (sym.symbol),
290 kind,
291 sym_type,
292 symbol_name.get (), addr,
293 filename, line);
294
295 C_CTX (context)->c_ops->bind (C_CTX (context), decl, is_global);
296 }
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
304 static void
305 convert_symbol_sym (struct compile_c_instance *context, const char *identifier,
306 struct block_symbol sym, domain_enum domain)
307 {
308 const struct block *static_block;
309 int is_local_symbol;
310
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
323 static_block = block_static_block (sym.block);
324 /* STATIC_BLOCK is NULL if FOUND_BLOCK is the global block. */
325 is_local_symbol = (sym.block != static_block && static_block != NULL);
326 if (is_local_symbol)
327 {
328 struct block_symbol global_sym;
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. */
333 if (global_sym.symbol != NULL
334 && global_sym.block != block_static_block (global_sym.block))
335 {
336 if (compile_debug)
337 fprintf_unfiltered (gdb_stdlog,
338 "gcc_convert_symbol \"%s\": global symbol\n",
339 identifier);
340 convert_one_symbol (context, global_sym, 1, 0);
341 }
342 }
343
344 if (compile_debug)
345 fprintf_unfiltered (gdb_stdlog,
346 "gcc_convert_symbol \"%s\": local symbol\n",
347 identifier);
348 convert_one_symbol (context, sym, 0, is_local_symbol);
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
354 static void
355 convert_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
366 addr = MSYMBOL_VALUE_ADDRESS (objfile, msym);
367
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:
379 type = objfile_type (objfile)->nodebug_text_gnu_ifunc_symbol;
380 kind = GCC_C_SYMBOL_FUNCTION;
381 addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
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);
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
413 void
414 gcc_convert_symbol (void *datum,
415 struct gcc_c_context *gcc_context,
416 enum gcc_c_oracle_request request,
417 const char *identifier)
418 {
419 struct compile_c_instance *context = (struct compile_c_instance *) datum;
420 domain_enum domain;
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. */
440 TRY
441 {
442 struct block_symbol sym;
443
444 sym = lookup_symbol (identifier, context->base.block, domain, NULL);
445 if (sym.symbol != NULL)
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
463 CATCH (e, RETURN_MASK_ALL)
464 {
465 C_CTX (context)->c_ops->error (C_CTX (context), e.message);
466 }
467 END_CATCH
468
469 if (compile_debug && !found)
470 fprintf_unfiltered (gdb_stdlog,
471 "gcc_convert_symbol \"%s\": lookup_symbol failed\n",
472 identifier);
473 return;
474 }
475
476 /* See compile-internal.h. */
477
478 gcc_address
479 gcc_symbol_address (void *datum, struct gcc_c_context *gcc_context,
480 const char *identifier)
481 {
482 struct compile_c_instance *context = (struct compile_c_instance *) datum;
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. */
488 TRY
489 {
490 struct symbol *sym;
491
492 /* We only need global functions here. */
493 sym = lookup_symbol (identifier, NULL, VAR_DOMAIN, NULL).symbol;
494 if (sym != NULL && SYMBOL_CLASS (sym) == LOC_BLOCK)
495 {
496 if (compile_debug)
497 fprintf_unfiltered (gdb_stdlog,
498 "gcc_symbol_address \"%s\": full symbol\n",
499 identifier);
500 result = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
501 if (TYPE_GNU_IFUNC (SYMBOL_TYPE (sym)))
502 result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
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)
513 fprintf_unfiltered (gdb_stdlog,
514 "gcc_symbol_address \"%s\": minimal "
515 "symbol\n",
516 identifier);
517 result = BMSYMBOL_VALUE_ADDRESS (msym);
518 if (MSYMBOL_TYPE (msym.minsym) == mst_text_gnu_ifunc)
519 result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
520 found = 1;
521 }
522 }
523 }
524
525 CATCH (e, RETURN_MASK_ERROR)
526 {
527 C_CTX (context)->c_ops->error (C_CTX (context), e.message);
528 }
529 END_CATCH
530
531 if (compile_debug && !found)
532 fprintf_unfiltered (gdb_stdlog,
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
542 static hashval_t
543 hash_symname (const void *a)
544 {
545 const struct symbol *sym = (const struct symbol *) a;
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
553 static int
554 eq_symname (const void *a, const void *b)
555 {
556 const struct symbol *syma = (const struct symbol *) a;
557 const struct symbol *symb = (const struct symbol *) b;
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
565 static int
566 symbol_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
580 static void
581 generate_vla_size (struct compile_c_instance *compiler,
582 string_file &stream,
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
591 if (TYPE_IS_REFERENCE (type))
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;
602 std::string name = c_get_range_decl_name (prop);
603
604 dwarf2_compile_property_to_c (stream, name.c_str (),
605 gdbarch, registers_used,
606 prop, pc, sym);
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
634 static void
635 generate_c_for_for_one_variable (struct compile_c_instance *compiler,
636 string_file &stream,
637 struct gdbarch *gdbarch,
638 unsigned char *registers_used,
639 CORE_ADDR pc,
640 struct symbol *sym)
641 {
642
643 TRY
644 {
645 if (is_dynamic_type (SYMBOL_TYPE (sym)))
646 {
647 /* We need to emit to a temporary buffer in case an error
648 occurs in the middle. */
649 string_file local_file;
650
651 generate_vla_size (compiler, local_file, gdbarch, registers_used, pc,
652 SYMBOL_TYPE (sym), sym);
653
654 stream.write (local_file.c_str (), local_file.size ());
655 }
656
657 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
658 {
659 gdb::unique_xmalloc_ptr<char> generated_name
660 = symbol_substitution_name (sym);
661 /* We need to emit to a temporary buffer in case an error
662 occurs in the middle. */
663 string_file local_file;
664
665 SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file,
666 gdbarch,
667 registers_used,
668 pc,
669 generated_name.get ());
670 stream.write (local_file.c_str (), local_file.size ());
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
695 CATCH (e, RETURN_MASK_ERROR)
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 }
706 END_CATCH
707 }
708
709 /* See compile-internal.h. */
710
711 unsigned char *
712 generate_c_for_variable_locations (struct compile_c_instance *compiler,
713 string_file &stream,
714 struct gdbarch *gdbarch,
715 const struct block *block,
716 CORE_ADDR pc)
717 {
718 struct cleanup *outer;
719 const struct block *static_block = block_static_block (block);
720 unsigned char *registers_used;
721
722 /* If we're already in the static or global block, there is nothing
723 to write. */
724 if (static_block == NULL || block == static_block)
725 return NULL;
726
727 registers_used = XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch));
728 outer = make_cleanup (xfree, registers_used);
729
730 /* Ensure that a given name is only entered once. This reflects the
731 reality of shadowing. */
732 htab_up symhash (htab_create_alloc (1, hash_symname, eq_symname, NULL,
733 xcalloc, xfree));
734
735 while (1)
736 {
737 struct symbol *sym;
738 struct block_iterator iter;
739
740 /* Iterate over symbols in this block, generating code to
741 compute the location of each local variable. */
742 for (sym = block_iterator_first (block, &iter);
743 sym != NULL;
744 sym = block_iterator_next (&iter))
745 {
746 if (!symbol_seen (symhash.get (), sym))
747 generate_c_for_for_one_variable (compiler, stream, gdbarch,
748 registers_used, pc, sym);
749 }
750
751 /* If we just finished the outermost block of a function, we're
752 done. */
753 if (BLOCK_FUNCTION (block) != NULL)
754 break;
755 block = BLOCK_SUPERBLOCK (block);
756 }
757
758 discard_cleanups (outer);
759 return registers_used;
760 }
This page took 0.061539 seconds and 4 git commands to generate.