OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [toplev.c] - Blame information for rev 803

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 684 jeremybenn
/* Top level of GCC compilers (cc1, cc1plus, etc.)
2
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4
   2011 Free Software Foundation, Inc.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* This is the top level of cc1/c++.
23
   It parses command args, opens files, invokes the various passes
24
   in the proper order, and counts the time used by each.
25
   Error messages and low-level interface to malloc also handled here.  */
26
 
27
#include "config.h"
28
#include "system.h"
29
#include "coretypes.h"
30
#include "tm.h"
31
#include "line-map.h"
32
#include "input.h"
33
#include "tree.h"
34
#include "realmpfr.h"   /* For GMP/MPFR/MPC versions, in print_version.  */
35
#include "version.h"
36
#include "rtl.h"
37
#include "tm_p.h"
38
#include "flags.h"
39
#include "insn-attr.h"
40
#include "insn-config.h"
41
#include "insn-flags.h"
42
#include "hard-reg-set.h"
43
#include "recog.h"
44
#include "output.h"
45
#include "except.h"
46
#include "function.h"
47
#include "toplev.h"
48
#include "expr.h"
49
#include "basic-block.h"
50
#include "intl.h"
51
#include "ggc.h"
52
#include "graph.h"
53
#include "regs.h"
54
#include "timevar.h"
55
#include "diagnostic.h"
56
#include "tree-diagnostic.h"
57
#include "tree-pretty-print.h"
58
#include "params.h"
59
#include "reload.h"
60
#include "ira.h"
61
#include "dwarf2asm.h"
62
#include "integrate.h"
63
#include "debug.h"
64
#include "target.h"
65
#include "common/common-target.h"
66
#include "langhooks.h"
67
#include "cfglayout.h"
68
#include "cfgloop.h"
69
#include "hosthooks.h"
70
#include "cgraph.h"
71
#include "opts.h"
72
#include "opts-diagnostic.h"
73
#include "coverage.h"
74
#include "value-prof.h"
75
#include "alloc-pool.h"
76
#include "tree-mudflap.h"
77
#include "tree-pass.h"
78
#include "gimple.h"
79
#include "tree-ssa-alias.h"
80
#include "plugin.h"
81
 
82
#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
83
#include "dwarf2out.h"
84
#endif
85
 
86
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
87
#include "dbxout.h"
88
#endif
89
 
90
#ifdef SDB_DEBUGGING_INFO
91
#include "sdbout.h"
92
#endif
93
 
94
#ifdef XCOFF_DEBUGGING_INFO
95
#include "xcoffout.h"           /* Needed for external data
96
                                   declarations for e.g. AIX 4.x.  */
97
#endif
98
 
99
static void general_init (const char *);
100
static void do_compile (void);
101
static void process_options (void);
102
static void backend_init (void);
103
static int lang_dependent_init (const char *);
104
static void init_asm_output (const char *);
105
static void finalize (bool);
106
 
107
static void crash_signal (int) ATTRIBUTE_NORETURN;
108
static void compile_file (void);
109
 
110
/* True if we don't need a backend (e.g. preprocessing only).  */
111
static bool no_backend;
112
 
113
/* Length of line when printing switch values.  */
114
#define MAX_LINE 75
115
 
116
/* Decoded options, and number of such options.  */
117
struct cl_decoded_option *save_decoded_options;
118
unsigned int save_decoded_options_count;
119
 
120
/* Used to enable -fvar-tracking, -fweb and -frename-registers according
121
   to optimize in process_options ().  */
122
#define AUTODETECT_VALUE 2
123
 
124
/* Debug hooks - dependent upon command line options.  */
125
 
126
const struct gcc_debug_hooks *debug_hooks;
127
 
128
/* The FUNCTION_DECL for the function currently being compiled,
129
   or 0 if between functions.  */
130
tree current_function_decl;
131
 
132
/* Set to the FUNC_BEGIN label of the current function, or NULL
133
   if none.  */
134
const char * current_function_func_begin_label;
135
 
136
/* A random sequence of characters, unless overridden by user.  */
137
static const char *flag_random_seed;
138
 
139
/* A local time stamp derived from the time of compilation. It will be
140
   zero if the system cannot provide a time.  It will be -1u, if the
141
   user has specified a particular random seed.  */
142
unsigned local_tick;
143
 
144
/* Random number for this compilation */
145
HOST_WIDE_INT random_seed;
146
 
147
/* -f flags.  */
148
 
149
/* Nonzero means make permerror produce warnings instead of errors.  */
150
 
151
int flag_permissive = 0;
152
 
153
/* When non-NULL, indicates that whenever space is allocated on the
154
   stack, the resulting stack pointer must not pass this
155
   address---that is, for stacks that grow downward, the stack pointer
156
   must always be greater than or equal to this address; for stacks
157
   that grow upward, the stack pointer must be less than this address.
158
   At present, the rtx may be either a REG or a SYMBOL_REF, although
159
   the support provided depends on the backend.  */
160
rtx stack_limit_rtx;
161
 
162
/* True if the user has tagged the function with the 'section'
163
   attribute.  */
164
 
165
bool user_defined_section_attribute = false;
166
 
167
struct target_flag_state default_target_flag_state;
168
#if SWITCHABLE_TARGET
169
struct target_flag_state *this_target_flag_state = &default_target_flag_state;
170
#else
171
#define this_target_flag_state (&default_target_flag_state)
172
#endif
173
 
174
/* The user symbol prefix after having resolved same.  */
175
const char *user_label_prefix;
176
 
177
/* Output files for assembler code (real compiler output)
178
   and debugging dumps.  */
179
 
180
FILE *asm_out_file;
181
FILE *aux_info_file;
182
FILE *stack_usage_file = NULL;
183
FILE *dump_file = NULL;
184
const char *dump_file_name;
185
 
186
/* The current working directory of a translation.  It's generally the
187
   directory from which compilation was initiated, but a preprocessed
188
   file may specify the original directory in which it was
189
   created.  */
190
 
191
static const char *src_pwd;
192
 
193
/* Initialize src_pwd with the given string, and return true.  If it
194
   was already initialized, return false.  As a special case, it may
195
   be called with a NULL argument to test whether src_pwd has NOT been
196
   initialized yet.  */
197
 
198
bool
199
set_src_pwd (const char *pwd)
200
{
201
  if (src_pwd)
202
    {
203
      if (strcmp (src_pwd, pwd) == 0)
204
        return true;
205
      else
206
        return false;
207
    }
208
 
209
  src_pwd = xstrdup (pwd);
210
  return true;
211
}
212
 
213
/* Return the directory from which the translation unit was initiated,
214
   in case set_src_pwd() was not called before to assign it a
215
   different value.  */
216
 
217
const char *
218
get_src_pwd (void)
219
{
220
  if (! src_pwd)
221
    {
222
      src_pwd = getpwd ();
223
      if (!src_pwd)
224
        src_pwd = ".";
225
    }
226
 
227
   return src_pwd;
228
}
229
 
230
/* Called when the start of a function definition is parsed,
231
   this function prints on stderr the name of the function.  */
232
void
233
announce_function (tree decl)
234
{
235
  if (!quiet_flag)
236
    {
237
      if (rtl_dump_and_exit)
238
        fprintf (stderr, "%s ",
239
                 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
240
      else
241
        fprintf (stderr, " %s",
242
                 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
243
      fflush (stderr);
244
      pp_needs_newline (global_dc->printer) = true;
245
      diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
246
    }
247
}
248
 
249
/* Initialize local_tick with a random number or -1 if
250
   flag_random_seed is set.  */
251
 
252
static void
253
init_local_tick (void)
254
{
255
  if (!flag_random_seed)
256
    {
257
      /* Try urandom first. Time of day is too likely to collide.
258
         In case of any error we just use the local tick. */
259
 
260
      int fd = open ("/dev/urandom", O_RDONLY);
261
      if (fd >= 0)
262
        {
263
          read (fd, &random_seed, sizeof (random_seed));
264
          close (fd);
265
        }
266
 
267
      /* Now get the tick anyways  */
268
#ifdef HAVE_GETTIMEOFDAY
269
      {
270
        struct timeval tv;
271
 
272
        gettimeofday (&tv, NULL);
273
        local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000;
274
      }
275
#else
276
      {
277
        time_t now = time (NULL);
278
 
279
        if (now != (time_t)-1)
280
          local_tick = (unsigned) now;
281
      }
282
#endif
283
    }
284
  else
285
    local_tick = -1;
286
}
287
 
288
/* Set up a default flag_random_seed and local_tick, unless the user
289
   already specified one.  Must be called after init_local_tick.  */
290
 
291
static void
292
init_random_seed (void)
293
{
294
  if (flag_random_seed)
295
    {
296
      char *endp;
297
 
298
      /* When the driver passed in a hex number don't crc it again */
299
      random_seed = strtoul (flag_random_seed, &endp, 0);
300
      if (!(endp > flag_random_seed && *endp == 0))
301
        random_seed = crc32_string (0, flag_random_seed);
302
    }
303
  else if (!random_seed)
304
    random_seed = local_tick ^ getpid ();  /* Old racey fallback method */
305
}
306
 
307
/* Obtain the random_seed.  Unless NOINIT, initialize it if
308
   it's not provided in the command line.  */
309
 
310
HOST_WIDE_INT
311
get_random_seed (bool noinit)
312
{
313
  if (!flag_random_seed && !noinit)
314
    init_random_seed ();
315
  return random_seed;
316
}
317
 
318
/* Modify the random_seed string to VAL.  Return its previous
319
   value.  */
320
 
321
const char *
322
set_random_seed (const char *val)
323
{
324
  const char *old = flag_random_seed;
325
  flag_random_seed = val;
326
  return old;
327
}
328
 
329
/* Handler for fatal signals, such as SIGSEGV.  These are transformed
330
   into ICE messages, which is much more user friendly.  In case the
331
   error printer crashes, reset the signal to prevent infinite recursion.  */
332
 
333
static void
334
crash_signal (int signo)
335
{
336
  signal (signo, SIG_DFL);
337
 
338
  /* If we crashed while processing an ASM statement, then be a little more
339
     graceful.  It's most likely the user's fault.  */
340
  if (this_is_asm_operands)
341
    {
342
      output_operand_lossage ("unrecoverable error");
343
      exit (FATAL_EXIT_CODE);
344
    }
345
 
346
  internal_error ("%s", strsignal (signo));
347
}
348
 
349
/* A subroutine of wrapup_global_declarations.  We've come to the end of
350
   the compilation unit.  All deferred variables should be undeferred,
351
   and all incomplete decls should be finalized.  */
352
 
353
void
354
wrapup_global_declaration_1 (tree decl)
355
{
356
  /* We're not deferring this any longer.  Assignment is conditional to
357
     avoid needlessly dirtying PCH pages.  */
358
  if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
359
      && DECL_DEFER_OUTPUT (decl) != 0)
360
    DECL_DEFER_OUTPUT (decl) = 0;
361
 
362
  if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
363
    lang_hooks.finish_incomplete_decl (decl);
364
}
365
 
366
/* A subroutine of wrapup_global_declarations.  Decide whether or not DECL
367
   needs to be output.  Return true if it is output.  */
368
 
369
bool
370
wrapup_global_declaration_2 (tree decl)
371
{
372
  if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
373
    return false;
374
 
375
  /* Don't write out static consts, unless we still need them.
376
 
377
     We also keep static consts if not optimizing (for debugging),
378
     unless the user specified -fno-keep-static-consts.
379
     ??? They might be better written into the debug information.
380
     This is possible when using DWARF.
381
 
382
     A language processor that wants static constants to be always
383
     written out (even if it is not used) is responsible for
384
     calling rest_of_decl_compilation itself.  E.g. the C front-end
385
     calls rest_of_decl_compilation from finish_decl.
386
     One motivation for this is that is conventional in some
387
     environments to write things like:
388
     static const char rcsid[] = "... version string ...";
389
     intending to force the string to be in the executable.
390
 
391
     A language processor that would prefer to have unneeded
392
     static constants "optimized away" would just defer writing
393
     them out until here.  E.g. C++ does this, because static
394
     constants are often defined in header files.
395
 
396
     ??? A tempting alternative (for both C and C++) would be
397
     to force a constant to be written if and only if it is
398
     defined in a main file, as opposed to an include file.  */
399
 
400
  if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
401
    {
402
      struct varpool_node *node;
403
      bool needed = true;
404
      node = varpool_get_node (decl);
405
 
406
      if (!node && flag_ltrans)
407
        needed = false;
408
      else if (node && node->finalized)
409
        needed = false;
410
      else if (node && node->alias)
411
        needed = false;
412
      else if (!cgraph_global_info_ready
413
               && (TREE_USED (decl)
414
                   || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
415
        /* needed */;
416
      else if (node && node->needed)
417
        /* needed */;
418
      else if (DECL_COMDAT (decl))
419
        needed = false;
420
      else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
421
               && (optimize || !flag_keep_static_consts
422
                   || DECL_ARTIFICIAL (decl)))
423
        needed = false;
424
 
425
      if (needed)
426
        {
427
          rest_of_decl_compilation (decl, 1, 1);
428
          return true;
429
        }
430
    }
431
 
432
  return false;
433
}
434
 
435
/* Do any final processing required for the declarations in VEC, of
436
   which there are LEN.  We write out inline functions and variables
437
   that have been deferred until this point, but which are required.
438
   Returns nonzero if anything was put out.  */
439
 
440
bool
441
wrapup_global_declarations (tree *vec, int len)
442
{
443
  bool reconsider, output_something = false;
444
  int i;
445
 
446
  for (i = 0; i < len; i++)
447
    wrapup_global_declaration_1 (vec[i]);
448
 
449
  /* Now emit any global variables or functions that we have been
450
     putting off.  We need to loop in case one of the things emitted
451
     here references another one which comes earlier in the list.  */
452
  do
453
    {
454
      reconsider = false;
455
      for (i = 0; i < len; i++)
456
        reconsider |= wrapup_global_declaration_2 (vec[i]);
457
      if (reconsider)
458
        output_something = true;
459
    }
460
  while (reconsider);
461
 
462
  return output_something;
463
}
464
 
465
/* A subroutine of check_global_declarations.  Issue appropriate warnings
466
   for the global declaration DECL.  */
467
 
468
void
469
check_global_declaration_1 (tree decl)
470
{
471
  /* Warn about any function declared static but not defined.  We don't
472
     warn about variables, because many programs have static variables
473
     that exist only to get some text into the object file.  */
474
  if (TREE_CODE (decl) == FUNCTION_DECL
475
      && DECL_INITIAL (decl) == 0
476
      && DECL_EXTERNAL (decl)
477
      && ! DECL_ARTIFICIAL (decl)
478
      && ! TREE_NO_WARNING (decl)
479
      && ! TREE_PUBLIC (decl)
480
      && (warn_unused_function
481
          || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
482
    {
483
      if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
484
        pedwarn (input_location, 0, "%q+F used but never defined", decl);
485
      else
486
        warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
487
      /* This symbol is effectively an "extern" declaration now.  */
488
      TREE_PUBLIC (decl) = 1;
489
      assemble_external (decl);
490
    }
491
 
492
  /* Warn about static fns or vars defined but not used.  */
493
  if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
494
       /* We don't warn about "static const" variables because the
495
          "rcs_id" idiom uses that construction.  */
496
       || (warn_unused_variable
497
           && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
498
      && ! DECL_IN_SYSTEM_HEADER (decl)
499
      && ! TREE_USED (decl)
500
      /* The TREE_USED bit for file-scope decls is kept in the identifier,
501
         to handle multiple external decls in different scopes.  */
502
      && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
503
      && ! DECL_EXTERNAL (decl)
504
      && ! TREE_PUBLIC (decl)
505
      /* A volatile variable might be used in some non-obvious way.  */
506
      && ! TREE_THIS_VOLATILE (decl)
507
      /* Global register variables must be declared to reserve them.  */
508
      && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
509
      /* Otherwise, ask the language.  */
510
      && lang_hooks.decls.warn_unused_global (decl))
511
    warning ((TREE_CODE (decl) == FUNCTION_DECL)
512
             ? OPT_Wunused_function
513
             : OPT_Wunused_variable,
514
             "%q+D defined but not used", decl);
515
}
516
 
517
/* Issue appropriate warnings for the global declarations in VEC (of
518
   which there are LEN).  */
519
 
520
void
521
check_global_declarations (tree *vec, int len)
522
{
523
  int i;
524
 
525
  for (i = 0; i < len; i++)
526
    check_global_declaration_1 (vec[i]);
527
}
528
 
529
/* Emit debugging information for all global declarations in VEC.  */
530
 
531
void
532
emit_debug_global_declarations (tree *vec, int len)
533
{
534
  int i;
535
 
536
  /* Avoid confusing the debug information machinery when there are errors.  */
537
  if (seen_error ())
538
    return;
539
 
540
  timevar_push (TV_SYMOUT);
541
  for (i = 0; i < len; i++)
542
    debug_hooks->global_decl (vec[i]);
543
  timevar_pop (TV_SYMOUT);
544
}
545
 
546
/* Compile an entire translation unit.  Write a file of assembly
547
   output and various debugging dumps.  */
548
 
549
static void
550
compile_file (void)
551
{
552
  timevar_start (TV_PHASE_PARSING);
553
  timevar_push (TV_PARSE_GLOBAL);
554
 
555
  /* Call the parser, which parses the entire file (calling
556
     rest_of_compilation for each function).  */
557
  lang_hooks.parse_file ();
558
 
559
  timevar_pop (TV_PARSE_GLOBAL);
560
  timevar_stop (TV_PHASE_PARSING);
561
 
562
  /* Compilation is now finished except for writing
563
     what's left of the symbol table output.  */
564
 
565
  if (flag_syntax_only || flag_wpa)
566
    return;
567
 
568
  timevar_start (TV_PHASE_GENERATE);
569
 
570
  ggc_protect_identifiers = false;
571
 
572
  /* This must also call cgraph_finalize_compilation_unit.  */
573
  lang_hooks.decls.final_write_globals ();
574
 
575
  if (seen_error ())
576
    {
577
      timevar_stop (TV_PHASE_GENERATE);
578
      return;
579
    }
580
 
581
  /* Compilation unit is finalized.  When producing non-fat LTO object, we are
582
     basically finished.  */
583
  if (in_lto_p || !flag_lto || flag_fat_lto_objects)
584
    {
585
      varpool_assemble_pending_decls ();
586
      finish_aliases_2 ();
587
 
588
      /* Likewise for mudflap static object registrations.  */
589
      if (flag_mudflap)
590
        mudflap_finish_file ();
591
 
592
      output_shared_constant_pool ();
593
      output_object_blocks ();
594
  finish_tm_clone_pairs ();
595
 
596
      /* Write out any pending weak symbol declarations.  */
597
      weak_finish ();
598
 
599
      /* This must be at the end before unwind and debug info.
600
         Some target ports emit PIC setup thunks here.  */
601
      targetm.asm_out.code_end ();
602
 
603
      /* Do dbx symbols.  */
604
      timevar_push (TV_SYMOUT);
605
 
606
    #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
607
      if (dwarf2out_do_frame ())
608
        dwarf2out_frame_finish ();
609
    #endif
610
 
611
      (*debug_hooks->finish) (main_input_filename);
612
      timevar_pop (TV_SYMOUT);
613
 
614
      /* Output some stuff at end of file if nec.  */
615
 
616
      dw2_output_indirect_constants ();
617
 
618
      /* Flush any pending external directives.  */
619
      process_pending_assemble_externals ();
620
   }
621
 
622
  /* Emit LTO marker if LTO info has been previously emitted.  This is
623
     used by collect2 to determine whether an object file contains IL.
624
     We used to emit an undefined reference here, but this produces
625
     link errors if an object file with IL is stored into a shared
626
     library without invoking lto1.  */
627
  if (flag_generate_lto)
628
    {
629
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
630
      ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
631
                                      "__gnu_lto_v1",
632
                                      (unsigned HOST_WIDE_INT) 1, 8);
633
#elif defined ASM_OUTPUT_ALIGNED_COMMON
634
      ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1",
635
                                 (unsigned HOST_WIDE_INT) 1, 8);
636
#else
637
      ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1",
638
                         (unsigned HOST_WIDE_INT) 1,
639
                         (unsigned HOST_WIDE_INT) 1);
640
#endif
641
      /* Let linker plugin know that this is a slim object and must be LTOed
642
         even when user did not ask for it.  */
643
      if (!flag_fat_lto_objects)
644
        {
645
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
646
          ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
647
                                          "__gnu_lto_slim",
648
                                          (unsigned HOST_WIDE_INT) 1, 8);
649
#elif defined ASM_OUTPUT_ALIGNED_COMMON
650
          ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
651
                                     (unsigned HOST_WIDE_INT) 1, 8);
652
#else
653
          ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
654
                             (unsigned HOST_WIDE_INT) 1,
655
                             (unsigned HOST_WIDE_INT) 1);
656
#endif
657
        }
658
    }
659
 
660
  /* Attach a special .ident directive to the end of the file to identify
661
     the version of GCC which compiled this code.  The format of the .ident
662
     string is patterned after the ones produced by native SVR4 compilers.  */
663
#ifdef IDENT_ASM_OP
664
  if (!flag_no_ident)
665
    {
666
      const char *pkg_version = "(GNU) ";
667
 
668
      if (strcmp ("(GCC) ", pkgversion_string))
669
        pkg_version = pkgversion_string;
670
      fprintf (asm_out_file, "%s\"GCC: %s%s\"\n",
671
               IDENT_ASM_OP, pkg_version, version_string);
672
    }
673
#endif
674
 
675
  /* Invoke registered plugin callbacks.  */
676
  invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
677
 
678
  /* This must be at the end.  Some target ports emit end of file directives
679
     into the assembly file here, and hence we can not output anything to the
680
     assembly file after this point.  */
681
  targetm.asm_out.file_end ();
682
 
683
  timevar_stop (TV_PHASE_GENERATE);
684
}
685
 
686
/* Print version information to FILE.
687
   Each line begins with INDENT (for the case where FILE is the
688
   assembler output file).  */
689
 
690
void
691
print_version (FILE *file, const char *indent)
692
{
693
  static const char fmt1[] =
694
#ifdef __GNUC__
695
    N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
696
#else
697
    N_("%s%s%s %sversion %s (%s) compiled by CC, ")
698
#endif
699
    ;
700
  static const char fmt2[] =
701
    N_("GMP version %s, MPFR version %s, MPC version %s\n");
702
  static const char fmt3[] =
703
    N_("%s%swarning: %s header version %s differs from library version %s.\n");
704
  static const char fmt4[] =
705
    N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
706
#ifndef __VERSION__
707
#define __VERSION__ "[?]"
708
#endif
709
  fprintf (file,
710
           file == stderr ? _(fmt1) : fmt1,
711
           indent, *indent != 0 ? " " : "",
712
           lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
713
           indent, __VERSION__);
714
 
715
  /* We need to stringify the GMP macro values.  Ugh, gmp_version has
716
     two string formats, "i.j.k" and "i.j" when k is zero.  As of
717
     gmp-4.3.0, GMP always uses the 3 number format.  */
718
#define GCC_GMP_STRINGIFY_VERSION3(X) #X
719
#define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
720
#define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
721
#define GCC_GMP_VERSION \
722
  GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
723
#if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
724
#define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
725
  GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR)
726
#else
727
#define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
728
  GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \
729
  GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL)
730
#endif
731
  fprintf (file,
732
           file == stderr ? _(fmt2) : fmt2,
733
           GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
734
  if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
735
    fprintf (file,
736
             file == stderr ? _(fmt3) : fmt3,
737
             indent, *indent != 0 ? " " : "",
738
             "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
739
  if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
740
    fprintf (file,
741
             file == stderr ? _(fmt3) : fmt3,
742
             indent, *indent != 0 ? " " : "",
743
             "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
744
  if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
745
    fprintf (file,
746
             file == stderr ? _(fmt3) : fmt3,
747
             indent, *indent != 0 ? " " : "",
748
             "MPC", MPC_VERSION_STRING, mpc_get_version ());
749
  fprintf (file,
750
           file == stderr ? _(fmt4) : fmt4,
751
           indent, *indent != 0 ? " " : "",
752
           PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
753
 
754
  print_plugins_versions (file, indent);
755
}
756
 
757
static int
758
print_to_asm_out_file (print_switch_type type, const char * text)
759
{
760
  bool prepend_sep = true;
761
 
762
  switch (type)
763
    {
764
    case SWITCH_TYPE_LINE_END:
765
      putc ('\n', asm_out_file);
766
      return 1;
767
 
768
    case SWITCH_TYPE_LINE_START:
769
      fputs (ASM_COMMENT_START, asm_out_file);
770
      return strlen (ASM_COMMENT_START);
771
 
772
    case SWITCH_TYPE_DESCRIPTIVE:
773
      if (ASM_COMMENT_START[0] == 0)
774
        prepend_sep = false;
775
      /* Drop through.  */
776
    case SWITCH_TYPE_PASSED:
777
    case SWITCH_TYPE_ENABLED:
778
      if (prepend_sep)
779
        fputc (' ', asm_out_file);
780
      fputs (text, asm_out_file);
781
      /* No need to return the length here as
782
         print_single_switch has already done it.  */
783
      return 0;
784
 
785
    default:
786
      return -1;
787
    }
788
}
789
 
790
static int
791
print_to_stderr (print_switch_type type, const char * text)
792
{
793
  switch (type)
794
    {
795
    case SWITCH_TYPE_LINE_END:
796
      putc ('\n', stderr);
797
      return 1;
798
 
799
    case SWITCH_TYPE_LINE_START:
800
      return 0;
801
 
802
    case SWITCH_TYPE_PASSED:
803
    case SWITCH_TYPE_ENABLED:
804
      fputc (' ', stderr);
805
      /* Drop through.  */
806
 
807
    case SWITCH_TYPE_DESCRIPTIVE:
808
      fputs (text, stderr);
809
      /* No need to return the length here as
810
         print_single_switch has already done it.  */
811
      return 0;
812
 
813
    default:
814
      return -1;
815
    }
816
}
817
 
818
/* Print an option value and return the adjusted position in the line.
819
   ??? print_fn doesn't handle errors, eg disk full; presumably other
820
   code will catch a disk full though.  */
821
 
822
static int
823
print_single_switch (print_switch_fn_type print_fn,
824
                     int pos,
825
                     print_switch_type type,
826
                     const char * text)
827
{
828
  /* The ultrix fprintf returns 0 on success, so compute the result
829
     we want here since we need it for the following test.  The +1
830
     is for the separator character that will probably be emitted.  */
831
  int len = strlen (text) + 1;
832
 
833
  if (pos != 0
834
      && pos + len > MAX_LINE)
835
    {
836
      print_fn (SWITCH_TYPE_LINE_END, NULL);
837
      pos = 0;
838
    }
839
 
840
  if (pos == 0)
841
    pos += print_fn (SWITCH_TYPE_LINE_START, NULL);
842
 
843
  print_fn (type, text);
844
  return pos + len;
845
}
846
 
847
/* Print active target switches using PRINT_FN.
848
   POS is the current cursor position and MAX is the size of a "line".
849
   Each line begins with INDENT and ends with TERM.
850
   Each switch is separated from the next by SEP.  */
851
 
852
static void
853
print_switch_values (print_switch_fn_type print_fn)
854
{
855
  int pos = 0;
856
  size_t j;
857
 
858
  /* Fill in the -frandom-seed option, if the user didn't pass it, so
859
     that it can be printed below.  This helps reproducibility.  */
860
  if (!flag_random_seed)
861
    init_random_seed ();
862
 
863
  /* Print the options as passed.  */
864
  pos = print_single_switch (print_fn, pos,
865
                             SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
866
 
867
  for (j = 1; j < save_decoded_options_count; j++)
868
    {
869
      switch (save_decoded_options[j].opt_index)
870
        {
871
        case OPT_o:
872
        case OPT_d:
873
        case OPT_dumpbase:
874
        case OPT_dumpdir:
875
        case OPT_auxbase:
876
        case OPT_quiet:
877
        case OPT_version:
878
          /* Ignore these.  */
879
          continue;
880
        }
881
 
882
      pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
883
                                 save_decoded_options[j].orig_option_with_args_text);
884
    }
885
 
886
  if (pos > 0)
887
    print_fn (SWITCH_TYPE_LINE_END, NULL);
888
 
889
  /* Print the -f and -m options that have been enabled.
890
     We don't handle language specific options but printing argv
891
     should suffice.  */
892
  pos = print_single_switch (print_fn, 0,
893
                             SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
894
 
895
  for (j = 0; j < cl_options_count; j++)
896
    if (cl_options[j].cl_report
897
        && option_enabled (j, &global_options) > 0)
898
      pos = print_single_switch (print_fn, pos,
899
                                 SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
900
 
901
  print_fn (SWITCH_TYPE_LINE_END, NULL);
902
}
903
 
904
/* Open assembly code output file.  Do this even if -fsyntax-only is
905
   on, because then the driver will have provided the name of a
906
   temporary file or bit bucket for us.  NAME is the file specified on
907
   the command line, possibly NULL.  */
908
static void
909
init_asm_output (const char *name)
910
{
911
  if (name == NULL && asm_file_name == 0)
912
    asm_out_file = stdout;
913
  else
914
    {
915
      if (asm_file_name == 0)
916
        {
917
          int len = strlen (dump_base_name);
918
          char *dumpname = XNEWVEC (char, len + 6);
919
 
920
          memcpy (dumpname, dump_base_name, len + 1);
921
          strip_off_ending (dumpname, len);
922
          strcat (dumpname, ".s");
923
          asm_file_name = dumpname;
924
        }
925
      if (!strcmp (asm_file_name, "-"))
926
        asm_out_file = stdout;
927
      else
928
        asm_out_file = fopen (asm_file_name, "w+b");
929
      if (asm_out_file == 0)
930
        fatal_error ("can%'t open %s for writing: %m", asm_file_name);
931
    }
932
 
933
  if (!flag_syntax_only)
934
    {
935
      targetm.asm_out.file_start ();
936
 
937
      if (flag_record_gcc_switches)
938
        {
939
          if (targetm.asm_out.record_gcc_switches)
940
            {
941
              /* Let the target know that we are about to start recording.  */
942
              targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
943
                                                   NULL);
944
              /* Now record the switches.  */
945
              print_switch_values (targetm.asm_out.record_gcc_switches);
946
              /* Let the target know that the recording is over.  */
947
              targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
948
                                                   NULL);
949
            }
950
          else
951
            inform (input_location, "-frecord-gcc-switches is not supported by the current target");
952
        }
953
 
954
      if (flag_verbose_asm)
955
        {
956
          /* Print the list of switches in effect
957
             into the assembler file as comments.  */
958
          print_version (asm_out_file, ASM_COMMENT_START);
959
          print_switch_values (print_to_asm_out_file);
960
          putc ('\n', asm_out_file);
961
        }
962
    }
963
}
964
 
965
/* Default tree printer.   Handles declarations only.  */
966
bool
967
default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
968
                      int precision, bool wide, bool set_locus, bool hash)
969
{
970
  tree t;
971
 
972
  /* FUTURE: %+x should set the locus.  */
973
  if (precision != 0 || wide || hash)
974
    return false;
975
 
976
  switch (*spec)
977
    {
978
    case 'E':
979
      t = va_arg (*text->args_ptr, tree);
980
      if (TREE_CODE (t) == IDENTIFIER_NODE)
981
        {
982
          pp_identifier (pp, IDENTIFIER_POINTER (t));
983
          return true;
984
        }
985
      break;
986
 
987
    case 'D':
988
      t = va_arg (*text->args_ptr, tree);
989
      if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
990
        t = DECL_DEBUG_EXPR (t);
991
      break;
992
 
993
    case 'F':
994
    case 'T':
995
      t = va_arg (*text->args_ptr, tree);
996
      break;
997
 
998
    case 'K':
999
      percent_K_format (text);
1000
      return true;
1001
 
1002
    default:
1003
      return false;
1004
    }
1005
 
1006
  if (set_locus && text->locus)
1007
    *text->locus = DECL_SOURCE_LOCATION (t);
1008
 
1009
  if (DECL_P (t))
1010
    {
1011
      const char *n = DECL_NAME (t)
1012
        ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2))
1013
        : _("<anonymous>");
1014
      pp_string (pp, n);
1015
    }
1016
  else
1017
    dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0);
1018
 
1019
  return true;
1020
}
1021
 
1022
/* A helper function; used as the reallocator function for cpp's line
1023
   table.  */
1024
static void *
1025
realloc_for_line_map (void *ptr, size_t len)
1026
{
1027
  return GGC_RESIZEVAR (void, ptr, len);
1028
}
1029
 
1030
/* A helper function: used as the allocator function for
1031
   identifier_to_locale.  */
1032
static void *
1033
alloc_for_identifier_to_locale (size_t len)
1034
{
1035
  return ggc_alloc_atomic (len);
1036
}
1037
 
1038
/* Output stack usage information.  */
1039
void
1040
output_stack_usage (void)
1041
{
1042
  static bool warning_issued = false;
1043
  enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED };
1044
  const char *stack_usage_kind_str[] = {
1045
    "static",
1046
    "dynamic",
1047
    "dynamic,bounded"
1048
  };
1049
  HOST_WIDE_INT stack_usage = current_function_static_stack_size;
1050
  enum stack_usage_kind_type stack_usage_kind;
1051
 
1052
  if (stack_usage < 0)
1053
    {
1054
      if (!warning_issued)
1055
        {
1056
          warning (0, "stack usage computation not supported for this target");
1057
          warning_issued = true;
1058
        }
1059
      return;
1060
    }
1061
 
1062
  stack_usage_kind = STATIC;
1063
 
1064
  /* Add the maximum amount of space pushed onto the stack.  */
1065
  if (current_function_pushed_stack_size > 0)
1066
    {
1067
      stack_usage += current_function_pushed_stack_size;
1068
      stack_usage_kind = DYNAMIC_BOUNDED;
1069
    }
1070
 
1071
  /* Now on to the tricky part: dynamic stack allocation.  */
1072
  if (current_function_allocates_dynamic_stack_space)
1073
    {
1074
      if (current_function_has_unbounded_dynamic_stack_size)
1075
        stack_usage_kind = DYNAMIC;
1076
      else
1077
        stack_usage_kind = DYNAMIC_BOUNDED;
1078
 
1079
      /* Add the size even in the unbounded case, this can't hurt.  */
1080
      stack_usage += current_function_dynamic_stack_size;
1081
    }
1082
 
1083
  if (flag_stack_usage)
1084
    {
1085
      expanded_location loc
1086
        = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1087
      const char *raw_id, *id;
1088
 
1089
      /* Strip the scope prefix if any.  */
1090
      raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
1091
      id = strrchr (raw_id, '.');
1092
      if (id)
1093
        id++;
1094
      else
1095
        id = raw_id;
1096
 
1097
      fprintf (stack_usage_file,
1098
               "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
1099
               lbasename (loc.file),
1100
               loc.line,
1101
               loc.column,
1102
               id,
1103
               stack_usage,
1104
               stack_usage_kind_str[stack_usage_kind]);
1105
    }
1106
 
1107
  if (warn_stack_usage >= 0)
1108
    {
1109
      if (stack_usage_kind == DYNAMIC)
1110
        warning (OPT_Wstack_usage_, "stack usage might be unbounded");
1111
      else if (stack_usage > warn_stack_usage)
1112
        {
1113
          if (stack_usage_kind == DYNAMIC_BOUNDED)
1114
            warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
1115
                     stack_usage);
1116
          else
1117
            warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
1118
                     stack_usage);
1119
        }
1120
    }
1121
}
1122
 
1123
/* Open an auxiliary output file.  */
1124
static FILE *
1125
open_auxiliary_file (const char *ext)
1126
{
1127
  char *filename;
1128
  FILE *file;
1129
 
1130
  filename = concat (aux_base_name, ".", ext, NULL);
1131
  file = fopen (filename, "w");
1132
  if (!file)
1133
    fatal_error ("can%'t open %s for writing: %m", filename);
1134
  free (filename);
1135
  return file;
1136
}
1137
 
1138
/* Initialization of the front end environment, before command line
1139
   options are parsed.  Signal handlers, internationalization etc.
1140
   ARGV0 is main's argv[0].  */
1141
static void
1142
general_init (const char *argv0)
1143
{
1144
  const char *p;
1145
 
1146
  p = argv0 + strlen (argv0);
1147
  while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1148
    --p;
1149
  progname = p;
1150
 
1151
  xmalloc_set_program_name (progname);
1152
 
1153
  hex_init ();
1154
 
1155
  /* Unlock the stdio streams.  */
1156
  unlock_std_streams ();
1157
 
1158
  gcc_init_libintl ();
1159
 
1160
  identifier_to_locale_alloc = alloc_for_identifier_to_locale;
1161
  identifier_to_locale_free = ggc_free;
1162
 
1163
  /* Initialize the diagnostics reporting machinery, so option parsing
1164
     can give warnings and errors.  */
1165
  diagnostic_initialize (global_dc, N_OPTS);
1166
  diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
1167
  /* By default print macro expansion contexts in the diagnostic
1168
     finalizer -- for tokens resulting from macro macro expansion.  */
1169
  diagnostic_finalizer (global_dc) = virt_loc_aware_diagnostic_finalizer;
1170
  /* Set a default printer.  Language specific initializations will
1171
     override it later.  */
1172
  pp_format_decoder (global_dc->printer) = &default_tree_printer;
1173
  global_dc->show_option_requested
1174
    = global_options_init.x_flag_diagnostics_show_option;
1175
  global_dc->show_column
1176
    = global_options_init.x_flag_show_column;
1177
  global_dc->internal_error = plugins_internal_error_function;
1178
  global_dc->option_enabled = option_enabled;
1179
  global_dc->option_state = &global_options;
1180
  global_dc->option_name = option_name;
1181
 
1182
  /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
1183
#ifdef SIGSEGV
1184
  signal (SIGSEGV, crash_signal);
1185
#endif
1186
#ifdef SIGILL
1187
  signal (SIGILL, crash_signal);
1188
#endif
1189
#ifdef SIGBUS
1190
  signal (SIGBUS, crash_signal);
1191
#endif
1192
#ifdef SIGABRT
1193
  signal (SIGABRT, crash_signal);
1194
#endif
1195
#if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1196
  signal (SIGIOT, crash_signal);
1197
#endif
1198
#ifdef SIGFPE
1199
  signal (SIGFPE, crash_signal);
1200
#endif
1201
 
1202
  /* Other host-specific signal setup.  */
1203
  (*host_hooks.extra_signals)();
1204
 
1205
  /* Initialize the garbage-collector, string pools and tree type hash
1206
     table.  */
1207
  init_ggc ();
1208
  init_stringpool ();
1209
  line_table = ggc_alloc_line_maps ();
1210
  linemap_init (line_table);
1211
  line_table->reallocator = realloc_for_line_map;
1212
  line_table->round_alloc_size = ggc_round_alloc_size;
1213
  init_ttree ();
1214
 
1215
  /* Initialize register usage now so switches may override.  */
1216
  init_reg_sets ();
1217
 
1218
  /* Register the language-independent parameters.  */
1219
  global_init_params ();
1220
 
1221
  /* This must be done after global_init_params but before argument
1222
     processing.  */
1223
  init_ggc_heuristics();
1224
  init_optimization_passes ();
1225
  statistics_early_init ();
1226
  finish_params ();
1227
}
1228
 
1229
/* Return true if the current target supports -fsection-anchors.  */
1230
 
1231
static bool
1232
target_supports_section_anchors_p (void)
1233
{
1234
  if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1235
    return false;
1236
 
1237
  if (targetm.asm_out.output_anchor == NULL)
1238
    return false;
1239
 
1240
  return true;
1241
}
1242
 
1243
/* Default the align_* variables to 1 if they're still unset, and
1244
   set up the align_*_log variables.  */
1245
static void
1246
init_alignments (void)
1247
{
1248
  if (align_loops <= 0)
1249
    align_loops = 1;
1250
  if (align_loops_max_skip > align_loops)
1251
    align_loops_max_skip = align_loops - 1;
1252
  align_loops_log = floor_log2 (align_loops * 2 - 1);
1253
  if (align_jumps <= 0)
1254
    align_jumps = 1;
1255
  if (align_jumps_max_skip > align_jumps)
1256
    align_jumps_max_skip = align_jumps - 1;
1257
  align_jumps_log = floor_log2 (align_jumps * 2 - 1);
1258
  if (align_labels <= 0)
1259
    align_labels = 1;
1260
  align_labels_log = floor_log2 (align_labels * 2 - 1);
1261
  if (align_labels_max_skip > align_labels)
1262
    align_labels_max_skip = align_labels - 1;
1263
  if (align_functions <= 0)
1264
    align_functions = 1;
1265
  align_functions_log = floor_log2 (align_functions * 2 - 1);
1266
}
1267
 
1268
/* Process the options that have been parsed.  */
1269
static void
1270
process_options (void)
1271
{
1272
  /* Just in case lang_hooks.post_options ends up calling a debug_hook.
1273
     This can happen with incorrect pre-processed input. */
1274
  debug_hooks = &do_nothing_debug_hooks;
1275
 
1276
  maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
1277
 
1278
  /* Allow the front end to perform consistency checks and do further
1279
     initialization based on the command line options.  This hook also
1280
     sets the original filename if appropriate (e.g. foo.i -> foo.c)
1281
     so we can correctly initialize debug output.  */
1282
  no_backend = lang_hooks.post_options (&main_input_filename);
1283
 
1284
  /* Some machines may reject certain combinations of options.  */
1285
  targetm.target_option.override ();
1286
 
1287
  /* Avoid any informative notes in the second run of -fcompare-debug.  */
1288
  if (flag_compare_debug)
1289
    diagnostic_inhibit_notes (global_dc);
1290
 
1291
  if (flag_section_anchors && !target_supports_section_anchors_p ())
1292
    {
1293
      warning (OPT_fsection_anchors,
1294
               "this target does not support %qs", "-fsection-anchors");
1295
      flag_section_anchors = 0;
1296
    }
1297
 
1298
  if (flag_short_enums == 2)
1299
    flag_short_enums = targetm.default_short_enums ();
1300
 
1301
  /* Set aux_base_name if not already set.  */
1302
  if (aux_base_name)
1303
    ;
1304
  else if (main_input_filename)
1305
    {
1306
      char *name = xstrdup (lbasename (main_input_filename));
1307
 
1308
      strip_off_ending (name, strlen (name));
1309
      aux_base_name = name;
1310
    }
1311
  else
1312
    aux_base_name = "gccaux";
1313
 
1314
#ifndef HAVE_cloog
1315
  if (flag_graphite
1316
      || flag_graphite_identity
1317
      || flag_loop_block
1318
      || flag_loop_flatten
1319
      || flag_loop_interchange
1320
      || flag_loop_strip_mine
1321
      || flag_loop_parallelize_all)
1322
    sorry ("Graphite loop optimizations cannot be used (-fgraphite, "
1323
           "-fgraphite-identity, -floop-block, -floop-flatten, "
1324
           "-floop-interchange, -floop-strip-mine, -floop-parallelize-all, "
1325
           "and -ftree-loop-linear)");
1326
#endif
1327
 
1328
  if (flag_mudflap && flag_lto)
1329
    sorry ("mudflap cannot be used together with link-time optimization");
1330
 
1331
  /* One region RA really helps to decrease the code size.  */
1332
  if (flag_ira_region == IRA_REGION_AUTODETECT)
1333
    flag_ira_region
1334
      = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED;
1335
 
1336
  if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2))
1337
    {
1338
      warning (0, "-fstrict-volatile-bitfields disabled; "
1339
               "it is incompatible with ABI versions < 2");
1340
      flag_strict_volatile_bitfields = 0;
1341
    }
1342
 
1343
  /* Unrolling all loops implies that standard loop unrolling must also
1344
     be done.  */
1345
  if (flag_unroll_all_loops)
1346
    flag_unroll_loops = 1;
1347
 
1348
  /* web and rename-registers help when run after loop unrolling.  */
1349
  if (flag_web == AUTODETECT_VALUE)
1350
    flag_web = flag_unroll_loops || flag_peel_loops;
1351
 
1352
  if (flag_rename_registers == AUTODETECT_VALUE)
1353
    flag_rename_registers = flag_unroll_loops || flag_peel_loops;
1354
 
1355
  if (flag_non_call_exceptions)
1356
    flag_asynchronous_unwind_tables = 1;
1357
  if (flag_asynchronous_unwind_tables)
1358
    flag_unwind_tables = 1;
1359
 
1360
  if (flag_value_profile_transformations)
1361
    flag_profile_values = 1;
1362
 
1363
  /* Warn about options that are not supported on this machine.  */
1364
#ifndef INSN_SCHEDULING
1365
  if (flag_schedule_insns || flag_schedule_insns_after_reload)
1366
    warning (0, "instruction scheduling not supported on this target machine");
1367
#endif
1368
#ifndef DELAY_SLOTS
1369
  if (flag_delayed_branch)
1370
    warning (0, "this target machine does not have delayed branches");
1371
#endif
1372
 
1373
  user_label_prefix = USER_LABEL_PREFIX;
1374
  if (flag_leading_underscore != -1)
1375
    {
1376
      /* If the default prefix is more complicated than "" or "_",
1377
         issue a warning and ignore this option.  */
1378
      if (user_label_prefix[0] == 0 ||
1379
          (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
1380
        {
1381
          user_label_prefix = flag_leading_underscore ? "_" : "";
1382
        }
1383
      else
1384
        warning (0, "-f%sleading-underscore not supported on this target machine",
1385
                 flag_leading_underscore ? "" : "no-");
1386
    }
1387
 
1388
  /* If we are in verbose mode, write out the version and maybe all the
1389
     option flags in use.  */
1390
  if (version_flag)
1391
    {
1392
      print_version (stderr, "");
1393
      if (! quiet_flag)
1394
        print_switch_values (print_to_stderr);
1395
    }
1396
 
1397
  if (flag_syntax_only)
1398
    {
1399
      write_symbols = NO_DEBUG;
1400
      profile_flag = 0;
1401
    }
1402
 
1403
  if (flag_gtoggle)
1404
    {
1405
      if (debug_info_level == DINFO_LEVEL_NONE)
1406
        {
1407
          debug_info_level = DINFO_LEVEL_NORMAL;
1408
 
1409
          if (write_symbols == NO_DEBUG)
1410
            write_symbols = PREFERRED_DEBUGGING_TYPE;
1411
        }
1412
      else
1413
        debug_info_level = DINFO_LEVEL_NONE;
1414
    }
1415
 
1416
  if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1417
    {
1418
      FILE *final_output = fopen (flag_dump_final_insns, "w");
1419
      if (!final_output)
1420
        {
1421
          error ("could not open final insn dump file %qs: %m",
1422
                 flag_dump_final_insns);
1423
          flag_dump_final_insns = NULL;
1424
        }
1425
      else if (fclose (final_output))
1426
        {
1427
          error ("could not close zeroed insn dump file %qs: %m",
1428
                 flag_dump_final_insns);
1429
          flag_dump_final_insns = NULL;
1430
        }
1431
    }
1432
 
1433
  /* Unless over-ridden for the target, assume that all DWARF levels
1434
     may be emitted, if DWARF2_DEBUG is selected.  */
1435
  if (dwarf_strict < 0)
1436
    dwarf_strict = 0;
1437
 
1438
  /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
1439
     level is 0.  */
1440
  if (debug_info_level == DINFO_LEVEL_NONE)
1441
    write_symbols = NO_DEBUG;
1442
 
1443
  if (write_symbols == NO_DEBUG)
1444
    ;
1445
#if defined(DBX_DEBUGGING_INFO)
1446
  else if (write_symbols == DBX_DEBUG)
1447
    debug_hooks = &dbx_debug_hooks;
1448
#endif
1449
#if defined(XCOFF_DEBUGGING_INFO)
1450
  else if (write_symbols == XCOFF_DEBUG)
1451
    debug_hooks = &xcoff_debug_hooks;
1452
#endif
1453
#ifdef SDB_DEBUGGING_INFO
1454
  else if (write_symbols == SDB_DEBUG)
1455
    debug_hooks = &sdb_debug_hooks;
1456
#endif
1457
#ifdef DWARF2_DEBUGGING_INFO
1458
  else if (write_symbols == DWARF2_DEBUG)
1459
    debug_hooks = &dwarf2_debug_hooks;
1460
#endif
1461
#ifdef VMS_DEBUGGING_INFO
1462
  else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1463
    debug_hooks = &vmsdbg_debug_hooks;
1464
#endif
1465
  else
1466
    error ("target system does not support the \"%s\" debug format",
1467
           debug_type_names[write_symbols]);
1468
 
1469
  /* We know which debug output will be used so we can set flag_var_tracking
1470
     and flag_var_tracking_uninit if the user has not specified them.  */
1471
  if (debug_info_level < DINFO_LEVEL_NORMAL
1472
      || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1473
    {
1474
      if (flag_var_tracking == 1
1475
          || flag_var_tracking_uninit == 1)
1476
        {
1477
          if (debug_info_level < DINFO_LEVEL_NORMAL)
1478
            warning (0, "variable tracking requested, but useless unless "
1479
                     "producing debug info");
1480
          else
1481
            warning (0, "variable tracking requested, but not supported "
1482
                     "by this debug format");
1483
        }
1484
      flag_var_tracking = 0;
1485
      flag_var_tracking_uninit = 0;
1486
    }
1487
 
1488
  /* The debug hooks are used to implement -fdump-go-spec because it
1489
     gives a simple and stable API for all the information we need to
1490
     dump.  */
1491
  if (flag_dump_go_spec != NULL)
1492
    debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks);
1493
 
1494
  /* If the user specifically requested variable tracking with tagging
1495
     uninitialized variables, we need to turn on variable tracking.
1496
     (We already determined above that variable tracking is feasible.)  */
1497
  if (flag_var_tracking_uninit)
1498
    flag_var_tracking = 1;
1499
 
1500
  if (flag_var_tracking == AUTODETECT_VALUE)
1501
    flag_var_tracking = optimize >= 1;
1502
 
1503
  if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1504
    flag_var_tracking_assignments = flag_var_tracking
1505
      && !(flag_selective_scheduling || flag_selective_scheduling2);
1506
 
1507
  if (flag_var_tracking_assignments_toggle)
1508
    flag_var_tracking_assignments = !flag_var_tracking_assignments;
1509
 
1510
  if (flag_var_tracking_assignments && !flag_var_tracking)
1511
    flag_var_tracking = flag_var_tracking_assignments = -1;
1512
 
1513
  if (flag_var_tracking_assignments
1514
      && (flag_selective_scheduling || flag_selective_scheduling2))
1515
    warning (0, "var-tracking-assignments changes selective scheduling");
1516
 
1517
  if (flag_tree_cselim == AUTODETECT_VALUE)
1518
#ifdef HAVE_conditional_move
1519
    flag_tree_cselim = 1;
1520
#else
1521
    flag_tree_cselim = 0;
1522
#endif
1523
 
1524
  /* If auxiliary info generation is desired, open the output file.
1525
     This goes in the same directory as the source file--unlike
1526
     all the other output files.  */
1527
  if (flag_gen_aux_info)
1528
    {
1529
      aux_info_file = fopen (aux_info_file_name, "w");
1530
      if (aux_info_file == 0)
1531
        fatal_error ("can%'t open %s: %m", aux_info_file_name);
1532
    }
1533
 
1534
  if (!targetm_common.have_named_sections)
1535
    {
1536
      if (flag_function_sections)
1537
        {
1538
          warning (0, "-ffunction-sections not supported for this target");
1539
          flag_function_sections = 0;
1540
        }
1541
      if (flag_data_sections)
1542
        {
1543
          warning (0, "-fdata-sections not supported for this target");
1544
          flag_data_sections = 0;
1545
        }
1546
    }
1547
 
1548
  if (flag_function_sections && profile_flag)
1549
    {
1550
      warning (0, "-ffunction-sections disabled; it makes profiling impossible");
1551
      flag_function_sections = 0;
1552
    }
1553
 
1554
#ifndef HAVE_prefetch
1555
  if (flag_prefetch_loop_arrays > 0)
1556
    {
1557
      warning (0, "-fprefetch-loop-arrays not supported for this target");
1558
      flag_prefetch_loop_arrays = 0;
1559
    }
1560
#else
1561
  if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
1562
    {
1563
      warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
1564
      flag_prefetch_loop_arrays = 0;
1565
    }
1566
#endif
1567
 
1568
  /* This combination of options isn't handled for i386 targets and doesn't
1569
     make much sense anyway, so don't allow it.  */
1570
  if (flag_prefetch_loop_arrays > 0 && optimize_size)
1571
    {
1572
      warning (0, "-fprefetch-loop-arrays is not supported with -Os");
1573
      flag_prefetch_loop_arrays = 0;
1574
    }
1575
 
1576
  /* The presence of IEEE signaling NaNs, implies all math can trap.  */
1577
  if (flag_signaling_nans)
1578
    flag_trapping_math = 1;
1579
 
1580
  /* We cannot reassociate if we want traps or signed zeros.  */
1581
  if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
1582
    {
1583
      warning (0, "-fassociative-math disabled; other options take precedence");
1584
      flag_associative_math = 0;
1585
    }
1586
 
1587
  /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
1588
  if (flag_cx_limited_range)
1589
    flag_complex_method = 0;
1590
 
1591
  /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
1592
  if (flag_cx_fortran_rules)
1593
    flag_complex_method = 1;
1594
 
1595
  /* Targets must be able to place spill slots at lower addresses.  If the
1596
     target already uses a soft frame pointer, the transition is trivial.  */
1597
  if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
1598
    {
1599
      warning (0, "-fstack-protector not supported for this target");
1600
      flag_stack_protect = 0;
1601
    }
1602
  if (!flag_stack_protect)
1603
    warn_stack_protect = 0;
1604
 
1605
  /* ??? Unwind info is not correct around the CFG unless either a frame
1606
     pointer is present or A_O_A is set.  Fixing this requires rewriting
1607
     unwind info generation to be aware of the CFG and propagating states
1608
     around edges.  */
1609
  if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
1610
      && flag_omit_frame_pointer)
1611
    {
1612
      warning (0, "unwind tables currently require a frame pointer "
1613
               "for correctness");
1614
      flag_omit_frame_pointer = 0;
1615
    }
1616
 
1617
  /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error
1618
     have not been set.  */
1619
  if (!global_options_set.x_warnings_are_errors
1620
      && warn_coverage_mismatch
1621
      && (global_dc->classify_diagnostic[OPT_Wcoverage_mismatch] ==
1622
          DK_UNSPECIFIED))
1623
    diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_mismatch,
1624
                                    DK_ERROR, UNKNOWN_LOCATION);
1625
 
1626
  /* Save the current optimization options.  */
1627
  optimization_default_node = build_optimization_node ();
1628
  optimization_current_node = optimization_default_node;
1629
}
1630
 
1631
/* This function can be called multiple times to reinitialize the compiler
1632
   back end when register classes or instruction sets have changed,
1633
   before each function.  */
1634
static void
1635
backend_init_target (void)
1636
{
1637
  /* Initialize alignment variables.  */
1638
  init_alignments ();
1639
 
1640
  /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
1641
     to initialize reg_raw_mode[].  */
1642
  init_emit_regs ();
1643
 
1644
  /* This invokes target hooks to set fixed_reg[] etc, which is
1645
     mode-dependent.  */
1646
  init_regs ();
1647
 
1648
  /* This depends on stack_pointer_rtx.  */
1649
  init_fake_stack_mems ();
1650
 
1651
  /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
1652
     mode-dependent.  */
1653
  init_alias_target ();
1654
 
1655
  /* Depends on HARD_FRAME_POINTER_REGNUM.  */
1656
  init_reload ();
1657
 
1658
  /* The following initialization functions need to generate rtl, so
1659
     provide a dummy function context for them.  */
1660
  init_dummy_function_start ();
1661
 
1662
  /* rtx_cost is mode-dependent, so cached values need to be recomputed
1663
     on a mode change.  */
1664
  init_expmed ();
1665
 
1666
  /* We may need to recompute regno_save_code[] and regno_restore_code[]
1667
     after a mode change as well.  */
1668
  caller_save_initialized_p = false;
1669
 
1670
  expand_dummy_function_end ();
1671
}
1672
 
1673
/* Initialize the compiler back end.  This function is called only once,
1674
   when starting the compiler.  */
1675
static void
1676
backend_init (void)
1677
{
1678
  init_emit_once ();
1679
 
1680
  init_rtlanal ();
1681
  init_inline_once ();
1682
  init_varasm_once ();
1683
  save_register_info ();
1684
 
1685
  /* Initialize the target-specific back end pieces.  */
1686
  ira_init_once ();
1687
  backend_init_target ();
1688
}
1689
 
1690
/* Initialize excess precision settings.  */
1691
static void
1692
init_excess_precision (void)
1693
{
1694
  /* Adjust excess precision handling based on the target options.  If
1695
     the front end cannot handle it, flag_excess_precision_cmdline
1696
     will already have been set accordingly in the post_options
1697
     hook.  */
1698
  gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT);
1699
  flag_excess_precision = flag_excess_precision_cmdline;
1700
  if (flag_unsafe_math_optimizations)
1701
    flag_excess_precision = EXCESS_PRECISION_FAST;
1702
  if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
1703
    {
1704
      int flt_eval_method = TARGET_FLT_EVAL_METHOD;
1705
      switch (flt_eval_method)
1706
        {
1707
        case -1:
1708
        case 0:
1709
          /* Either the target acts unpredictably (-1) or has all the
1710
             operations required not to have excess precision (0).  */
1711
          flag_excess_precision = EXCESS_PRECISION_FAST;
1712
          break;
1713
        case 1:
1714
        case 2:
1715
          /* In these cases, predictable excess precision makes
1716
             sense.  */
1717
          break;
1718
        default:
1719
          /* Any other implementation-defined FLT_EVAL_METHOD values
1720
             require the compiler to handle the associated excess
1721
             precision rules in excess_precision_type.  */
1722
          gcc_unreachable ();
1723
        }
1724
    }
1725
}
1726
 
1727
/* Initialize things that are both lang-dependent and target-dependent.
1728
   This function can be called more than once if target parameters change.  */
1729
static void
1730
lang_dependent_init_target (void)
1731
{
1732
  /* This determines excess precision settings.  */
1733
  init_excess_precision ();
1734
 
1735
  /* This creates various _DECL nodes, so needs to be called after the
1736
     front end is initialized.  It also depends on the HAVE_xxx macros
1737
     generated from the target machine description.  */
1738
  init_optabs ();
1739
 
1740
  /* The following initialization functions need to generate rtl, so
1741
     provide a dummy function context for them.  */
1742
  init_dummy_function_start ();
1743
 
1744
  /* Do the target-specific parts of expr initialization.  */
1745
  init_expr_target ();
1746
 
1747
  /* Although the actions of these functions are language-independent,
1748
     they use optabs, so we cannot call them from backend_init.  */
1749
  init_set_costs ();
1750
  ira_init ();
1751
 
1752
  expand_dummy_function_end ();
1753
}
1754
 
1755
/* Language-dependent initialization.  Returns nonzero on success.  */
1756
static int
1757
lang_dependent_init (const char *name)
1758
{
1759
  location_t save_loc = input_location;
1760
  if (dump_base_name == 0)
1761
    dump_base_name = name && name[0] ? name : "gccdump";
1762
 
1763
  /* Other front-end initialization.  */
1764
  input_location = BUILTINS_LOCATION;
1765
  if (lang_hooks.init () == 0)
1766
    return 0;
1767
  input_location = save_loc;
1768
 
1769
  if (!flag_wpa)
1770
    {
1771
      init_asm_output (name);
1772
 
1773
      /* If stack usage information is desired, open the output file.  */
1774
      if (flag_stack_usage)
1775
        stack_usage_file = open_auxiliary_file ("su");
1776
    }
1777
 
1778
  /* This creates various _DECL nodes, so needs to be called after the
1779
     front end is initialized.  */
1780
  init_eh ();
1781
 
1782
  /* Do the target-specific parts of the initialization.  */
1783
  lang_dependent_init_target ();
1784
 
1785
  if (!flag_wpa)
1786
    {
1787
      /* If dbx symbol table desired, initialize writing it and output the
1788
         predefined types.  */
1789
      timevar_push (TV_SYMOUT);
1790
 
1791
      /* Now we have the correct original filename, we can initialize
1792
         debug output.  */
1793
      (*debug_hooks->init) (name);
1794
 
1795
      timevar_pop (TV_SYMOUT);
1796
    }
1797
 
1798
  return 1;
1799
}
1800
 
1801
 
1802
/* Reinitialize everything when target parameters, such as register usage,
1803
   have changed.  */
1804
void
1805
target_reinit (void)
1806
{
1807
  struct rtl_data saved_x_rtl;
1808
  rtx *saved_regno_reg_rtx;
1809
 
1810
  /* Save *crtl and regno_reg_rtx around the reinitialization
1811
     to allow target_reinit being called even after prepare_function_start.  */
1812
  saved_regno_reg_rtx = regno_reg_rtx;
1813
  if (saved_regno_reg_rtx)
1814
    {
1815
      saved_x_rtl = *crtl;
1816
      memset (crtl, '\0', sizeof (*crtl));
1817
      regno_reg_rtx = NULL;
1818
    }
1819
 
1820
  /* Reinitialize RTL backend.  */
1821
  backend_init_target ();
1822
 
1823
  /* Reinitialize lang-dependent parts.  */
1824
  lang_dependent_init_target ();
1825
 
1826
  /* And restore it at the end, as free_after_compilation from
1827
     expand_dummy_function_end clears it.  */
1828
  if (saved_regno_reg_rtx)
1829
    {
1830
      *crtl = saved_x_rtl;
1831
      regno_reg_rtx = saved_regno_reg_rtx;
1832
      saved_regno_reg_rtx = NULL;
1833
    }
1834
}
1835
 
1836
void
1837
dump_memory_report (bool final)
1838
{
1839
  dump_line_table_statistics ();
1840
  ggc_print_statistics ();
1841
  stringpool_statistics ();
1842
  dump_tree_statistics ();
1843
  dump_gimple_statistics ();
1844
  dump_rtx_statistics ();
1845
  dump_alloc_pool_statistics ();
1846
  dump_bitmap_statistics ();
1847
  dump_vec_loc_statistics ();
1848
  dump_ggc_loc_statistics (final);
1849
  dump_alias_stats (stderr);
1850
  dump_pta_stats (stderr);
1851
}
1852
 
1853
/* Clean up: close opened files, etc.  */
1854
 
1855
static void
1856
finalize (bool no_backend)
1857
{
1858
  /* Close the dump files.  */
1859
  if (flag_gen_aux_info)
1860
    {
1861
      fclose (aux_info_file);
1862
      if (seen_error ())
1863
        unlink (aux_info_file_name);
1864
    }
1865
 
1866
  /* Close non-debugging input and output files.  Take special care to note
1867
     whether fclose returns an error, since the pages might still be on the
1868
     buffer chain while the file is open.  */
1869
 
1870
  if (asm_out_file)
1871
    {
1872
      if (ferror (asm_out_file) != 0)
1873
        fatal_error ("error writing to %s: %m", asm_file_name);
1874
      if (fclose (asm_out_file) != 0)
1875
        fatal_error ("error closing %s: %m", asm_file_name);
1876
    }
1877
 
1878
  if (stack_usage_file)
1879
    fclose (stack_usage_file);
1880
 
1881
  if (!no_backend)
1882
    {
1883
      statistics_fini ();
1884
 
1885
      finish_optimization_passes ();
1886
 
1887
      ira_finish_once ();
1888
    }
1889
 
1890
  if (mem_report)
1891
    dump_memory_report (true);
1892
 
1893
  /* Language-specific end of compilation actions.  */
1894
  lang_hooks.finish ();
1895
}
1896
 
1897
/* Initialize the compiler, and compile the input file.  */
1898
static void
1899
do_compile (void)
1900
{
1901
  /* Initialize timing first.  The C front ends read the main file in
1902
     the post_options hook, and C++ does file timings.  */
1903
  if (time_report || !quiet_flag  || flag_detailed_statistics)
1904
    timevar_init ();
1905
  timevar_start (TV_TOTAL);
1906
 
1907
  process_options ();
1908
 
1909
  /* Don't do any more if an error has already occurred.  */
1910
  if (!seen_error ())
1911
    {
1912
      timevar_start (TV_PHASE_SETUP);
1913
 
1914
      /* This must be run always, because it is needed to compute the FP
1915
         predefined macros, such as __LDBL_MAX__, for targets using non
1916
         default FP formats.  */
1917
      init_adjust_machine_modes ();
1918
 
1919
      /* Set up the back-end if requested.  */
1920
      if (!no_backend)
1921
        backend_init ();
1922
 
1923
      /* Language-dependent initialization.  Returns true on success.  */
1924
      if (lang_dependent_init (main_input_filename))
1925
        {
1926
          /* Initialize yet another pass.  */
1927
 
1928
          ggc_protect_identifiers = true;
1929
 
1930
          init_cgraph ();
1931
          init_final (main_input_filename);
1932
          coverage_init (aux_base_name);
1933
          statistics_init ();
1934
          invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
1935
 
1936
          timevar_stop (TV_PHASE_SETUP);
1937
 
1938
          compile_file ();
1939
        }
1940
      else
1941
        {
1942
          timevar_stop (TV_PHASE_SETUP);
1943
        }
1944
 
1945
      timevar_start (TV_PHASE_FINALIZE);
1946
 
1947
      finalize (no_backend);
1948
 
1949
      timevar_stop (TV_PHASE_FINALIZE);
1950
    }
1951
 
1952
  /* Stop timing and print the times.  */
1953
  timevar_stop (TV_TOTAL);
1954
  timevar_print (stderr);
1955
}
1956
 
1957
/* Entry point of cc1, cc1plus, jc1, f771, etc.
1958
   Exit code is FATAL_EXIT_CODE if can't open files or if there were
1959
   any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
1960
 
1961
   It is not safe to call this function more than once.  */
1962
 
1963
int
1964
toplev_main (int argc, char **argv)
1965
{
1966
  /* Parsing and gimplification sometimes need quite large stack.
1967
     Increase stack size limits if possible.  */
1968
  stack_limit_increase (64 * 1024 * 1024);
1969
 
1970
  expandargv (&argc, &argv);
1971
 
1972
  /* Initialization of GCC's environment, and diagnostics.  */
1973
  general_init (argv[0]);
1974
 
1975
  /* One-off initialization of options that does not need to be
1976
     repeated when options are added for particular functions.  */
1977
  init_options_once ();
1978
 
1979
  /* Initialize global options structures; this must be repeated for
1980
     each structure used for parsing options.  */
1981
  init_options_struct (&global_options, &global_options_set);
1982
  lang_hooks.init_options_struct (&global_options);
1983
 
1984
  /* Convert the options to an array.  */
1985
  decode_cmdline_options_to_array_default_mask (argc,
1986
                                                CONST_CAST2 (const char **,
1987
                                                             char **, argv),
1988
                                                &save_decoded_options,
1989
                                                &save_decoded_options_count);
1990
 
1991
  /* Perform language-specific options initialization.  */
1992
  lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
1993
 
1994
  /* Parse the options and do minimal processing; basically just
1995
     enough to default flags appropriately.  */
1996
  decode_options (&global_options, &global_options_set,
1997
                  save_decoded_options, save_decoded_options_count,
1998
                  UNKNOWN_LOCATION, global_dc);
1999
 
2000
  handle_common_deferred_options ();
2001
 
2002
  init_local_tick ();
2003
 
2004
  initialize_plugins ();
2005
 
2006
  if (version_flag)
2007
    print_version (stderr, "");
2008
 
2009
  if (help_flag)
2010
    print_plugins_help (stderr, "");
2011
 
2012
  /* Exit early if we can (e.g. -help).  */
2013
  if (!exit_after_options)
2014
    do_compile ();
2015
 
2016
  if (warningcount || errorcount)
2017
    print_ignored_options ();
2018
  diagnostic_finish (global_dc);
2019
 
2020
  /* Invoke registered plugin callbacks if any.  */
2021
  invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
2022
 
2023
  finalize_plugins ();
2024
  if (seen_error ())
2025
    return (FATAL_EXIT_CODE);
2026
 
2027
  return (SUCCESS_EXIT_CODE);
2028
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.