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