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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [varasm.c] - Blame information for rev 17

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

Line No. Rev Author Line
1 12 jlechner
/* Output variables, constants and external declarations, for GNU compiler.
2
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3
   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4
   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 2, 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 COPYING.  If not, write to the Free
20
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21
02110-1301, USA.  */
22
 
23
 
24
/* This file handles generation of all the assembler code
25
   *except* the instructions of a function.
26
   This includes declarations of variables and their initial values.
27
 
28
   We also output the assembler code for constants stored in memory
29
   and are responsible for combining constants with the same value.  */
30
 
31
#include "config.h"
32
#include "system.h"
33
#include "coretypes.h"
34
#include "tm.h"
35
#include "rtl.h"
36
#include "tree.h"
37
#include "flags.h"
38
#include "function.h"
39
#include "expr.h"
40
#include "hard-reg-set.h"
41
#include "regs.h"
42
#include "real.h"
43
#include "output.h"
44
#include "toplev.h"
45
#include "hashtab.h"
46
#include "c-pragma.h"
47
#include "ggc.h"
48
#include "langhooks.h"
49
#include "tm_p.h"
50
#include "debug.h"
51
#include "target.h"
52
#include "tree-mudflap.h"
53
#include "cgraph.h"
54
#include "cfglayout.h"
55
#include "basic-block.h"
56
 
57
#ifdef XCOFF_DEBUGGING_INFO
58
#include "xcoffout.h"           /* Needed for external data
59
                                   declarations for e.g. AIX 4.x.  */
60
#endif
61
 
62
/* The (assembler) name of the first globally-visible object output.  */
63
extern GTY(()) const char *first_global_object_name;
64
extern GTY(()) const char *weak_global_object_name;
65
 
66
const char *first_global_object_name;
67
const char *weak_global_object_name;
68
 
69
struct addr_const;
70
struct constant_descriptor_rtx;
71
struct rtx_constant_pool;
72
 
73
struct varasm_status GTY(())
74
{
75
  /* If we're using a per-function constant pool, this is it.  */
76
  struct rtx_constant_pool *pool;
77
 
78
  /* Number of tree-constants deferred during the expansion of this
79
     function.  */
80
  unsigned int deferred_constants;
81
};
82
 
83
#define n_deferred_constants (cfun->varasm->deferred_constants)
84
 
85
/* Number for making the label on the next
86
   constant that is stored in memory.  */
87
 
88
static GTY(()) int const_labelno;
89
 
90
/* Carry information from ASM_DECLARE_OBJECT_NAME
91
   to ASM_FINISH_DECLARE_OBJECT.  */
92
 
93
int size_directive_output;
94
 
95
/* The last decl for which assemble_variable was called,
96
   if it did ASM_DECLARE_OBJECT_NAME.
97
   If the last call to assemble_variable didn't do that,
98
   this holds 0.  */
99
 
100
tree last_assemble_variable_decl;
101
 
102
/* The following global variable indicates if the first basic block
103
   in a function belongs to the cold partition or not.  */
104
 
105
bool first_function_block_is_cold;
106
 
107
/* We give all constants their own alias set.  Perhaps redundant with
108
   MEM_READONLY_P, but pre-dates it.  */
109
 
110
static HOST_WIDE_INT const_alias_set;
111
 
112
static const char *strip_reg_name (const char *);
113
static int contains_pointers_p (tree);
114
#ifdef ASM_OUTPUT_EXTERNAL
115
static bool incorporeal_function_p (tree);
116
#endif
117
static void decode_addr_const (tree, struct addr_const *);
118
static hashval_t const_desc_hash (const void *);
119
static int const_desc_eq (const void *, const void *);
120
static hashval_t const_hash_1 (const tree);
121
static int compare_constant (const tree, const tree);
122
static tree copy_constant (tree);
123
static void output_constant_def_contents (rtx);
124
static void output_addressed_constants (tree);
125
static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
126
static unsigned min_align (unsigned, unsigned);
127
static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int);
128
static void globalize_decl (tree);
129
static void maybe_assemble_visibility (tree);
130
static int in_named_entry_eq (const void *, const void *);
131
static hashval_t in_named_entry_hash (const void *);
132
static void initialize_cold_section_name (void);
133
#ifdef BSS_SECTION_ASM_OP
134
#ifdef ASM_OUTPUT_BSS
135
static void asm_output_bss (FILE *, tree, const char *,
136
                            unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
137
#endif
138
#ifdef ASM_OUTPUT_ALIGNED_BSS
139
static void asm_output_aligned_bss (FILE *, tree, const char *,
140
                                    unsigned HOST_WIDE_INT, int)
141
     ATTRIBUTE_UNUSED;
142
#endif
143
#endif /* BSS_SECTION_ASM_OP */
144
static bool asm_emit_uninitialised (tree, const char*,
145
                                    unsigned HOST_WIDE_INT,
146
                                    unsigned HOST_WIDE_INT);
147
static void mark_weak (tree);
148
 
149
static GTY(()) enum in_section in_section = no_section;
150
enum in_section last_text_section;
151
 
152
/* Return a nonzero value if DECL has a section attribute.  */
153
#ifndef IN_NAMED_SECTION
154
#define IN_NAMED_SECTION(DECL) \
155
  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
156
   && DECL_SECTION_NAME (DECL) != NULL_TREE)
157
#endif
158
 
159
/* Text of section name when in_section == in_named.  */
160
static GTY(()) const char *in_named_name;
161
const char *last_text_section_name;
162
 
163
/* Hash table of flags that have been used for a particular named section.  */
164
 
165
struct in_named_entry GTY(())
166
{
167
  const char *name;
168
  unsigned int flags;
169
  bool declared;
170
};
171
 
172
static GTY((param_is (struct in_named_entry))) htab_t in_named_htab;
173
 
174
/* Define functions like text_section for any extra sections.  */
175
#ifdef EXTRA_SECTION_FUNCTIONS
176
EXTRA_SECTION_FUNCTIONS
177
#endif
178
 
179
static void
180
initialize_cold_section_name (void)
181
{
182
  const char *stripped_name;
183
  char *name, *buffer;
184
  tree dsn;
185
 
186
  gcc_assert (cfun && current_function_decl);
187
  if (cfun->unlikely_text_section_name)
188
    return;
189
 
190
  dsn = DECL_SECTION_NAME (current_function_decl);
191
  if (flag_function_sections && dsn)
192
    {
193
      name = alloca (TREE_STRING_LENGTH (dsn) + 1);
194
      memcpy (name, TREE_STRING_POINTER (dsn), TREE_STRING_LENGTH (dsn) + 1);
195
 
196
      stripped_name = targetm.strip_name_encoding (name);
197
 
198
      buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
199
      cfun->unlikely_text_section_name = ggc_strdup (buffer);
200
    }
201
  else
202
    cfun->unlikely_text_section_name =  UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
203
}
204
 
205
/* Tell assembler to switch to text section.  */
206
 
207
void
208
text_section (void)
209
{
210
  if (in_section != in_text)
211
    {
212
      in_section = in_text;
213
      last_text_section = in_text;
214
      fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
215
    }
216
}
217
 
218
/* Tell assembler to switch to unlikely-to-be-executed text section.  */
219
 
220
void
221
unlikely_text_section (void)
222
{
223
  if (cfun)
224
    {
225
      if (!cfun->unlikely_text_section_name)
226
        initialize_cold_section_name ();
227
 
228
      if (flag_function_sections
229
          || ((in_section != in_unlikely_executed_text)
230
              &&  (in_section != in_named
231
                   || (strcmp (in_named_name, cfun->unlikely_text_section_name)
232
                       != 0))))
233
        {
234
          named_section (NULL_TREE, cfun->unlikely_text_section_name, 0);
235
          in_section = in_unlikely_executed_text;
236
          last_text_section = in_unlikely_executed_text;
237
        }
238
    }
239
  else
240
    {
241
      named_section (NULL_TREE, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
242
      in_section = in_unlikely_executed_text;
243
      last_text_section = in_unlikely_executed_text;
244
    }
245
}
246
 
247
/* Tell assembler to switch to data section.  */
248
 
249
void
250
data_section (void)
251
{
252
  if (in_section != in_data)
253
    {
254
      in_section = in_data;
255
      fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
256
    }
257
}
258
 
259
/* Tell assembler to switch to read-only data section.  This is normally
260
   the text section.  */
261
 
262
void
263
readonly_data_section (void)
264
{
265
#ifdef READONLY_DATA_SECTION
266
  READONLY_DATA_SECTION ();  /* Note this can call data_section.  */
267
#else
268
#ifdef READONLY_DATA_SECTION_ASM_OP
269
  if (in_section != in_readonly_data)
270
    {
271
      in_section = in_readonly_data;
272
      fputs (READONLY_DATA_SECTION_ASM_OP, asm_out_file);
273
      fputc ('\n', asm_out_file);
274
    }
275
#else
276
  text_section ();
277
#endif
278
#endif
279
}
280
 
281
/* Determine if we're in the text section.  */
282
 
283
int
284
in_text_section (void)
285
{
286
  return in_section == in_text;
287
}
288
 
289
/* Determine if we're in the unlikely-to-be-executed text section.  */
290
 
291
int
292
in_unlikely_text_section (void)
293
{
294
  bool ret_val;
295
 
296
  if (cfun)
297
    {
298
      ret_val = ((in_section == in_unlikely_executed_text)
299
                 || (in_section == in_named
300
                     && cfun->unlikely_text_section_name
301
                     && strcmp (in_named_name,
302
                                cfun->unlikely_text_section_name) == 0));
303
    }
304
  else
305
    {
306
      ret_val = ((in_section == in_unlikely_executed_text)
307
                 || (in_section == in_named
308
                     && strcmp (in_named_name,
309
                                UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0));
310
    }
311
 
312
  return ret_val;
313
}
314
 
315
/* Determine if we're in the data section.  */
316
 
317
int
318
in_data_section (void)
319
{
320
  return in_section == in_data;
321
}
322
 
323
/* Helper routines for maintaining in_named_htab.  */
324
 
325
static int
326
in_named_entry_eq (const void *p1, const void *p2)
327
{
328
  const struct in_named_entry *old = p1;
329
  const char *new = p2;
330
 
331
  return strcmp (old->name, new) == 0;
332
}
333
 
334
static hashval_t
335
in_named_entry_hash (const void *p)
336
{
337
  const struct in_named_entry *old = p;
338
  return htab_hash_string (old->name);
339
}
340
 
341
/* If SECTION has been seen before as a named section, return the flags
342
   that were used.  Otherwise, return 0.  Note, that 0 is a perfectly valid
343
   set of flags for a section to have, so 0 does not mean that the section
344
   has not been seen.  */
345
 
346
static unsigned int
347
get_named_section_flags (const char *section)
348
{
349
  struct in_named_entry **slot;
350
 
351
  slot = (struct in_named_entry **)
352
    htab_find_slot_with_hash (in_named_htab, section,
353
                              htab_hash_string (section), NO_INSERT);
354
 
355
  return slot ? (*slot)->flags : 0;
356
}
357
 
358
/* Returns true if the section has been declared before.   Sets internal
359
   flag on this section in in_named_hash so subsequent calls on this
360
   section will return false.  */
361
 
362
bool
363
named_section_first_declaration (const char *name)
364
{
365
  struct in_named_entry **slot;
366
 
367
  slot = (struct in_named_entry **)
368
    htab_find_slot_with_hash (in_named_htab, name,
369
                              htab_hash_string (name), NO_INSERT);
370
  if (! (*slot)->declared)
371
    {
372
      (*slot)->declared = true;
373
      return true;
374
    }
375
  else
376
    {
377
      return false;
378
    }
379
}
380
 
381
 
382
/* Record FLAGS for SECTION.  If SECTION was previously recorded with a
383
   different set of flags, return false.  */
384
 
385
bool
386
set_named_section_flags (const char *section, unsigned int flags)
387
{
388
  struct in_named_entry **slot, *entry;
389
 
390
  slot = (struct in_named_entry **)
391
    htab_find_slot_with_hash (in_named_htab, section,
392
                              htab_hash_string (section), INSERT);
393
  entry = *slot;
394
 
395
  if (!entry)
396
    {
397
      entry = ggc_alloc (sizeof (*entry));
398
      *slot = entry;
399
      entry->name = ggc_strdup (section);
400
      entry->flags = flags;
401
      entry->declared = false;
402
    }
403
  else if (entry->flags != flags)
404
    return false;
405
 
406
  return true;
407
}
408
 
409
/* Tell assembler to change to section NAME with attributes FLAGS.  If
410
   DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with which
411
   this section is associated.  */
412
 
413
void
414
named_section_real (const char *name, unsigned int flags, tree decl)
415
{
416
  if (in_section != in_named || strcmp (name, in_named_name) != 0)
417
    {
418
      bool unchanged = set_named_section_flags (name, flags);
419
 
420
      gcc_assert (unchanged);
421
 
422
      targetm.asm_out.named_section (name, flags, decl);
423
 
424
      if (flags & SECTION_FORGET)
425
        in_section = no_section;
426
      else
427
        {
428
          in_named_name = ggc_strdup (name);
429
          in_section = in_named;
430
        }
431
    }
432
 
433
  if (in_text_section () || in_unlikely_text_section ())
434
    {
435
      last_text_section = in_section;
436
      last_text_section_name = name;
437
    }
438
}
439
 
440
/* Tell assembler to change to section NAME for DECL.
441
   If DECL is NULL, just switch to section NAME.
442
   If NAME is NULL, get the name from DECL.
443
   If RELOC is 1, the initializer for DECL contains relocs.  */
444
 
445
void
446
named_section (tree decl, const char *name, int reloc)
447
{
448
  unsigned int flags;
449
 
450
  gcc_assert (!decl || DECL_P (decl));
451
  if (name == NULL)
452
    name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
453
 
454
  if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0
455
      && cfun
456
      && ! cfun->unlikely_text_section_name)
457
    cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
458
 
459
  flags = targetm.section_type_flags (decl, name, reloc);
460
 
461
  /* Sanity check user variables for flag changes.  Non-user
462
     section flag changes will die in named_section_flags.
463
     However, don't complain if SECTION_OVERRIDE is set.
464
     We trust that the setter knows that it is safe to ignore
465
     the default flags for this decl.  */
466
  if (decl && ! set_named_section_flags (name, flags))
467
    {
468
      flags = get_named_section_flags (name);
469
      if ((flags & SECTION_OVERRIDE) == 0)
470
        error ("%+D causes a section type conflict", decl);
471
    }
472
 
473
  named_section_real (name, flags, decl);
474
}
475
 
476
/* If required, set DECL_SECTION_NAME to a unique name.  */
477
 
478
void
479
resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
480
                        int flag_function_or_data_sections)
481
{
482
  if (DECL_SECTION_NAME (decl) == NULL_TREE
483
      && targetm.have_named_sections
484
      && (flag_function_or_data_sections
485
          || DECL_ONE_ONLY (decl)))
486
    targetm.asm_out.unique_section (decl, reloc);
487
}
488
 
489
#ifdef BSS_SECTION_ASM_OP
490
 
491
/* Tell the assembler to switch to the bss section.  */
492
 
493
void
494
bss_section (void)
495
{
496
  if (in_section != in_bss)
497
    {
498
      fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
499
      in_section = in_bss;
500
    }
501
}
502
 
503
#ifdef ASM_OUTPUT_BSS
504
 
505
/* Utility function for ASM_OUTPUT_BSS for targets to use if
506
   they don't support alignments in .bss.
507
   ??? It is believed that this function will work in most cases so such
508
   support is localized here.  */
509
 
510
static void
511
asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
512
                const char *name,
513
                unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
514
                unsigned HOST_WIDE_INT rounded)
515
{
516
  targetm.asm_out.globalize_label (file, name);
517
  bss_section ();
518
#ifdef ASM_DECLARE_OBJECT_NAME
519
  last_assemble_variable_decl = decl;
520
  ASM_DECLARE_OBJECT_NAME (file, name, decl);
521
#else
522
  /* Standard thing is just output label for the object.  */
523
  ASM_OUTPUT_LABEL (file, name);
524
#endif /* ASM_DECLARE_OBJECT_NAME */
525
  ASM_OUTPUT_SKIP (file, rounded ? rounded : 1);
526
}
527
 
528
#endif
529
 
530
#ifdef ASM_OUTPUT_ALIGNED_BSS
531
 
532
/* Utility function for targets to use in implementing
533
   ASM_OUTPUT_ALIGNED_BSS.
534
   ??? It is believed that this function will work in most cases so such
535
   support is localized here.  */
536
 
537
static void
538
asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
539
                        const char *name, unsigned HOST_WIDE_INT size,
540
                        int align)
541
{
542
  bss_section ();
543
  ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
544
#ifdef ASM_DECLARE_OBJECT_NAME
545
  last_assemble_variable_decl = decl;
546
  ASM_DECLARE_OBJECT_NAME (file, name, decl);
547
#else
548
  /* Standard thing is just output label for the object.  */
549
  ASM_OUTPUT_LABEL (file, name);
550
#endif /* ASM_DECLARE_OBJECT_NAME */
551
  ASM_OUTPUT_SKIP (file, size ? size : 1);
552
}
553
 
554
#endif
555
 
556
#endif /* BSS_SECTION_ASM_OP */
557
 
558
/* Switch to the section for function DECL.
559
 
560
   If DECL is NULL_TREE, switch to the text section.  We can be passed
561
   NULL_TREE under some circumstances by dbxout.c at least.  */
562
 
563
void
564
function_section (tree decl)
565
{
566
  int reloc = 0;
567
 
568
  if (first_function_block_is_cold)
569
    reloc = 1;
570
 
571
#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
572
  targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
573
#else
574
  if (decl != NULL_TREE
575
      && DECL_SECTION_NAME (decl) != NULL_TREE
576
      && targetm.have_named_sections)
577
    named_section (decl, (char *) 0, 0);
578
  else
579
    text_section ();
580
#endif
581
}
582
 
583
void
584
current_function_section (tree decl)
585
{
586
#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
587
  int reloc = 0;
588
 
589
  if (in_unlikely_text_section ()
590
      || last_text_section == in_unlikely_executed_text)
591
    reloc = 1;
592
 
593
  targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
594
#else
595
  if (last_text_section == in_unlikely_executed_text)
596
    unlikely_text_section ();
597
  else if (last_text_section == in_text)
598
    text_section ();
599
  else if (last_text_section == in_named
600
           && targetm.have_named_sections)
601
    named_section (NULL_TREE, last_text_section_name, 0);
602
  else
603
    function_section (decl);
604
#endif
605
}
606
 
607
/* Switch to read-only data section associated with function DECL.  */
608
 
609
void
610
default_function_rodata_section (tree decl)
611
{
612
  if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
613
    {
614
      const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
615
 
616
      if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP)
617
        {
618
          size_t len = strlen (name) + 3;
619
          char* rname = alloca (len);
620
 
621
          strcpy (rname, ".rodata");
622
          strcat (rname, name + 5);
623
          named_section_real (rname, SECTION_LINKONCE, decl);
624
          return;
625
        }
626
      /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo.  */
627
      else if (DECL_ONE_ONLY (decl)
628
               && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
629
        {
630
          size_t len = strlen (name) + 1;
631
          char *rname = alloca (len);
632
 
633
          memcpy (rname, name, len);
634
          rname[14] = 'r';
635
          named_section_real (rname, SECTION_LINKONCE, decl);
636
          return;
637
        }
638
      /* For .text.foo we want to use .rodata.foo.  */
639
      else if (flag_function_sections && flag_data_sections
640
               && strncmp (name, ".text.", 6) == 0)
641
        {
642
          size_t len = strlen (name) + 1;
643
          char *rname = alloca (len + 2);
644
 
645
          memcpy (rname, ".rodata", 7);
646
          memcpy (rname + 7, name + 5, len - 5);
647
          named_section_flags (rname, 0);
648
          return;
649
        }
650
    }
651
 
652
  readonly_data_section ();
653
}
654
 
655
/* Switch to read-only data section associated with function DECL
656
   for targets where that section should be always the single
657
   readonly data section.  */
658
 
659
void
660
default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
661
{
662
  readonly_data_section ();
663
}
664
 
665
/* Switch to section for variable DECL.  RELOC is the same as the
666
   argument to SELECT_SECTION.  */
667
 
668
void
669
variable_section (tree decl, int reloc)
670
{
671
  if (IN_NAMED_SECTION (decl))
672
    named_section (decl, NULL, reloc);
673
  else
674
    targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
675
}
676
 
677
/* Tell assembler to switch to the section for string merging.  */
678
 
679
void
680
mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
681
                          unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
682
                          unsigned int flags ATTRIBUTE_UNUSED)
683
{
684
  if (HAVE_GAS_SHF_MERGE && flag_merge_constants
685
      && TREE_CODE (decl) == STRING_CST
686
      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
687
      && align <= 256
688
      && TREE_STRING_LENGTH (decl) >= int_size_in_bytes (TREE_TYPE (decl)))
689
    {
690
      enum machine_mode mode;
691
      unsigned int modesize;
692
      const char *str;
693
      int i, j, len, unit;
694
      char name[30];
695
 
696
      mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
697
      modesize = GET_MODE_BITSIZE (mode);
698
      if (modesize >= 8 && modesize <= 256
699
          && (modesize & (modesize - 1)) == 0)
700
        {
701
          if (align < modesize)
702
            align = modesize;
703
 
704
          str = TREE_STRING_POINTER (decl);
705
          len = TREE_STRING_LENGTH (decl);
706
          unit = GET_MODE_SIZE (mode);
707
 
708
          /* Check for embedded NUL characters.  */
709
          for (i = 0; i < len; i += unit)
710
            {
711
              for (j = 0; j < unit; j++)
712
                if (str[i + j] != '\0')
713
                  break;
714
              if (j == unit)
715
                break;
716
            }
717
          if (i == len - unit)
718
            {
719
              sprintf (name, ".rodata.str%d.%d", modesize / 8,
720
                       (int) (align / 8));
721
              flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
722
              if (!i && modesize < align)
723
                {
724
                  /* A "" string with requested alignment greater than
725
                     character size might cause a problem:
726
                     if some other string required even bigger
727
                     alignment than "", then linker might think the
728
                     "" is just part of padding after some other string
729
                     and not put it into the hash table initially.
730
                     But this means "" could have smaller alignment
731
                     than requested.  */
732
#ifdef ASM_OUTPUT_SECTION_START
733
                  named_section_flags (name, flags);
734
                  ASM_OUTPUT_SECTION_START (asm_out_file);
735
#else
736
                  readonly_data_section ();
737
#endif
738
                  return;
739
                }
740
 
741
              named_section_flags (name, flags);
742
              return;
743
            }
744
        }
745
    }
746
 
747
  readonly_data_section ();
748
}
749
 
750
/* Tell assembler to switch to the section for constant merging.  */
751
 
752
void
753
mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
754
                            unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
755
                            unsigned int flags ATTRIBUTE_UNUSED)
756
{
757
  unsigned int modesize = GET_MODE_BITSIZE (mode);
758
 
759
  if (HAVE_GAS_SHF_MERGE && flag_merge_constants
760
      && mode != VOIDmode
761
      && mode != BLKmode
762
      && modesize <= align
763
      && align >= 8
764
      && align <= 256
765
      && (align & (align - 1)) == 0)
766
    {
767
      char name[24];
768
 
769
      sprintf (name, ".rodata.cst%d", (int) (align / 8));
770
      flags |= (align / 8) | SECTION_MERGE;
771
      named_section_flags (name, flags);
772
      return;
773
    }
774
 
775
  readonly_data_section ();
776
}
777
 
778
/* Given NAME, a putative register name, discard any customary prefixes.  */
779
 
780
static const char *
781
strip_reg_name (const char *name)
782
{
783
#ifdef REGISTER_PREFIX
784
  if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
785
    name += strlen (REGISTER_PREFIX);
786
#endif
787
  if (name[0] == '%' || name[0] == '#')
788
    name++;
789
  return name;
790
}
791
 
792
/* The user has asked for a DECL to have a particular name.  Set (or
793
   change) it in such a way that we don't prefix an underscore to
794
   it.  */
795
void
796
set_user_assembler_name (tree decl, const char *name)
797
{
798
  char *starred = alloca (strlen (name) + 2);
799
  starred[0] = '*';
800
  strcpy (starred + 1, name);
801
  change_decl_assembler_name (decl, get_identifier (starred));
802
  SET_DECL_RTL (decl, NULL_RTX);
803
}
804
 
805
/* Decode an `asm' spec for a declaration as a register name.
806
   Return the register number, or -1 if nothing specified,
807
   or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
808
   or -3 if ASMSPEC is `cc' and is not recognized,
809
   or -4 if ASMSPEC is `memory' and is not recognized.
810
   Accept an exact spelling or a decimal number.
811
   Prefixes such as % are optional.  */
812
 
813
int
814
decode_reg_name (const char *asmspec)
815
{
816
  if (asmspec != 0)
817
    {
818
      int i;
819
 
820
      /* Get rid of confusing prefixes.  */
821
      asmspec = strip_reg_name (asmspec);
822
 
823
      /* Allow a decimal number as a "register name".  */
824
      for (i = strlen (asmspec) - 1; i >= 0; i--)
825
        if (! ISDIGIT (asmspec[i]))
826
          break;
827
      if (asmspec[0] != 0 && i < 0)
828
        {
829
          i = atoi (asmspec);
830
          if (i < FIRST_PSEUDO_REGISTER && i >= 0)
831
            return i;
832
          else
833
            return -2;
834
        }
835
 
836
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
837
        if (reg_names[i][0]
838
            && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
839
          return i;
840
 
841
#ifdef ADDITIONAL_REGISTER_NAMES
842
      {
843
        static const struct { const char *const name; const int number; } table[]
844
          = ADDITIONAL_REGISTER_NAMES;
845
 
846
        for (i = 0; i < (int) ARRAY_SIZE (table); i++)
847
          if (table[i].name[0]
848
              && ! strcmp (asmspec, table[i].name))
849
            return table[i].number;
850
      }
851
#endif /* ADDITIONAL_REGISTER_NAMES */
852
 
853
      if (!strcmp (asmspec, "memory"))
854
        return -4;
855
 
856
      if (!strcmp (asmspec, "cc"))
857
        return -3;
858
 
859
      return -2;
860
    }
861
 
862
  return -1;
863
}
864
 
865
/* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL.  DECL should
866
   have static storage duration.  In other words, it should not be an
867
   automatic variable, including PARM_DECLs.
868
 
869
   There is, however, one exception: this function handles variables
870
   explicitly placed in a particular register by the user.
871
 
872
   This is never called for PARM_DECL nodes.  */
873
 
874
void
875
make_decl_rtl (tree decl)
876
{
877
  const char *name = 0;
878
  int reg_number;
879
  rtx x;
880
 
881
  /* Check that we are not being given an automatic variable.  */
882
  gcc_assert (TREE_CODE (decl) != PARM_DECL
883
              && TREE_CODE (decl) != RESULT_DECL);
884
 
885
  /* A weak alias has TREE_PUBLIC set but not the other bits.  */
886
  gcc_assert (TREE_CODE (decl) != VAR_DECL
887
              || TREE_STATIC (decl)
888
              || TREE_PUBLIC (decl)
889
              || DECL_EXTERNAL (decl)
890
              || DECL_REGISTER (decl));
891
 
892
  /* And that we were not given a type or a label.  */
893
  gcc_assert (TREE_CODE (decl) != TYPE_DECL
894
              && TREE_CODE (decl) != LABEL_DECL);
895
 
896
  /* For a duplicate declaration, we can be called twice on the
897
     same DECL node.  Don't discard the RTL already made.  */
898
  if (DECL_RTL_SET_P (decl))
899
    {
900
      /* If the old RTL had the wrong mode, fix the mode.  */
901
      if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
902
        SET_DECL_RTL (decl, adjust_address_nv (DECL_RTL (decl),
903
                                               DECL_MODE (decl), 0));
904
 
905
      if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
906
        return;
907
 
908
      /* ??? Another way to do this would be to maintain a hashed
909
         table of such critters.  Instead of adding stuff to a DECL
910
         to give certain attributes to it, we could use an external
911
         hash map from DECL to set of attributes.  */
912
 
913
      /* Let the target reassign the RTL if it wants.
914
         This is necessary, for example, when one machine specific
915
         decl attribute overrides another.  */
916
      targetm.encode_section_info (decl, DECL_RTL (decl), false);
917
 
918
      /* Make this function static known to the mudflap runtime.  */
919
      if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
920
        mudflap_enqueue_decl (decl);
921
 
922
      return;
923
    }
924
 
925
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
926
 
927
  if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL
928
      && DECL_REGISTER (decl))
929
    {
930
      error ("register name not specified for %q+D", decl);
931
    }
932
  else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
933
    {
934
      const char *asmspec = name+1;
935
      reg_number = decode_reg_name (asmspec);
936
      /* First detect errors in declaring global registers.  */
937
      if (reg_number == -1)
938
        error ("register name not specified for %q+D", decl);
939
      else if (reg_number < 0)
940
        error ("invalid register name for %q+D", decl);
941
      else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
942
        error ("data type of %q+D isn%'t suitable for a register",
943
               decl);
944
      else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
945
        error ("register specified for %q+D isn%'t suitable for data type",
946
               decl);
947
      /* Now handle properly declared static register variables.  */
948
      else
949
        {
950
          int nregs;
951
 
952
          if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
953
            {
954
              DECL_INITIAL (decl) = 0;
955
              error ("global register variable has initial value");
956
            }
957
          if (TREE_THIS_VOLATILE (decl))
958
            warning (OPT_Wvolatile_register_var,
959
                     "optimization may eliminate reads and/or "
960
                     "writes to register variables");
961
 
962
          /* If the user specified one of the eliminables registers here,
963
             e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
964
             confused with that register and be eliminated.  This usage is
965
             somewhat suspect...  */
966
 
967
          SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number));
968
          ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
969
          REG_USERVAR_P (DECL_RTL (decl)) = 1;
970
 
971
          if (TREE_STATIC (decl))
972
            {
973
              /* Make this register global, so not usable for anything
974
                 else.  */
975
#ifdef ASM_DECLARE_REGISTER_GLOBAL
976
              name = IDENTIFIER_POINTER (DECL_NAME (decl));
977
              ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
978
#endif
979
              nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)];
980
              while (nregs > 0)
981
                globalize_reg (reg_number + --nregs);
982
            }
983
 
984
          /* As a register variable, it has no section.  */
985
          return;
986
        }
987
    }
988
  /* Now handle ordinary static variables and functions (in memory).
989
     Also handle vars declared register invalidly.  */
990
  else if (name[0] == '*')
991
  {
992
#ifdef REGISTER_PREFIX
993
    if (strlen (REGISTER_PREFIX) != 0)
994
      {
995
        reg_number = decode_reg_name (name);
996
        if (reg_number >= 0 || reg_number == -3)
997
          error ("register name given for non-register variable %q+D", decl);
998
      }
999
#endif
1000
  }
1001
 
1002
  /* Specifying a section attribute on a variable forces it into a
1003
     non-.bss section, and thus it cannot be common.  */
1004
  if (TREE_CODE (decl) == VAR_DECL
1005
      && DECL_SECTION_NAME (decl) != NULL_TREE
1006
      && DECL_INITIAL (decl) == NULL_TREE
1007
      && DECL_COMMON (decl))
1008
    DECL_COMMON (decl) = 0;
1009
 
1010
  /* Variables can't be both common and weak.  */
1011
  if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
1012
    DECL_COMMON (decl) = 0;
1013
 
1014
  x = gen_rtx_SYMBOL_REF (Pmode, name);
1015
  SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
1016
  SYMBOL_REF_DECL (x) = decl;
1017
 
1018
  x = gen_rtx_MEM (DECL_MODE (decl), x);
1019
  if (TREE_CODE (decl) != FUNCTION_DECL)
1020
    set_mem_attributes (x, decl, 1);
1021
  SET_DECL_RTL (decl, x);
1022
 
1023
  /* Optionally set flags or add text to the name to record information
1024
     such as that it is a function name.
1025
     If the name is changed, the macro ASM_OUTPUT_LABELREF
1026
     will have to know how to strip this information.  */
1027
  targetm.encode_section_info (decl, DECL_RTL (decl), true);
1028
 
1029
  /* Make this function static known to the mudflap runtime.  */
1030
  if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1031
    mudflap_enqueue_decl (decl);
1032
}
1033
 
1034
/* Make the rtl for variable VAR be volatile.
1035
   Use this only for static variables.  */
1036
 
1037
void
1038
make_var_volatile (tree var)
1039
{
1040
  gcc_assert (MEM_P (DECL_RTL (var)));
1041
 
1042
  MEM_VOLATILE_P (DECL_RTL (var)) = 1;
1043
}
1044
 
1045
/* Output a string of literal assembler code
1046
   for an `asm' keyword used between functions.  */
1047
 
1048
void
1049
assemble_asm (tree string)
1050
{
1051
  app_enable ();
1052
 
1053
  if (TREE_CODE (string) == ADDR_EXPR)
1054
    string = TREE_OPERAND (string, 0);
1055
 
1056
  fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1057
}
1058
 
1059
/* Record an element in the table of global destructors.  SYMBOL is
1060
   a SYMBOL_REF of the function to be called; PRIORITY is a number
1061
   between 0 and MAX_INIT_PRIORITY.  */
1062
 
1063
void
1064
default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
1065
                                  int priority ATTRIBUTE_UNUSED)
1066
{
1067
#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1068
  /* Tell GNU LD that this is part of the static destructor set.
1069
     This will work for any system that uses stabs, most usefully
1070
     aout systems.  */
1071
  dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
1072
  dbxout_stab_value_label (XSTR (symbol, 0));
1073
#else
1074
  sorry ("global destructors not supported on this target");
1075
#endif
1076
}
1077
 
1078
void
1079
default_named_section_asm_out_destructor (rtx symbol, int priority)
1080
{
1081
  const char *section = ".dtors";
1082
  char buf[16];
1083
 
1084
  /* ??? This only works reliably with the GNU linker.  */
1085
  if (priority != DEFAULT_INIT_PRIORITY)
1086
    {
1087
      sprintf (buf, ".dtors.%.5u",
1088
               /* Invert the numbering so the linker puts us in the proper
1089
                  order; constructors are run from right to left, and the
1090
                  linker sorts in increasing order.  */
1091
               MAX_INIT_PRIORITY - priority);
1092
      section = buf;
1093
    }
1094
 
1095
  named_section_flags (section, SECTION_WRITE);
1096
  assemble_align (POINTER_SIZE);
1097
  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1098
}
1099
 
1100
#ifdef DTORS_SECTION_ASM_OP
1101
void
1102
dtors_section (void)
1103
{
1104
  if (in_section != in_dtors)
1105
    {
1106
      in_section = in_dtors;
1107
      fputs (DTORS_SECTION_ASM_OP, asm_out_file);
1108
      fputc ('\n', asm_out_file);
1109
    }
1110
}
1111
 
1112
void
1113
default_dtor_section_asm_out_destructor (rtx symbol,
1114
                                         int priority ATTRIBUTE_UNUSED)
1115
{
1116
  dtors_section ();
1117
  assemble_align (POINTER_SIZE);
1118
  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1119
}
1120
#endif
1121
 
1122
/* Likewise for global constructors.  */
1123
 
1124
void
1125
default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
1126
                                   int priority ATTRIBUTE_UNUSED)
1127
{
1128
#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1129
  /* Tell GNU LD that this is part of the static destructor set.
1130
     This will work for any system that uses stabs, most usefully
1131
     aout systems.  */
1132
  dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
1133
  dbxout_stab_value_label (XSTR (symbol, 0));
1134
#else
1135
  sorry ("global constructors not supported on this target");
1136
#endif
1137
}
1138
 
1139
void
1140
default_named_section_asm_out_constructor (rtx symbol, int priority)
1141
{
1142
  const char *section = ".ctors";
1143
  char buf[16];
1144
 
1145
  /* ??? This only works reliably with the GNU linker.  */
1146
  if (priority != DEFAULT_INIT_PRIORITY)
1147
    {
1148
      sprintf (buf, ".ctors.%.5u",
1149
               /* Invert the numbering so the linker puts us in the proper
1150
                  order; constructors are run from right to left, and the
1151
                  linker sorts in increasing order.  */
1152
               MAX_INIT_PRIORITY - priority);
1153
      section = buf;
1154
    }
1155
 
1156
  named_section_flags (section, SECTION_WRITE);
1157
  assemble_align (POINTER_SIZE);
1158
  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1159
}
1160
 
1161
#ifdef CTORS_SECTION_ASM_OP
1162
void
1163
ctors_section (void)
1164
{
1165
  if (in_section != in_ctors)
1166
    {
1167
      in_section = in_ctors;
1168
      fputs (CTORS_SECTION_ASM_OP, asm_out_file);
1169
      fputc ('\n', asm_out_file);
1170
    }
1171
}
1172
 
1173
void
1174
default_ctor_section_asm_out_constructor (rtx symbol,
1175
                                          int priority ATTRIBUTE_UNUSED)
1176
{
1177
  ctors_section ();
1178
  assemble_align (POINTER_SIZE);
1179
  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1180
}
1181
#endif
1182
 
1183
/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1184
   a nonzero value if the constant pool should be output before the
1185
   start of the function, or a zero value if the pool should output
1186
   after the end of the function.  The default is to put it before the
1187
   start.  */
1188
 
1189
#ifndef CONSTANT_POOL_BEFORE_FUNCTION
1190
#define CONSTANT_POOL_BEFORE_FUNCTION 1
1191
#endif
1192
 
1193
/* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1194
   to be output to assembler.
1195
   Set first_global_object_name and weak_global_object_name as appropriate.  */
1196
 
1197
void
1198
notice_global_symbol (tree decl)
1199
{
1200
  const char **type = &first_global_object_name;
1201
 
1202
  if (first_global_object_name
1203
      || !TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)
1204
      || !DECL_NAME (decl)
1205
      || (TREE_CODE (decl) != FUNCTION_DECL
1206
          && (TREE_CODE (decl) != VAR_DECL
1207
              || (DECL_COMMON (decl)
1208
                  && (DECL_INITIAL (decl) == 0
1209
                      || DECL_INITIAL (decl) == error_mark_node))))
1210
      || !MEM_P (DECL_RTL (decl)))
1211
    return;
1212
 
1213
  /* We win when global object is found, but it is useful to know about weak
1214
     symbol as well so we can produce nicer unique names.  */
1215
  if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl))
1216
    type = &weak_global_object_name;
1217
 
1218
  if (!*type)
1219
    {
1220
      const char *p;
1221
      const char *name;
1222
      rtx decl_rtl = DECL_RTL (decl);
1223
 
1224
      p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
1225
      name = ggc_strdup (p);
1226
 
1227
      *type = name;
1228
    }
1229
}
1230
 
1231
/* Output assembler code for the constant pool of a function and associated
1232
   with defining the name of the function.  DECL describes the function.
1233
   NAME is the function's name.  For the constant pool, we use the current
1234
   constant pool data.  */
1235
 
1236
void
1237
assemble_start_function (tree decl, const char *fnname)
1238
{
1239
  int align;
1240
  char tmp_label[100];
1241
  bool hot_label_written = false;
1242
 
1243
  cfun->unlikely_text_section_name = NULL;
1244
 
1245
  first_function_block_is_cold = false;
1246
  if (flag_reorder_blocks_and_partition)
1247
    {
1248
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
1249
      cfun->hot_section_label = ggc_strdup (tmp_label);
1250
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
1251
      cfun->cold_section_label = ggc_strdup (tmp_label);
1252
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
1253
      cfun->hot_section_end_label = ggc_strdup (tmp_label);
1254
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
1255
      cfun->cold_section_end_label = ggc_strdup (tmp_label);
1256
      const_labelno++;
1257
    }
1258
  else
1259
    {
1260
      cfun->hot_section_label = NULL;
1261
      cfun->cold_section_label = NULL;
1262
      cfun->hot_section_end_label = NULL;
1263
      cfun->cold_section_end_label = NULL;
1264
    }
1265
 
1266
  /* The following code does not need preprocessing in the assembler.  */
1267
 
1268
  app_disable ();
1269
 
1270
  if (CONSTANT_POOL_BEFORE_FUNCTION)
1271
    output_constant_pool (fnname, decl);
1272
 
1273
  resolve_unique_section (decl, 0, flag_function_sections);
1274
 
1275
  /* Make sure the not and cold text (code) sections are properly
1276
     aligned.  This is necessary here in the case where the function
1277
     has both hot and cold sections, because we don't want to re-set
1278
     the alignment when the section switch happens mid-function.  */
1279
 
1280
  if (flag_reorder_blocks_and_partition)
1281
    {
1282
      unlikely_text_section ();
1283
      assemble_align (FUNCTION_BOUNDARY);
1284
      ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
1285
 
1286
      /* When the function starts with a cold section, we need to explicitly
1287
         align the hot section and write out the hot section label.
1288
         But if the current function is a thunk, we do not have a CFG.  */
1289
      if (!current_function_is_thunk
1290
          && BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
1291
        {
1292
          text_section ();
1293
          assemble_align (FUNCTION_BOUNDARY);
1294
          ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
1295
          hot_label_written = true;
1296
          first_function_block_is_cold = true;
1297
        }
1298
    }
1299
  else if (DECL_SECTION_NAME (decl))
1300
    {
1301
      /* Calls to function_section rely on first_function_block_is_cold
1302
         being accurate.  The first block may be cold even if we aren't
1303
         doing partitioning, if the entire function was decided by
1304
         choose_function_section (predict.c) to be cold.  */
1305
 
1306
      initialize_cold_section_name ();
1307
 
1308
      if (cfun->unlikely_text_section_name
1309
          && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
1310
                     cfun->unlikely_text_section_name) == 0)
1311
        first_function_block_is_cold = true;
1312
    }
1313
 
1314
  last_text_section = no_section;
1315
 
1316
  /* Switch to the correct text section for the start of the function.  */
1317
 
1318
  function_section (decl);
1319
  if (flag_reorder_blocks_and_partition
1320
      && !hot_label_written)
1321
    ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
1322
 
1323
  /* Tell assembler to move to target machine's alignment for functions.  */
1324
  align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1325
  if (align < force_align_functions_log)
1326
    align = force_align_functions_log;
1327
  if (align > 0)
1328
    {
1329
      ASM_OUTPUT_ALIGN (asm_out_file, align);
1330
    }
1331
 
1332
  /* Handle a user-specified function alignment.
1333
     Note that we still need to align to FUNCTION_BOUNDARY, as above,
1334
     because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all.  */
1335
  if (align_functions_log > align
1336
      && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
1337
    {
1338
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1339
      ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
1340
                                 align_functions_log, align_functions - 1);
1341
#else
1342
      ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1343
#endif
1344
    }
1345
 
1346
#ifdef ASM_OUTPUT_FUNCTION_PREFIX
1347
  ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1348
#endif
1349
 
1350
  (*debug_hooks->begin_function) (decl);
1351
 
1352
  /* Make function name accessible from other files, if appropriate.  */
1353
 
1354
  if (TREE_PUBLIC (decl))
1355
    {
1356
      notice_global_symbol (decl);
1357
 
1358
      globalize_decl (decl);
1359
 
1360
      maybe_assemble_visibility (decl);
1361
    }
1362
 
1363
  if (DECL_PRESERVE_P (decl))
1364
    targetm.asm_out.mark_decl_preserved (fnname);
1365
 
1366
  /* Do any machine/system dependent processing of the function name.  */
1367
#ifdef ASM_DECLARE_FUNCTION_NAME
1368
  ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1369
#else
1370
  /* Standard thing is just output label for the function.  */
1371
  ASM_OUTPUT_LABEL (asm_out_file, fnname);
1372
#endif /* ASM_DECLARE_FUNCTION_NAME */
1373
}
1374
 
1375
/* Output assembler code associated with defining the size of the
1376
   function.  DECL describes the function.  NAME is the function's name.  */
1377
 
1378
void
1379
assemble_end_function (tree decl, const char *fnname)
1380
{
1381
#ifdef ASM_DECLARE_FUNCTION_SIZE
1382
  /* We could have switched section in the middle of the function.  */
1383
  if (flag_reorder_blocks_and_partition)
1384
    function_section (decl);
1385
  ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1386
#endif
1387
  if (! CONSTANT_POOL_BEFORE_FUNCTION)
1388
    {
1389
      output_constant_pool (fnname, decl);
1390
      function_section (decl);  /* need to switch back */
1391
    }
1392
  /* Output labels for end of hot/cold text sections (to be used by
1393
     debug info.)  */
1394
  if (flag_reorder_blocks_and_partition)
1395
    {
1396
      enum in_section save_text_section;
1397
 
1398
      save_text_section = in_section;
1399
      unlikely_text_section ();
1400
      ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
1401
      if (first_function_block_is_cold)
1402
        text_section ();
1403
      else
1404
        function_section (decl);
1405
      ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
1406
      if (save_text_section == in_unlikely_executed_text)
1407
        unlikely_text_section ();
1408
    }
1409
}
1410
 
1411
/* Assemble code to leave SIZE bytes of zeros.  */
1412
 
1413
void
1414
assemble_zeros (unsigned HOST_WIDE_INT size)
1415
{
1416
  /* Do no output if -fsyntax-only.  */
1417
  if (flag_syntax_only)
1418
    return;
1419
 
1420
#ifdef ASM_NO_SKIP_IN_TEXT
1421
  /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1422
     so we must output 0s explicitly in the text section.  */
1423
  if ((ASM_NO_SKIP_IN_TEXT && in_text_section ())
1424
      || (ASM_NO_SKIP_IN_TEXT && in_unlikely_text_section ()))
1425
    {
1426
      unsigned HOST_WIDE_INT i;
1427
      for (i = 0; i < size; i++)
1428
        assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1429
    }
1430
  else
1431
#endif
1432
    if (size > 0)
1433
      ASM_OUTPUT_SKIP (asm_out_file, size);
1434
}
1435
 
1436
/* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
1437
 
1438
void
1439
assemble_align (int align)
1440
{
1441
  if (align > BITS_PER_UNIT)
1442
    {
1443
      ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1444
    }
1445
}
1446
 
1447
/* Assemble a string constant with the specified C string as contents.  */
1448
 
1449
void
1450
assemble_string (const char *p, int size)
1451
{
1452
  int pos = 0;
1453
  int maximum = 2000;
1454
 
1455
  /* If the string is very long, split it up.  */
1456
 
1457
  while (pos < size)
1458
    {
1459
      int thissize = size - pos;
1460
      if (thissize > maximum)
1461
        thissize = maximum;
1462
 
1463
      ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1464
 
1465
      pos += thissize;
1466
      p += thissize;
1467
    }
1468
}
1469
 
1470
 
1471
#if defined  ASM_OUTPUT_ALIGNED_DECL_LOCAL
1472
#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1473
  ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1474
#else
1475
#if defined  ASM_OUTPUT_ALIGNED_LOCAL
1476
#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1477
  ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1478
#else
1479
#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1480
  ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1481
#endif
1482
#endif
1483
 
1484
#if defined ASM_OUTPUT_ALIGNED_BSS
1485
#define ASM_EMIT_BSS(decl, name, size, rounded) \
1486
  ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1487
#else
1488
#if defined ASM_OUTPUT_BSS
1489
#define ASM_EMIT_BSS(decl, name, size, rounded) \
1490
  ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1491
#else
1492
#undef  ASM_EMIT_BSS
1493
#endif
1494
#endif
1495
 
1496
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1497
#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1498
  ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1499
#else
1500
#if defined ASM_OUTPUT_ALIGNED_COMMON
1501
#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1502
  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1503
#else
1504
#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1505
  ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1506
#endif
1507
#endif
1508
 
1509
static bool
1510
asm_emit_uninitialised (tree decl, const char *name,
1511
                        unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1512
                        unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1513
{
1514
  enum
1515
  {
1516
    asm_dest_common,
1517
    asm_dest_bss,
1518
    asm_dest_local
1519
  }
1520
  destination = asm_dest_local;
1521
 
1522
  /* ??? We should handle .bss via select_section mechanisms rather than
1523
     via special target hooks.  That would eliminate this special case.  */
1524
  if (TREE_PUBLIC (decl))
1525
    {
1526
      if (!DECL_COMMON (decl))
1527
#ifdef ASM_EMIT_BSS
1528
        destination = asm_dest_bss;
1529
#else
1530
        return false;
1531
#endif
1532
      else
1533
        destination = asm_dest_common;
1534
    }
1535
 
1536
  if (destination != asm_dest_common)
1537
    {
1538
      resolve_unique_section (decl, 0, flag_data_sections);
1539
      /* Custom sections don't belong here.  */
1540
      if (DECL_SECTION_NAME (decl))
1541
        return false;
1542
    }
1543
 
1544
  if (destination == asm_dest_bss)
1545
    globalize_decl (decl);
1546
 
1547
  if (flag_shared_data)
1548
    {
1549
      switch (destination)
1550
        {
1551
#ifdef ASM_OUTPUT_SHARED_BSS
1552
        case asm_dest_bss:
1553
          ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1554
          return;
1555
#endif
1556
#ifdef ASM_OUTPUT_SHARED_COMMON
1557
        case asm_dest_common:
1558
          ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1559
          return;
1560
#endif
1561
#ifdef ASM_OUTPUT_SHARED_LOCAL
1562
        case asm_dest_local:
1563
          ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1564
          return;
1565
#endif
1566
        default:
1567
          break;
1568
        }
1569
    }
1570
 
1571
  switch (destination)
1572
    {
1573
#ifdef ASM_EMIT_BSS
1574
    case asm_dest_bss:
1575
      ASM_EMIT_BSS (decl, name, size, rounded);
1576
      break;
1577
#endif
1578
    case asm_dest_common:
1579
      ASM_EMIT_COMMON (decl, name, size, rounded);
1580
      break;
1581
    case asm_dest_local:
1582
      ASM_EMIT_LOCAL (decl, name, size, rounded);
1583
      break;
1584
    default:
1585
      gcc_unreachable ();
1586
    }
1587
 
1588
  return true;
1589
}
1590
 
1591
/* Assemble everything that is needed for a variable or function declaration.
1592
   Not used for automatic variables, and not used for function definitions.
1593
   Should not be called for variables of incomplete structure type.
1594
 
1595
   TOP_LEVEL is nonzero if this variable has file scope.
1596
   AT_END is nonzero if this is the special handling, at end of compilation,
1597
   to define things that have had only tentative definitions.
1598
   DONT_OUTPUT_DATA if nonzero means don't actually output the
1599
   initial value (that will be done by the caller).  */
1600
 
1601
void
1602
assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1603
                   int at_end ATTRIBUTE_UNUSED, int dont_output_data)
1604
{
1605
  const char *name;
1606
  unsigned int align;
1607
  int reloc = 0;
1608
  rtx decl_rtl;
1609
 
1610
  if (lang_hooks.decls.prepare_assemble_variable)
1611
    lang_hooks.decls.prepare_assemble_variable (decl);
1612
 
1613
  last_assemble_variable_decl = 0;
1614
 
1615
  /* Normally no need to say anything here for external references,
1616
     since assemble_external is called by the language-specific code
1617
     when a declaration is first seen.  */
1618
 
1619
  if (DECL_EXTERNAL (decl))
1620
    return;
1621
 
1622
  /* Output no assembler code for a function declaration.
1623
     Only definitions of functions output anything.  */
1624
 
1625
  if (TREE_CODE (decl) == FUNCTION_DECL)
1626
    return;
1627
 
1628
  /* Do nothing for global register variables.  */
1629
  if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
1630
    {
1631
      TREE_ASM_WRITTEN (decl) = 1;
1632
      return;
1633
    }
1634
 
1635
  /* If type was incomplete when the variable was declared,
1636
     see if it is complete now.  */
1637
 
1638
  if (DECL_SIZE (decl) == 0)
1639
    layout_decl (decl, 0);
1640
 
1641
  /* Still incomplete => don't allocate it; treat the tentative defn
1642
     (which is what it must have been) as an `extern' reference.  */
1643
 
1644
  if (!dont_output_data && DECL_SIZE (decl) == 0)
1645
    {
1646
      error ("storage size of %q+D isn%'t known", decl);
1647
      TREE_ASM_WRITTEN (decl) = 1;
1648
      return;
1649
    }
1650
 
1651
  /* The first declaration of a variable that comes through this function
1652
     decides whether it is global (in C, has external linkage)
1653
     or local (in C, has internal linkage).  So do nothing more
1654
     if this function has already run.  */
1655
 
1656
  if (TREE_ASM_WRITTEN (decl))
1657
    return;
1658
 
1659
  /* Make sure targetm.encode_section_info is invoked before we set
1660
     ASM_WRITTEN.  */
1661
  decl_rtl = DECL_RTL (decl);
1662
 
1663
  TREE_ASM_WRITTEN (decl) = 1;
1664
 
1665
  /* Do no output if -fsyntax-only.  */
1666
  if (flag_syntax_only)
1667
    return;
1668
 
1669
  app_disable ();
1670
 
1671
  if (! dont_output_data
1672
      && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
1673
    {
1674
      error ("size of variable %q+D is too large", decl);
1675
      return;
1676
    }
1677
 
1678
  name = XSTR (XEXP (decl_rtl, 0), 0);
1679
  if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1680
    notice_global_symbol (decl);
1681
 
1682
  /* Compute the alignment of this data.  */
1683
 
1684
  align = DECL_ALIGN (decl);
1685
 
1686
  /* In the case for initialing an array whose length isn't specified,
1687
     where we have not yet been able to do the layout,
1688
     figure out the proper alignment now.  */
1689
  if (dont_output_data && DECL_SIZE (decl) == 0
1690
      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1691
    align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1692
 
1693
  /* Some object file formats have a maximum alignment which they support.
1694
     In particular, a.out format supports a maximum alignment of 4.  */
1695
  if (align > MAX_OFILE_ALIGNMENT)
1696
    {
1697
      warning (0, "alignment of %q+D is greater than maximum object "
1698
               "file alignment.  Using %d", decl,
1699
               MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1700
      align = MAX_OFILE_ALIGNMENT;
1701
    }
1702
 
1703
  /* On some machines, it is good to increase alignment sometimes.  */
1704
  if (! DECL_USER_ALIGN (decl))
1705
    {
1706
#ifdef DATA_ALIGNMENT
1707
      align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1708
#endif
1709
#ifdef CONSTANT_ALIGNMENT
1710
      if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1711
        align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1712
#endif
1713
    }
1714
 
1715
  /* Reset the alignment in case we have made it tighter, so we can benefit
1716
     from it in get_pointer_alignment.  */
1717
  DECL_ALIGN (decl) = align;
1718
  set_mem_align (decl_rtl, align);
1719
 
1720
  if (TREE_PUBLIC (decl))
1721
    maybe_assemble_visibility (decl);
1722
 
1723
  if (DECL_PRESERVE_P (decl))
1724
    targetm.asm_out.mark_decl_preserved (name);
1725
 
1726
  /* Handle uninitialized definitions.  */
1727
 
1728
  /* If the decl has been given an explicit section name, then it
1729
     isn't common, and shouldn't be handled as such.  */
1730
  if (DECL_SECTION_NAME (decl) || dont_output_data)
1731
    ;
1732
  /* We don't implement common thread-local data at present.  */
1733
  else if (DECL_THREAD_LOCAL_P (decl))
1734
    {
1735
      if (DECL_COMMON (decl))
1736
        sorry ("thread-local COMMON data not implemented");
1737
    }
1738
  else if (DECL_INITIAL (decl) == 0
1739
           || DECL_INITIAL (decl) == error_mark_node
1740
           || (flag_zero_initialized_in_bss
1741
               /* Leave constant zeroes in .rodata so they can be shared.  */
1742
               && !TREE_READONLY (decl)
1743
               && initializer_zerop (DECL_INITIAL (decl))))
1744
    {
1745
      unsigned HOST_WIDE_INT size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1746
      unsigned HOST_WIDE_INT rounded = size;
1747
 
1748
      /* Don't allocate zero bytes of common,
1749
         since that means "undefined external" in the linker.  */
1750
      if (size == 0)
1751
        rounded = 1;
1752
 
1753
      /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1754
         so that each uninitialized object starts on such a boundary.  */
1755
      rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1756
      rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1757
                 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1758
 
1759
#if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1760
      if ((unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
1761
        warning (0, "requested alignment for %q+D is greater than "
1762
                 "implemented alignment of %wu", decl, rounded);
1763
#endif
1764
 
1765
      /* If the target cannot output uninitialized but not common global data
1766
         in .bss, then we have to use .data, so fall through.  */
1767
      if (asm_emit_uninitialised (decl, name, size, rounded))
1768
        return;
1769
    }
1770
 
1771
  /* Handle initialized definitions.
1772
     Also handle uninitialized global definitions if -fno-common and the
1773
     target doesn't support ASM_OUTPUT_BSS.  */
1774
 
1775
  /* First make the assembler name(s) global if appropriate.  */
1776
  if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1777
    globalize_decl (decl);
1778
 
1779
  /* Output any data that we will need to use the address of.  */
1780
  if (DECL_INITIAL (decl) == error_mark_node)
1781
    reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1782
  else if (DECL_INITIAL (decl))
1783
    {
1784
      reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1785
      output_addressed_constants (DECL_INITIAL (decl));
1786
    }
1787
 
1788
  /* Switch to the appropriate section.  */
1789
  resolve_unique_section (decl, reloc, flag_data_sections);
1790
  variable_section (decl, reloc);
1791
 
1792
  /* dbxout.c needs to know this.  */
1793
  if (in_text_section () || in_unlikely_text_section ())
1794
    DECL_IN_TEXT_SECTION (decl) = 1;
1795
 
1796
  /* Output the alignment of this data.  */
1797
  if (align > BITS_PER_UNIT)
1798
    ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
1799
 
1800
  /* Do any machine/system dependent processing of the object.  */
1801
#ifdef ASM_DECLARE_OBJECT_NAME
1802
  last_assemble_variable_decl = decl;
1803
  ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1804
#else
1805
  /* Standard thing is just output label for the object.  */
1806
  ASM_OUTPUT_LABEL (asm_out_file, name);
1807
#endif /* ASM_DECLARE_OBJECT_NAME */
1808
 
1809
  if (!dont_output_data)
1810
    {
1811
      if (DECL_INITIAL (decl)
1812
          && DECL_INITIAL (decl) != error_mark_node
1813
          && !initializer_zerop (DECL_INITIAL (decl)))
1814
        /* Output the actual data.  */
1815
        output_constant (DECL_INITIAL (decl),
1816
                         tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1817
                         align);
1818
      else
1819
        /* Leave space for it.  */
1820
        assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1821
    }
1822
}
1823
 
1824
/* Return 1 if type TYPE contains any pointers.  */
1825
 
1826
static int
1827
contains_pointers_p (tree type)
1828
{
1829
  switch (TREE_CODE (type))
1830
    {
1831
    case POINTER_TYPE:
1832
    case REFERENCE_TYPE:
1833
      /* I'm not sure whether OFFSET_TYPE needs this treatment,
1834
         so I'll play safe and return 1.  */
1835
    case OFFSET_TYPE:
1836
      return 1;
1837
 
1838
    case RECORD_TYPE:
1839
    case UNION_TYPE:
1840
    case QUAL_UNION_TYPE:
1841
      {
1842
        tree fields;
1843
        /* For a type that has fields, see if the fields have pointers.  */
1844
        for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
1845
          if (TREE_CODE (fields) == FIELD_DECL
1846
              && contains_pointers_p (TREE_TYPE (fields)))
1847
            return 1;
1848
        return 0;
1849
      }
1850
 
1851
    case ARRAY_TYPE:
1852
      /* An array type contains pointers if its element type does.  */
1853
      return contains_pointers_p (TREE_TYPE (type));
1854
 
1855
    default:
1856
      return 0;
1857
    }
1858
}
1859
 
1860
/* In unit-at-a-time mode, we delay assemble_external processing until
1861
   the compilation unit is finalized.  This is the best we can do for
1862
   right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay
1863
   it all the way to final.  See PR 17982 for further discussion.  */
1864
static GTY(()) tree pending_assemble_externals;
1865
 
1866
#ifdef ASM_OUTPUT_EXTERNAL
1867
/* True if DECL is a function decl for which no out-of-line copy exists.
1868
   It is assumed that DECL's assembler name has been set.  */
1869
 
1870
static bool
1871
incorporeal_function_p (tree decl)
1872
{
1873
  if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
1874
    {
1875
      const char *name;
1876
 
1877
      if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1878
          && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
1879
        return true;
1880
 
1881
      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1882
      if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
1883
        return true;
1884
    }
1885
  return false;
1886
}
1887
 
1888
/* Actually do the tests to determine if this is necessary, and invoke
1889
   ASM_OUTPUT_EXTERNAL.  */
1890
static void
1891
assemble_external_real (tree decl)
1892
{
1893
  rtx rtl = DECL_RTL (decl);
1894
 
1895
  if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1896
      && !SYMBOL_REF_USED (XEXP (rtl, 0))
1897
      && !incorporeal_function_p (decl))
1898
    {
1899
      /* Some systems do require some output.  */
1900
      SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1901
      ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1902
    }
1903
}
1904
#endif
1905
 
1906
void
1907
process_pending_assemble_externals (void)
1908
{
1909
#ifdef ASM_OUTPUT_EXTERNAL
1910
  tree list;
1911
  for (list = pending_assemble_externals; list; list = TREE_CHAIN (list))
1912
    assemble_external_real (TREE_VALUE (list));
1913
 
1914
  pending_assemble_externals = 0;
1915
#endif
1916
}
1917
 
1918
/* Output something to declare an external symbol to the assembler.
1919
   (Most assemblers don't need this, so we normally output nothing.)
1920
   Do nothing if DECL is not external.  */
1921
 
1922
void
1923
assemble_external (tree decl ATTRIBUTE_UNUSED)
1924
{
1925
  /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1926
     main body of this code is only rarely exercised.  To provide some
1927
     testing, on all platforms, we make sure that the ASM_OUT_FILE is
1928
     open.  If it's not, we should not be calling this function.  */
1929
  gcc_assert (asm_out_file);
1930
 
1931
#ifdef ASM_OUTPUT_EXTERNAL
1932
  if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
1933
    return;
1934
 
1935
  if (flag_unit_at_a_time)
1936
    pending_assemble_externals = tree_cons (0, decl,
1937
                                            pending_assemble_externals);
1938
  else
1939
    assemble_external_real (decl);
1940
#endif
1941
}
1942
 
1943
/* Similar, for calling a library function FUN.  */
1944
 
1945
void
1946
assemble_external_libcall (rtx fun)
1947
{
1948
  /* Declare library function name external when first used, if nec.  */
1949
  if (! SYMBOL_REF_USED (fun))
1950
    {
1951
      SYMBOL_REF_USED (fun) = 1;
1952
      targetm.asm_out.external_libcall (fun);
1953
    }
1954
}
1955
 
1956
/* Assemble a label named NAME.  */
1957
 
1958
void
1959
assemble_label (const char *name)
1960
{
1961
  ASM_OUTPUT_LABEL (asm_out_file, name);
1962
}
1963
 
1964
/* Set the symbol_referenced flag for ID.  */
1965
void
1966
mark_referenced (tree id)
1967
{
1968
  TREE_SYMBOL_REFERENCED (id) = 1;
1969
}
1970
 
1971
/* Set the symbol_referenced flag for DECL and notify callgraph.  */
1972
void
1973
mark_decl_referenced (tree decl)
1974
{
1975
  if (TREE_CODE (decl) == FUNCTION_DECL)
1976
    {
1977
      /* Extern inline functions don't become needed when referenced.
1978
         If we know a method will be emitted in other TU and no new
1979
         functions can be marked reachable, just use the external
1980
         definition.  */
1981
      struct cgraph_node *node = cgraph_node (decl);
1982
      if (!DECL_EXTERNAL (decl)
1983
          && (!node->local.vtable_method || !cgraph_global_info_ready
1984
              || !node->local.finalized))
1985
        cgraph_mark_needed_node (node);
1986
    }
1987
  else if (TREE_CODE (decl) == VAR_DECL)
1988
    {
1989
      struct cgraph_varpool_node *node = cgraph_varpool_node (decl);
1990
      cgraph_varpool_mark_needed_node (node);
1991
      /* C++ frontend use mark_decl_references to force COMDAT variables
1992
         to be output that might appear dead otherwise.  */
1993
      node->force_output = true;
1994
    }
1995
  /* else do nothing - we can get various sorts of CST nodes here,
1996
     which do not need to be marked.  */
1997
}
1998
 
1999
 
2000
/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
2001
   until we find an identifier that is not itself a transparent alias.
2002
   Modify the alias passed to it by reference (and all aliases on the
2003
   way to the ultimate target), such that they do not have to be
2004
   followed again, and return the ultimate target of the alias
2005
   chain.  */
2006
 
2007
static inline tree
2008
ultimate_transparent_alias_target (tree *alias)
2009
{
2010
  tree target = *alias;
2011
 
2012
  if (IDENTIFIER_TRANSPARENT_ALIAS (target))
2013
    {
2014
      gcc_assert (TREE_CHAIN (target));
2015
      target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
2016
      gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
2017
                  && ! TREE_CHAIN (target));
2018
      *alias = target;
2019
    }
2020
 
2021
  return target;
2022
}
2023
 
2024
/* Output to FILE (an assembly file) a reference to NAME.  If NAME
2025
   starts with a *, the rest of NAME is output verbatim.  Otherwise
2026
   NAME is transformed in a target-specific way (usually by the
2027
   addition of an underscore).  */
2028
 
2029
void
2030
assemble_name_raw (FILE *file, const char *name)
2031
{
2032
  if (name[0] == '*')
2033
    fputs (&name[1], file);
2034
  else
2035
    ASM_OUTPUT_LABELREF (file, name);
2036
}
2037
 
2038
/* Like assemble_name_raw, but should be used when NAME might refer to
2039
   an entity that is also represented as a tree (like a function or
2040
   variable).  If NAME does refer to such an entity, that entity will
2041
   be marked as referenced.  */
2042
 
2043
void
2044
assemble_name (FILE *file, const char *name)
2045
{
2046
  const char *real_name;
2047
  tree id;
2048
 
2049
  real_name = targetm.strip_name_encoding (name);
2050
 
2051
  id = maybe_get_identifier (real_name);
2052
  if (id)
2053
    {
2054
      tree id_orig = id;
2055
 
2056
      mark_referenced (id);
2057
      ultimate_transparent_alias_target (&id);
2058
      if (id != id_orig)
2059
        name = IDENTIFIER_POINTER (id);
2060
      gcc_assert (! TREE_CHAIN (id));
2061
    }
2062
 
2063
  assemble_name_raw (file, name);
2064
}
2065
 
2066
/* Allocate SIZE bytes writable static space with a gensym name
2067
   and return an RTX to refer to its address.  */
2068
 
2069
rtx
2070
assemble_static_space (unsigned HOST_WIDE_INT size)
2071
{
2072
  char name[12];
2073
  const char *namestring;
2074
  rtx x;
2075
 
2076
#if 0
2077
  if (flag_shared_data)
2078
    data_section ();
2079
#endif
2080
 
2081
  ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
2082
  ++const_labelno;
2083
  namestring = ggc_strdup (name);
2084
 
2085
  x = gen_rtx_SYMBOL_REF (Pmode, namestring);
2086
  SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
2087
 
2088
#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
2089
  ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
2090
                                 BIGGEST_ALIGNMENT);
2091
#else
2092
#ifdef ASM_OUTPUT_ALIGNED_LOCAL
2093
  ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
2094
#else
2095
  {
2096
    /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2097
       so that each uninitialized object starts on such a boundary.  */
2098
    /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL.  */
2099
    unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
2100
      = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
2101
         / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2102
         * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
2103
    ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
2104
  }
2105
#endif
2106
#endif
2107
  return x;
2108
}
2109
 
2110
/* Assemble the static constant template for function entry trampolines.
2111
   This is done at most once per compilation.
2112
   Returns an RTX for the address of the template.  */
2113
 
2114
static GTY(()) rtx initial_trampoline;
2115
 
2116
#ifdef TRAMPOLINE_TEMPLATE
2117
rtx
2118
assemble_trampoline_template (void)
2119
{
2120
  char label[256];
2121
  const char *name;
2122
  int align;
2123
  rtx symbol;
2124
 
2125
  if (initial_trampoline)
2126
    return initial_trampoline;
2127
 
2128
  /* By default, put trampoline templates in read-only data section.  */
2129
 
2130
#ifdef TRAMPOLINE_SECTION
2131
  TRAMPOLINE_SECTION ();
2132
#else
2133
  readonly_data_section ();
2134
#endif
2135
 
2136
  /* Write the assembler code to define one.  */
2137
  align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
2138
  if (align > 0)
2139
    {
2140
      ASM_OUTPUT_ALIGN (asm_out_file, align);
2141
    }
2142
 
2143
  targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
2144
  TRAMPOLINE_TEMPLATE (asm_out_file);
2145
 
2146
  /* Record the rtl to refer to it.  */
2147
  ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
2148
  name = ggc_strdup (label);
2149
  symbol = gen_rtx_SYMBOL_REF (Pmode, name);
2150
  SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2151
 
2152
  initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
2153
  set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
2154
 
2155
  return initial_trampoline;
2156
}
2157
#endif
2158
 
2159
/* A and B are either alignments or offsets.  Return the minimum alignment
2160
   that may be assumed after adding the two together.  */
2161
 
2162
static inline unsigned
2163
min_align (unsigned int a, unsigned int b)
2164
{
2165
  return (a | b) & -(a | b);
2166
}
2167
 
2168
/* Return the assembler directive for creating a given kind of integer
2169
   object.  SIZE is the number of bytes in the object and ALIGNED_P
2170
   indicates whether it is known to be aligned.  Return NULL if the
2171
   assembly dialect has no such directive.
2172
 
2173
   The returned string should be printed at the start of a new line and
2174
   be followed immediately by the object's initial value.  */
2175
 
2176
const char *
2177
integer_asm_op (int size, int aligned_p)
2178
{
2179
  struct asm_int_op *ops;
2180
 
2181
  if (aligned_p)
2182
    ops = &targetm.asm_out.aligned_op;
2183
  else
2184
    ops = &targetm.asm_out.unaligned_op;
2185
 
2186
  switch (size)
2187
    {
2188
    case 1:
2189
      return targetm.asm_out.byte_op;
2190
    case 2:
2191
      return ops->hi;
2192
    case 4:
2193
      return ops->si;
2194
    case 8:
2195
      return ops->di;
2196
    case 16:
2197
      return ops->ti;
2198
    default:
2199
      return NULL;
2200
    }
2201
}
2202
 
2203
/* Use directive OP to assemble an integer object X.  Print OP at the
2204
   start of the line, followed immediately by the value of X.  */
2205
 
2206
void
2207
assemble_integer_with_op (const char *op, rtx x)
2208
{
2209
  fputs (op, asm_out_file);
2210
  output_addr_const (asm_out_file, x);
2211
  fputc ('\n', asm_out_file);
2212
}
2213
 
2214
/* The default implementation of the asm_out.integer target hook.  */
2215
 
2216
bool
2217
default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2218
                          unsigned int size ATTRIBUTE_UNUSED,
2219
                          int aligned_p ATTRIBUTE_UNUSED)
2220
{
2221
  const char *op = integer_asm_op (size, aligned_p);
2222
  /* Avoid GAS bugs for large values.  Specifically negative values whose
2223
     absolute value fits in a bfd_vma, but not in a bfd_signed_vma.  */
2224
  if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT)
2225
    return false;
2226
  return op && (assemble_integer_with_op (op, x), true);
2227
}
2228
 
2229
/* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
2230
   the alignment of the integer in bits.  Return 1 if we were able to output
2231
   the constant, otherwise 0.  We must be able to output the constant,
2232
   if FORCE is nonzero.  */
2233
 
2234
bool
2235
assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
2236
{
2237
  int aligned_p;
2238
 
2239
  aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
2240
 
2241
  /* See if the target hook can handle this kind of object.  */
2242
  if (targetm.asm_out.integer (x, size, aligned_p))
2243
    return true;
2244
 
2245
  /* If the object is a multi-byte one, try splitting it up.  Split
2246
     it into words it if is multi-word, otherwise split it into bytes.  */
2247
  if (size > 1)
2248
    {
2249
      enum machine_mode omode, imode;
2250
      unsigned int subalign;
2251
      unsigned int subsize, i;
2252
 
2253
      subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2254
      subalign = MIN (align, subsize * BITS_PER_UNIT);
2255
      omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0);
2256
      imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2257
 
2258
      for (i = 0; i < size; i += subsize)
2259
        {
2260
          rtx partial = simplify_subreg (omode, x, imode, i);
2261
          if (!partial || !assemble_integer (partial, subsize, subalign, 0))
2262
            break;
2263
        }
2264
      if (i == size)
2265
        return true;
2266
 
2267
      /* If we've printed some of it, but not all of it, there's no going
2268
         back now.  */
2269
      gcc_assert (!i);
2270
    }
2271
 
2272
  gcc_assert (!force);
2273
 
2274
  return false;
2275
}
2276
 
2277
void
2278
assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
2279
{
2280
  long data[4];
2281
  int i;
2282
  int bitsize, nelts, nunits, units_per;
2283
 
2284
  /* This is hairy.  We have a quantity of known size.  real_to_target
2285
     will put it into an array of *host* longs, 32 bits per element
2286
     (even if long is more than 32 bits).  We need to determine the
2287
     number of array elements that are occupied (nelts) and the number
2288
     of *target* min-addressable units that will be occupied in the
2289
     object file (nunits).  We cannot assume that 32 divides the
2290
     mode's bitsize (size * BITS_PER_UNIT) evenly.
2291
 
2292
     size * BITS_PER_UNIT is used here to make sure that padding bits
2293
     (which might appear at either end of the value; real_to_target
2294
     will include the padding bits in its output array) are included.  */
2295
 
2296
  nunits = GET_MODE_SIZE (mode);
2297
  bitsize = nunits * BITS_PER_UNIT;
2298
  nelts = CEIL (bitsize, 32);
2299
  units_per = 32 / BITS_PER_UNIT;
2300
 
2301
  real_to_target (data, &d, mode);
2302
 
2303
  /* Put out the first word with the specified alignment.  */
2304
  assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
2305
  nunits -= units_per;
2306
 
2307
  /* Subsequent words need only 32-bit alignment.  */
2308
  align = min_align (align, 32);
2309
 
2310
  for (i = 1; i < nelts; i++)
2311
    {
2312
      assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
2313
      nunits -= units_per;
2314
    }
2315
}
2316
 
2317
/* Given an expression EXP with a constant value,
2318
   reduce it to the sum of an assembler symbol and an integer.
2319
   Store them both in the structure *VALUE.
2320
   EXP must be reducible.  */
2321
 
2322
struct addr_const GTY(())
2323
{
2324
  rtx base;
2325
  HOST_WIDE_INT offset;
2326
};
2327
 
2328
static void
2329
decode_addr_const (tree exp, struct addr_const *value)
2330
{
2331
  tree target = TREE_OPERAND (exp, 0);
2332
  int offset = 0;
2333
  rtx x;
2334
 
2335
  while (1)
2336
    {
2337
      if (TREE_CODE (target) == COMPONENT_REF
2338
          && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2339
 
2340
        {
2341
          offset += int_byte_position (TREE_OPERAND (target, 1));
2342
          target = TREE_OPERAND (target, 0);
2343
        }
2344
      else if (TREE_CODE (target) == ARRAY_REF
2345
               || TREE_CODE (target) == ARRAY_RANGE_REF)
2346
        {
2347
          offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2348
                     * tree_low_cst (TREE_OPERAND (target, 1), 0));
2349
          target = TREE_OPERAND (target, 0);
2350
        }
2351
      else
2352
        break;
2353
    }
2354
 
2355
  switch (TREE_CODE (target))
2356
    {
2357
    case VAR_DECL:
2358
    case FUNCTION_DECL:
2359
      x = DECL_RTL (target);
2360
      break;
2361
 
2362
    case LABEL_DECL:
2363
      x = gen_rtx_MEM (FUNCTION_MODE,
2364
                       gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));
2365
      break;
2366
 
2367
    case REAL_CST:
2368
    case STRING_CST:
2369
    case COMPLEX_CST:
2370
    case CONSTRUCTOR:
2371
    case INTEGER_CST:
2372
      x = output_constant_def (target, 1);
2373
      break;
2374
 
2375
    default:
2376
      gcc_unreachable ();
2377
    }
2378
 
2379
  gcc_assert (MEM_P (x));
2380
  x = XEXP (x, 0);
2381
 
2382
  value->base = x;
2383
  value->offset = offset;
2384
}
2385
 
2386
/* Uniquize all constants that appear in memory.
2387
   Each constant in memory thus far output is recorded
2388
   in `const_desc_table'.  */
2389
 
2390
struct constant_descriptor_tree GTY(())
2391
{
2392
  /* A MEM for the constant.  */
2393
  rtx rtl;
2394
 
2395
  /* The value of the constant.  */
2396
  tree value;
2397
 
2398
  /* Hash of value.  Computing the hash from value each time
2399
     hashfn is called can't work properly, as that means recursive
2400
     use of the hash table during hash table expansion.  */
2401
  hashval_t hash;
2402
};
2403
 
2404
static GTY((param_is (struct constant_descriptor_tree)))
2405
     htab_t const_desc_htab;
2406
 
2407
static struct constant_descriptor_tree * build_constant_desc (tree);
2408
static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2409
 
2410
/* Compute a hash code for a constant expression.  */
2411
 
2412
static hashval_t
2413
const_desc_hash (const void *ptr)
2414
{
2415
  return ((struct constant_descriptor_tree *)ptr)->hash;
2416
}
2417
 
2418
static hashval_t
2419
const_hash_1 (const tree exp)
2420
{
2421
  const char *p;
2422
  hashval_t hi;
2423
  int len, i;
2424
  enum tree_code code = TREE_CODE (exp);
2425
 
2426
  /* Either set P and LEN to the address and len of something to hash and
2427
     exit the switch or return a value.  */
2428
 
2429
  switch (code)
2430
    {
2431
    case INTEGER_CST:
2432
      p = (char *) &TREE_INT_CST (exp);
2433
      len = sizeof TREE_INT_CST (exp);
2434
      break;
2435
 
2436
    case REAL_CST:
2437
      return real_hash (TREE_REAL_CST_PTR (exp));
2438
 
2439
    case STRING_CST:
2440
      p = TREE_STRING_POINTER (exp);
2441
      len = TREE_STRING_LENGTH (exp);
2442
      break;
2443
 
2444
    case COMPLEX_CST:
2445
      return (const_hash_1 (TREE_REALPART (exp)) * 5
2446
              + const_hash_1 (TREE_IMAGPART (exp)));
2447
 
2448
    case CONSTRUCTOR:
2449
      {
2450
        unsigned HOST_WIDE_INT idx;
2451
        tree value;
2452
 
2453
        hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2454
 
2455
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
2456
          if (value)
2457
            hi = hi * 603 + const_hash_1 (value);
2458
 
2459
        return hi;
2460
      }
2461
 
2462
    case ADDR_EXPR:
2463
    case FDESC_EXPR:
2464
      {
2465
        struct addr_const value;
2466
 
2467
        decode_addr_const (exp, &value);
2468
        switch (GET_CODE (value.base))
2469
          {
2470
          case SYMBOL_REF:
2471
            /* Don't hash the address of the SYMBOL_REF;
2472
               only use the offset and the symbol name.  */
2473
            hi = value.offset;
2474
            p = XSTR (value.base, 0);
2475
            for (i = 0; p[i] != 0; i++)
2476
              hi = ((hi * 613) + (unsigned) (p[i]));
2477
            break;
2478
 
2479
          case LABEL_REF:
2480
            hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2481
            break;
2482
 
2483
          default:
2484
            gcc_unreachable ();
2485
          }
2486
      }
2487
      return hi;
2488
 
2489
    case PLUS_EXPR:
2490
    case MINUS_EXPR:
2491
      return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2492
              + const_hash_1 (TREE_OPERAND (exp, 1)));
2493
 
2494
    case NOP_EXPR:
2495
    case CONVERT_EXPR:
2496
    case NON_LVALUE_EXPR:
2497
      return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
2498
 
2499
    default:
2500
      /* A language specific constant. Just hash the code.  */
2501
      return code;
2502
    }
2503
 
2504
  /* Compute hashing function.  */
2505
  hi = len;
2506
  for (i = 0; i < len; i++)
2507
    hi = ((hi * 613) + (unsigned) (p[i]));
2508
 
2509
  return hi;
2510
}
2511
 
2512
/* Wrapper of compare_constant, for the htab interface.  */
2513
static int
2514
const_desc_eq (const void *p1, const void *p2)
2515
{
2516
  const struct constant_descriptor_tree *c1 = p1;
2517
  const struct constant_descriptor_tree *c2 = p2;
2518
  if (c1->hash != c2->hash)
2519
    return 0;
2520
  return compare_constant (c1->value, c2->value);
2521
}
2522
 
2523
/* Compare t1 and t2, and return 1 only if they are known to result in
2524
   the same bit pattern on output.  */
2525
 
2526
static int
2527
compare_constant (const tree t1, const tree t2)
2528
{
2529
  enum tree_code typecode;
2530
 
2531
  if (t1 == NULL_TREE)
2532
    return t2 == NULL_TREE;
2533
  if (t2 == NULL_TREE)
2534
    return 0;
2535
 
2536
  if (TREE_CODE (t1) != TREE_CODE (t2))
2537
    return 0;
2538
 
2539
  switch (TREE_CODE (t1))
2540
    {
2541
    case INTEGER_CST:
2542
      /* Integer constants are the same only if the same width of type.  */
2543
      if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2544
        return 0;
2545
      if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2546
        return 0;
2547
      return tree_int_cst_equal (t1, t2);
2548
 
2549
    case REAL_CST:
2550
      /* Real constants are the same only if the same width of type.  */
2551
      if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2552
        return 0;
2553
 
2554
      return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2555
 
2556
    case STRING_CST:
2557
      if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2558
        return 0;
2559
 
2560
      return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2561
              && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2562
                         TREE_STRING_LENGTH (t1)));
2563
 
2564
    case COMPLEX_CST:
2565
      return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2566
              && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2567
 
2568
    case CONSTRUCTOR:
2569
      {
2570
        VEC(constructor_elt, gc) *v1, *v2;
2571
        unsigned HOST_WIDE_INT idx;
2572
 
2573
        typecode = TREE_CODE (TREE_TYPE (t1));
2574
        if (typecode != TREE_CODE (TREE_TYPE (t2)))
2575
          return 0;
2576
 
2577
        if (typecode == ARRAY_TYPE)
2578
          {
2579
            HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2580
            /* For arrays, check that the sizes all match.  */
2581
            if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2582
                || size_1 == -1
2583
                || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2584
              return 0;
2585
          }
2586
        else
2587
          {
2588
            /* For record and union constructors, require exact type
2589
               equality.  */
2590
            if (TREE_TYPE (t1) != TREE_TYPE (t2))
2591
              return 0;
2592
          }
2593
 
2594
        v1 = CONSTRUCTOR_ELTS (t1);
2595
        v2 = CONSTRUCTOR_ELTS (t2);
2596
        if (VEC_length (constructor_elt, v1)
2597
            != VEC_length (constructor_elt, v2))
2598
            return 0;
2599
 
2600
        for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx)
2601
          {
2602
            constructor_elt *c1 = VEC_index (constructor_elt, v1, idx);
2603
            constructor_elt *c2 = VEC_index (constructor_elt, v2, idx);
2604
 
2605
            /* Check that each value is the same...  */
2606
            if (!compare_constant (c1->value, c2->value))
2607
              return 0;
2608
            /* ... and that they apply to the same fields!  */
2609
            if (typecode == ARRAY_TYPE)
2610
              {
2611
                if (!compare_constant (c1->index, c2->index))
2612
                  return 0;
2613
              }
2614
            else
2615
              {
2616
                if (c1->index != c2->index)
2617
                  return 0;
2618
              }
2619
          }
2620
 
2621
        return 1;
2622
      }
2623
 
2624
    case ADDR_EXPR:
2625
    case FDESC_EXPR:
2626
      {
2627
        struct addr_const value1, value2;
2628
 
2629
        decode_addr_const (t1, &value1);
2630
        decode_addr_const (t2, &value2);
2631
        return (value1.offset == value2.offset
2632
                && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2633
      }
2634
 
2635
    case PLUS_EXPR:
2636
    case MINUS_EXPR:
2637
    case RANGE_EXPR:
2638
      return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2639
              && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2640
 
2641
    case NOP_EXPR:
2642
    case CONVERT_EXPR:
2643
    case NON_LVALUE_EXPR:
2644
    case VIEW_CONVERT_EXPR:
2645
      return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2646
 
2647
    default:
2648
      {
2649
        tree nt1, nt2;
2650
        nt1 = lang_hooks.expand_constant (t1);
2651
        nt2 = lang_hooks.expand_constant (t2);
2652
        if (nt1 != t1 || nt2 != t2)
2653
          return compare_constant (nt1, nt2);
2654
        else
2655
          return 0;
2656
      }
2657
    }
2658
 
2659
  gcc_unreachable ();
2660
}
2661
 
2662
/* Make a copy of the whole tree structure for a constant.  This
2663
   handles the same types of nodes that compare_constant handles.  */
2664
 
2665
static tree
2666
copy_constant (tree exp)
2667
{
2668
  switch (TREE_CODE (exp))
2669
    {
2670
    case ADDR_EXPR:
2671
      /* For ADDR_EXPR, we do not want to copy the decl whose address
2672
         is requested.  We do want to copy constants though.  */
2673
      if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
2674
        return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2675
                       copy_constant (TREE_OPERAND (exp, 0)));
2676
      else
2677
        return copy_node (exp);
2678
 
2679
    case INTEGER_CST:
2680
    case REAL_CST:
2681
    case STRING_CST:
2682
      return copy_node (exp);
2683
 
2684
    case COMPLEX_CST:
2685
      return build_complex (TREE_TYPE (exp),
2686
                            copy_constant (TREE_REALPART (exp)),
2687
                            copy_constant (TREE_IMAGPART (exp)));
2688
 
2689
    case PLUS_EXPR:
2690
    case MINUS_EXPR:
2691
      return build2 (TREE_CODE (exp), TREE_TYPE (exp),
2692
                     copy_constant (TREE_OPERAND (exp, 0)),
2693
                     copy_constant (TREE_OPERAND (exp, 1)));
2694
 
2695
    case NOP_EXPR:
2696
    case CONVERT_EXPR:
2697
    case NON_LVALUE_EXPR:
2698
    case VIEW_CONVERT_EXPR:
2699
      return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2700
                     copy_constant (TREE_OPERAND (exp, 0)));
2701
 
2702
    case CONSTRUCTOR:
2703
      {
2704
        tree copy = copy_node (exp);
2705
        VEC(constructor_elt, gc) *v;
2706
        unsigned HOST_WIDE_INT idx;
2707
        tree purpose, value;
2708
 
2709
        v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt,
2710
                                                      CONSTRUCTOR_ELTS (exp)));
2711
        FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
2712
          {
2713
            constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
2714
            ce->index = purpose;
2715
            ce->value = copy_constant (value);
2716
          }
2717
        CONSTRUCTOR_ELTS (copy) = v;
2718
        return copy;
2719
      }
2720
 
2721
    default:
2722
      {
2723
        tree t = lang_hooks.expand_constant (exp);
2724
 
2725
        gcc_assert (t == exp);
2726
        return copy_constant (t);
2727
      }
2728
    }
2729
}
2730
 
2731
/* Subroutine of output_constant_def:
2732
   No constant equal to EXP is known to have been output.
2733
   Make a constant descriptor to enter EXP in the hash table.
2734
   Assign the label number and construct RTL to refer to the
2735
   constant's location in memory.
2736
   Caller is responsible for updating the hash table.  */
2737
 
2738
static struct constant_descriptor_tree *
2739
build_constant_desc (tree exp)
2740
{
2741
  rtx symbol;
2742
  rtx rtl;
2743
  char label[256];
2744
  int labelno;
2745
  struct constant_descriptor_tree *desc;
2746
 
2747
  desc = ggc_alloc (sizeof (*desc));
2748
  desc->value = copy_constant (exp);
2749
 
2750
  /* Propagate marked-ness to copied constant.  */
2751
  if (flag_mudflap && mf_marked_p (exp))
2752
    mf_mark (desc->value);
2753
 
2754
  /* Create a string containing the label name, in LABEL.  */
2755
  labelno = const_labelno++;
2756
  ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2757
 
2758
  /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2759
  symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2760
  SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2761
  SYMBOL_REF_DECL (symbol) = desc->value;
2762
  TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2763
 
2764
  rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2765
  set_mem_attributes (rtl, exp, 1);
2766
  set_mem_alias_set (rtl, 0);
2767
  set_mem_alias_set (rtl, const_alias_set);
2768
 
2769
  /* Set flags or add text to the name to record information, such as
2770
     that it is a local symbol.  If the name is changed, the macro
2771
     ASM_OUTPUT_LABELREF will have to know how to strip this
2772
     information.  This call might invalidate our local variable
2773
     SYMBOL; we can't use it afterward.  */
2774
 
2775
  targetm.encode_section_info (exp, rtl, true);
2776
 
2777
  desc->rtl = rtl;
2778
 
2779
  return desc;
2780
}
2781
 
2782
/* Return an rtx representing a reference to constant data in memory
2783
   for the constant expression EXP.
2784
 
2785
   If assembler code for such a constant has already been output,
2786
   return an rtx to refer to it.
2787
   Otherwise, output such a constant in memory
2788
   and generate an rtx for it.
2789
 
2790
   If DEFER is nonzero, this constant can be deferred and output only
2791
   if referenced in the function after all optimizations.
2792
 
2793
   `const_desc_table' records which constants already have label strings.  */
2794
 
2795
rtx
2796
output_constant_def (tree exp, int defer)
2797
{
2798
  struct constant_descriptor_tree *desc;
2799
  struct constant_descriptor_tree key;
2800
  void **loc;
2801
 
2802
  /* Look up EXP in the table of constant descriptors.  If we didn't find
2803
     it, create a new one.  */
2804
  key.value = exp;
2805
  key.hash = const_hash_1 (exp);
2806
  loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
2807
 
2808
  desc = *loc;
2809
  if (desc == 0)
2810
    {
2811
      desc = build_constant_desc (exp);
2812
      desc->hash = key.hash;
2813
      *loc = desc;
2814
    }
2815
 
2816
  maybe_output_constant_def_contents (desc, defer);
2817
  return desc->rtl;
2818
}
2819
 
2820
/* Subroutine of output_constant_def: Decide whether or not we need to
2821
   output the constant DESC now, and if so, do it.  */
2822
static void
2823
maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2824
                                    int defer)
2825
{
2826
  rtx symbol = XEXP (desc->rtl, 0);
2827
  tree exp = desc->value;
2828
 
2829
  if (flag_syntax_only)
2830
    return;
2831
 
2832
  if (TREE_ASM_WRITTEN (exp))
2833
    /* Already output; don't do it again.  */
2834
    return;
2835
 
2836
  /* We can always defer constants as long as the context allows
2837
     doing so.  */
2838
  if (defer)
2839
    {
2840
      /* Increment n_deferred_constants if it exists.  It needs to be at
2841
         least as large as the number of constants actually referred to
2842
         by the function.  If it's too small we'll stop looking too early
2843
         and fail to emit constants; if it's too large we'll only look
2844
         through the entire function when we could have stopped earlier.  */
2845
      if (cfun)
2846
        n_deferred_constants++;
2847
      return;
2848
    }
2849
 
2850
  output_constant_def_contents (symbol);
2851
}
2852
 
2853
/* We must output the constant data referred to by SYMBOL; do so.  */
2854
 
2855
static void
2856
output_constant_def_contents (rtx symbol)
2857
{
2858
  tree exp = SYMBOL_REF_DECL (symbol);
2859
  const char *label = XSTR (symbol, 0);
2860
  HOST_WIDE_INT size;
2861
 
2862
  /* Make sure any other constants whose addresses appear in EXP
2863
     are assigned label numbers.  */
2864
  int reloc = compute_reloc_for_constant (exp);
2865
 
2866
  /* Align the location counter as required by EXP's data type.  */
2867
  unsigned int align = TYPE_ALIGN (TREE_TYPE (exp));
2868
#ifdef CONSTANT_ALIGNMENT
2869
  align = CONSTANT_ALIGNMENT (exp, align);
2870
#endif
2871
 
2872
  output_addressed_constants (exp);
2873
 
2874
  /* We are no longer deferring this constant.  */
2875
  TREE_ASM_WRITTEN (exp) = 1;
2876
 
2877
  if (IN_NAMED_SECTION (exp))
2878
    named_section (exp, NULL, reloc);
2879
  else
2880
    targetm.asm_out.select_section (exp, reloc, align);
2881
 
2882
  if (align > BITS_PER_UNIT)
2883
    {
2884
      ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2885
    }
2886
 
2887
  size = int_size_in_bytes (TREE_TYPE (exp));
2888
  if (TREE_CODE (exp) == STRING_CST)
2889
    size = MAX (TREE_STRING_LENGTH (exp), size);
2890
 
2891
  /* Do any machine/system dependent processing of the constant.  */
2892
#ifdef ASM_DECLARE_CONSTANT_NAME
2893
  ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2894
#else
2895
  /* Standard thing is just output label for the constant.  */
2896
  ASM_OUTPUT_LABEL (asm_out_file, label);
2897
#endif /* ASM_DECLARE_CONSTANT_NAME */
2898
 
2899
  /* Output the value of EXP.  */
2900
  output_constant (exp, size, align);
2901
  if (flag_mudflap)
2902
    mudflap_enqueue_constant (exp);
2903
}
2904
 
2905
/* Look up EXP in the table of constant descriptors.  Return the rtl
2906
   if it has been emitted, else null.  */
2907
 
2908
rtx
2909
lookup_constant_def (tree exp)
2910
{
2911
  struct constant_descriptor_tree *desc;
2912
  struct constant_descriptor_tree key;
2913
 
2914
  key.value = exp;
2915
  key.hash = const_hash_1 (exp);
2916
  desc = htab_find_with_hash (const_desc_htab, &key, key.hash);
2917
 
2918
  return (desc ? desc->rtl : NULL_RTX);
2919
}
2920
 
2921
/* Used in the hash tables to avoid outputting the same constant
2922
   twice.  Unlike 'struct constant_descriptor_tree', RTX constants
2923
   are output once per function, not once per file.  */
2924
/* ??? Only a few targets need per-function constant pools.  Most
2925
   can use one per-file pool.  Should add a targetm bit to tell the
2926
   difference.  */
2927
 
2928
struct rtx_constant_pool GTY(())
2929
{
2930
  /* Pointers to first and last constant in pool, as ordered by offset.  */
2931
  struct constant_descriptor_rtx *first;
2932
  struct constant_descriptor_rtx *last;
2933
 
2934
  /* Hash facility for making memory-constants from constant rtl-expressions.
2935
     It is used on RISC machines where immediate integer arguments and
2936
     constant addresses are restricted so that such constants must be stored
2937
     in memory.  */
2938
  htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2939
  htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2940
 
2941
  /* Current offset in constant pool (does not include any
2942
     machine-specific header).  */
2943
  HOST_WIDE_INT offset;
2944
};
2945
 
2946
struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
2947
{
2948
  struct constant_descriptor_rtx *next;
2949
  rtx mem;
2950
  rtx sym;
2951
  rtx constant;
2952
  HOST_WIDE_INT offset;
2953
  hashval_t hash;
2954
  enum machine_mode mode;
2955
  unsigned int align;
2956
  int labelno;
2957
  int mark;
2958
};
2959
 
2960
/* Hash and compare functions for const_rtx_htab.  */
2961
 
2962
static hashval_t
2963
const_desc_rtx_hash (const void *ptr)
2964
{
2965
  const struct constant_descriptor_rtx *desc = ptr;
2966
  return desc->hash;
2967
}
2968
 
2969
static int
2970
const_desc_rtx_eq (const void *a, const void *b)
2971
{
2972
  const struct constant_descriptor_rtx *x = a;
2973
  const struct constant_descriptor_rtx *y = b;
2974
 
2975
  if (x->mode != y->mode)
2976
    return 0;
2977
  return rtx_equal_p (x->constant, y->constant);
2978
}
2979
 
2980
/* Hash and compare functions for const_rtx_sym_htab.  */
2981
 
2982
static hashval_t
2983
const_desc_rtx_sym_hash (const void *ptr)
2984
{
2985
  const struct constant_descriptor_rtx *desc = ptr;
2986
  return htab_hash_string (XSTR (desc->sym, 0));
2987
}
2988
 
2989
static int
2990
const_desc_rtx_sym_eq (const void *a, const void *b)
2991
{
2992
  const struct constant_descriptor_rtx *x = a;
2993
  const struct constant_descriptor_rtx *y = b;
2994
  return XSTR (x->sym, 0) == XSTR (y->sym, 0);
2995
}
2996
 
2997
/* This is the worker function for const_rtx_hash, called via for_each_rtx.  */
2998
 
2999
static int
3000
const_rtx_hash_1 (rtx *xp, void *data)
3001
{
3002
  unsigned HOST_WIDE_INT hwi;
3003
  enum machine_mode mode;
3004
  enum rtx_code code;
3005
  hashval_t h, *hp;
3006
  rtx x;
3007
 
3008
  x = *xp;
3009
  code = GET_CODE (x);
3010
  mode = GET_MODE (x);
3011
  h = (hashval_t) code * 1048573 + mode;
3012
 
3013
  switch (code)
3014
    {
3015
    case CONST_INT:
3016
      hwi = INTVAL (x);
3017
    fold_hwi:
3018
      {
3019
        const int shift = sizeof (hashval_t) * CHAR_BIT;
3020
        const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3021
        int i;
3022
 
3023
        h ^= (hashval_t) hwi;
3024
        for (i = 1; i < n; ++i)
3025
          {
3026
            hwi >>= shift;
3027
            h ^= (hashval_t) hwi;
3028
          }
3029
      }
3030
      break;
3031
 
3032
    case CONST_DOUBLE:
3033
      if (mode == VOIDmode)
3034
        {
3035
          hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3036
          goto fold_hwi;
3037
        }
3038
      else
3039
        h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
3040
      break;
3041
 
3042
    case CONST_VECTOR:
3043
      {
3044
        int i;
3045
        for (i = XVECLEN (x, 0); i-- > 0; )
3046
          h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
3047
      }
3048
      break;
3049
 
3050
    case SYMBOL_REF:
3051
      h ^= htab_hash_string (XSTR (x, 0));
3052
      break;
3053
 
3054
    case LABEL_REF:
3055
      h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
3056
      break;
3057
 
3058
    case UNSPEC:
3059
    case UNSPEC_VOLATILE:
3060
      h = h * 251 + XINT (x, 1);
3061
      break;
3062
 
3063
    default:
3064
      break;
3065
    }
3066
 
3067
  hp = data;
3068
  *hp = *hp * 509 + h;
3069
  return 0;
3070
}
3071
 
3072
/* Compute a hash value for X, which should be a constant.  */
3073
 
3074
static hashval_t
3075
const_rtx_hash (rtx x)
3076
{
3077
  hashval_t h = 0;
3078
  for_each_rtx (&x, const_rtx_hash_1, &h);
3079
  return h;
3080
}
3081
 
3082
 
3083
/* Initialize constant pool hashing for a new function.  */
3084
 
3085
void
3086
init_varasm_status (struct function *f)
3087
{
3088
  struct varasm_status *p;
3089
  struct rtx_constant_pool *pool;
3090
 
3091
  p = ggc_alloc (sizeof (struct varasm_status));
3092
  f->varasm = p;
3093
 
3094
  pool = ggc_alloc (sizeof (struct rtx_constant_pool));
3095
  p->pool = pool;
3096
  p->deferred_constants = 0;
3097
 
3098
  pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3099
                                          const_desc_rtx_eq, NULL);
3100
  pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
3101
                                              const_desc_rtx_sym_eq, NULL);
3102
  pool->first = pool->last = NULL;
3103
  pool->offset = 0;
3104
}
3105
 
3106
/* Given a MINUS expression, simplify it if both sides
3107
   include the same symbol.  */
3108
 
3109
rtx
3110
simplify_subtraction (rtx x)
3111
{
3112
  rtx r = simplify_rtx (x);
3113
  return r ? r : x;
3114
}
3115
 
3116
/* Given a constant rtx X, make (or find) a memory constant for its value
3117
   and return a MEM rtx to refer to it in memory.  */
3118
 
3119
rtx
3120
force_const_mem (enum machine_mode mode, rtx x)
3121
{
3122
  struct constant_descriptor_rtx *desc, tmp;
3123
  struct rtx_constant_pool *pool = cfun->varasm->pool;
3124
  char label[256];
3125
  rtx def, symbol;
3126
  hashval_t hash;
3127
  unsigned int align;
3128
  void **slot;
3129
 
3130
  /* If we're not allowed to drop X into the constant pool, don't.  */
3131
  if (targetm.cannot_force_const_mem (x))
3132
    return NULL_RTX;
3133
 
3134
  /* Lookup the value in the hashtable.  */
3135
  tmp.constant = x;
3136
  tmp.mode = mode;
3137
  hash = const_rtx_hash (x);
3138
  slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3139
  desc = *slot;
3140
 
3141
  /* If the constant was already present, return its memory.  */
3142
  if (desc)
3143
    return copy_rtx (desc->mem);
3144
 
3145
  /* Otherwise, create a new descriptor.  */
3146
  desc = ggc_alloc (sizeof (*desc));
3147
  *slot = desc;
3148
 
3149
  /* Align the location counter as required by EXP's data type.  */
3150
  align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3151
#ifdef CONSTANT_ALIGNMENT
3152
  {
3153
    tree type = lang_hooks.types.type_for_mode (mode, 0);
3154
    if (type != NULL_TREE)
3155
      align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3156
  }
3157
#endif
3158
 
3159
  pool->offset += (align / BITS_PER_UNIT) - 1;
3160
  pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3161
 
3162
  desc->next = NULL;
3163
  desc->constant = tmp.constant;
3164
  desc->offset = pool->offset;
3165
  desc->hash = hash;
3166
  desc->mode = mode;
3167
  desc->align = align;
3168
  desc->labelno = const_labelno;
3169
  desc->mark = 0;
3170
 
3171
  pool->offset += GET_MODE_SIZE (mode);
3172
  if (pool->last)
3173
    pool->last->next = desc;
3174
  else
3175
    pool->first = pool->last = desc;
3176
  pool->last = desc;
3177
 
3178
  /* Create a string containing the label name, in LABEL.  */
3179
  ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3180
  ++const_labelno;
3181
 
3182
  /* Construct the SYMBOL_REF.  Make sure to mark it as belonging to
3183
     the constants pool.  */
3184
  desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3185
  SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3186
  CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3187
  current_function_uses_const_pool = 1;
3188
 
3189
  /* Insert the descriptor into the symbol cross-reference table too.  */
3190
  slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
3191
  gcc_assert (!*slot);
3192
  *slot = desc;
3193
 
3194
  /* Construct the MEM.  */
3195
  desc->mem = def = gen_const_mem (mode, symbol);
3196
  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
3197
  set_mem_align (def, align);
3198
 
3199
  /* If we're dropping a label to the constant pool, make sure we
3200
     don't delete it.  */
3201
  if (GET_CODE (x) == LABEL_REF)
3202
    LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3203
 
3204
  return copy_rtx (def);
3205
}
3206
 
3207
/* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3208
   the corresponding constant_descriptor_rtx structure.  */
3209
 
3210
static struct constant_descriptor_rtx *
3211
find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
3212
{
3213
  struct constant_descriptor_rtx tmp;
3214
  tmp.sym = sym;
3215
  return htab_find (pool->const_rtx_sym_htab, &tmp);
3216
}
3217
 
3218
/* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3219
 
3220
rtx
3221
get_pool_constant (rtx addr)
3222
{
3223
  return find_pool_constant (cfun->varasm->pool, addr)->constant;
3224
}
3225
 
3226
/* Given a constant pool SYMBOL_REF, return the corresponding constant
3227
   and whether it has been output or not.  */
3228
 
3229
rtx
3230
get_pool_constant_mark (rtx addr, bool *pmarked)
3231
{
3232
  struct constant_descriptor_rtx *desc;
3233
 
3234
  desc = find_pool_constant (cfun->varasm->pool, addr);
3235
  *pmarked = (desc->mark != 0);
3236
  return desc->constant;
3237
}
3238
 
3239
/* Likewise, but for the constant pool of a specific function.  */
3240
 
3241
rtx
3242
get_pool_constant_for_function (struct function *f, rtx addr)
3243
{
3244
  return find_pool_constant (f->varasm->pool, addr)->constant;
3245
}
3246
 
3247
/* Similar, return the mode.  */
3248
 
3249
enum machine_mode
3250
get_pool_mode (rtx addr)
3251
{
3252
  return find_pool_constant (cfun->varasm->pool, addr)->mode;
3253
}
3254
 
3255
/* Return the size of the constant pool.  */
3256
 
3257
int
3258
get_pool_size (void)
3259
{
3260
  return cfun->varasm->pool->offset;
3261
}
3262
 
3263
/* Worker function for output_constant_pool_1.  Emit assembly for X
3264
   in MODE with known alignment ALIGN.  */
3265
 
3266
static void
3267
output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
3268
{
3269
  switch (GET_MODE_CLASS (mode))
3270
    {
3271
    case MODE_FLOAT:
3272
      {
3273
        REAL_VALUE_TYPE r;
3274
 
3275
        gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3276
        REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3277
        assemble_real (r, mode, align);
3278
        break;
3279
      }
3280
 
3281
    case MODE_INT:
3282
    case MODE_PARTIAL_INT:
3283
      assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3284
      break;
3285
 
3286
    case MODE_VECTOR_FLOAT:
3287
    case MODE_VECTOR_INT:
3288
      {
3289
        int i, units;
3290
        enum machine_mode submode = GET_MODE_INNER (mode);
3291
        unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3292
 
3293
        gcc_assert (GET_CODE (x) == CONST_VECTOR);
3294
        units = CONST_VECTOR_NUNITS (x);
3295
 
3296
        for (i = 0; i < units; i++)
3297
          {
3298
            rtx elt = CONST_VECTOR_ELT (x, i);
3299
            output_constant_pool_2 (submode, elt, i ? subalign : align);
3300
          }
3301
      }
3302
      break;
3303
 
3304
    default:
3305
      gcc_unreachable ();
3306
    }
3307
}
3308
 
3309
/* Worker function for output_constant_pool.  Emit POOL.  */
3310
 
3311
static void
3312
output_constant_pool_1 (struct constant_descriptor_rtx *desc)
3313
{
3314
  rtx x, tmp;
3315
 
3316
  if (!desc->mark)
3317
    return;
3318
  x = desc->constant;
3319
 
3320
  /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3321
     whose CODE_LABEL has been deleted.  This can occur if a jump table
3322
     is eliminated by optimization.  If so, write a constant of zero
3323
     instead.  Note that this can also happen by turning the
3324
     CODE_LABEL into a NOTE.  */
3325
  /* ??? This seems completely and utterly wrong.  Certainly it's
3326
     not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3327
     functioning even with INSN_DELETED_P and friends.  */
3328
 
3329
  tmp = x;
3330
  switch (GET_CODE (x))
3331
    {
3332
    case CONST:
3333
      if (GET_CODE (XEXP (x, 0)) != PLUS
3334
          || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3335
        break;
3336
      tmp = XEXP (XEXP (x, 0), 0);
3337
      /* FALLTHRU  */
3338
 
3339
    case LABEL_REF:
3340
      tmp = XEXP (x, 0);
3341
      gcc_assert (!INSN_DELETED_P (tmp));
3342
      gcc_assert (!NOTE_P (tmp)
3343
                  || NOTE_LINE_NUMBER (tmp) != NOTE_INSN_DELETED);
3344
      break;
3345
 
3346
    default:
3347
      break;
3348
    }
3349
 
3350
  /* First switch to correct section.  */
3351
  targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
3352
 
3353
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3354
  ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3355
                                 desc->align, desc->labelno, done);
3356
#endif
3357
 
3358
  assemble_align (desc->align);
3359
 
3360
  /* Output the label.  */
3361
  targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3362
 
3363
  /* Output the data.  */
3364
  output_constant_pool_2 (desc->mode, x, desc->align);
3365
 
3366
  /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3367
     sections have proper size.  */
3368
  if (desc->align > GET_MODE_BITSIZE (desc->mode)
3369
      && in_section == in_named
3370
      && get_named_section_flags (in_named_name) & SECTION_MERGE)
3371
    assemble_align (desc->align);
3372
 
3373
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3374
 done:
3375
#endif
3376
  return;
3377
}
3378
 
3379
/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3380
   to as used.  Emit referenced deferred strings.  This function can
3381
   be used with for_each_rtx to mark all SYMBOL_REFs in an rtx.  */
3382
 
3383
static int
3384
mark_constant (rtx *current_rtx, void *data)
3385
{
3386
  struct rtx_constant_pool *pool = data;
3387
  rtx x = *current_rtx;
3388
 
3389
  if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3390
    return 0;
3391
 
3392
  if (CONSTANT_POOL_ADDRESS_P (x))
3393
    {
3394
      struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3395
      if (desc->mark == 0)
3396
        {
3397
          desc->mark = 1;
3398
          for_each_rtx (&desc->constant, mark_constant, pool);
3399
        }
3400
    }
3401
  else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3402
    {
3403
      tree exp = SYMBOL_REF_DECL (x);
3404
      if (!TREE_ASM_WRITTEN (exp))
3405
        {
3406
          n_deferred_constants--;
3407
          output_constant_def_contents (x);
3408
        }
3409
    }
3410
 
3411
  return -1;
3412
}
3413
 
3414
/* Look through appropriate parts of INSN, marking all entries in the
3415
   constant pool which are actually being used.  Entries that are only
3416
   referenced by other constants are also marked as used.  Emit
3417
   deferred strings that are used.  */
3418
 
3419
static void
3420
mark_constants (struct rtx_constant_pool *pool, rtx insn)
3421
{
3422
  if (!INSN_P (insn))
3423
    return;
3424
 
3425
  /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3426
     insns, not any notes that may be attached.  We don't want to mark
3427
     a constant just because it happens to appear in a REG_EQUIV note.  */
3428
  if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3429
    {
3430
      rtx seq = PATTERN (insn);
3431
      int i, n = XVECLEN (seq, 0);
3432
      for (i = 0; i < n; ++i)
3433
        {
3434
          rtx subinsn = XVECEXP (seq, 0, i);
3435
          if (INSN_P (subinsn))
3436
            for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3437
        }
3438
    }
3439
  else
3440
    for_each_rtx (&PATTERN (insn), mark_constant, pool);
3441
}
3442
 
3443
/* Look through the instructions for this function, and mark all the
3444
   entries in POOL which are actually being used.  Emit deferred constants
3445
   which have indeed been used.  */
3446
 
3447
static void
3448
mark_constant_pool (struct rtx_constant_pool *pool)
3449
{
3450
  rtx insn, link;
3451
 
3452
  if (pool->first == 0 && n_deferred_constants == 0)
3453
    return;
3454
 
3455
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3456
    mark_constants (pool, insn);
3457
 
3458
  for (link = current_function_epilogue_delay_list;
3459
       link;
3460
       link = XEXP (link, 1))
3461
    mark_constants (pool, XEXP (link, 0));
3462
}
3463
 
3464
/* Write all the constants in the constant pool.  */
3465
 
3466
void
3467
output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3468
                      tree fndecl ATTRIBUTE_UNUSED)
3469
{
3470
  struct rtx_constant_pool *pool = cfun->varasm->pool;
3471
  struct constant_descriptor_rtx *desc;
3472
 
3473
  /* It is possible for gcc to call force_const_mem and then to later
3474
     discard the instructions which refer to the constant.  In such a
3475
     case we do not need to output the constant.  */
3476
  mark_constant_pool (pool);
3477
 
3478
#ifdef ASM_OUTPUT_POOL_PROLOGUE
3479
  ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3480
#endif
3481
 
3482
  for (desc = pool->first; desc ; desc = desc->next)
3483
    output_constant_pool_1 (desc);
3484
 
3485
#ifdef ASM_OUTPUT_POOL_EPILOGUE
3486
  ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3487
#endif
3488
}
3489
 
3490
/* Determine what kind of relocations EXP may need.  */
3491
 
3492
int
3493
compute_reloc_for_constant (tree exp)
3494
{
3495
  int reloc = 0, reloc2;
3496
  tree tem;
3497
 
3498
  /* Give the front-end a chance to convert VALUE to something that
3499
     looks more like a constant to the back-end.  */
3500
  exp = lang_hooks.expand_constant (exp);
3501
 
3502
  switch (TREE_CODE (exp))
3503
    {
3504
    case ADDR_EXPR:
3505
    case FDESC_EXPR:
3506
      /* Go inside any operations that get_inner_reference can handle and see
3507
         if what's inside is a constant: no need to do anything here for
3508
         addresses of variables or functions.  */
3509
      for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3510
           tem = TREE_OPERAND (tem, 0))
3511
        ;
3512
 
3513
      if (TREE_PUBLIC (tem))
3514
        reloc |= 2;
3515
      else
3516
        reloc |= 1;
3517
      break;
3518
 
3519
    case PLUS_EXPR:
3520
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3521
      reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3522
      break;
3523
 
3524
    case MINUS_EXPR:
3525
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3526
      reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3527
      /* The difference of two local labels is computable at link time.  */
3528
      if (reloc == 1 && reloc2 == 1)
3529
        reloc = 0;
3530
      else
3531
        reloc |= reloc2;
3532
      break;
3533
 
3534
    case NOP_EXPR:
3535
    case CONVERT_EXPR:
3536
    case NON_LVALUE_EXPR:
3537
    case VIEW_CONVERT_EXPR:
3538
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3539
      break;
3540
 
3541
    case CONSTRUCTOR:
3542
      {
3543
        unsigned HOST_WIDE_INT idx;
3544
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3545
          if (tem != 0)
3546
            reloc |= compute_reloc_for_constant (tem);
3547
      }
3548
      break;
3549
 
3550
    default:
3551
      break;
3552
    }
3553
  return reloc;
3554
}
3555
 
3556
/* Find all the constants whose addresses are referenced inside of EXP,
3557
   and make sure assembler code with a label has been output for each one.
3558
   Indicate whether an ADDR_EXPR has been encountered.  */
3559
 
3560
static void
3561
output_addressed_constants (tree exp)
3562
{
3563
  tree tem;
3564
 
3565
  /* Give the front-end a chance to convert VALUE to something that
3566
     looks more like a constant to the back-end.  */
3567
  exp = lang_hooks.expand_constant (exp);
3568
 
3569
  switch (TREE_CODE (exp))
3570
    {
3571
    case ADDR_EXPR:
3572
    case FDESC_EXPR:
3573
      /* Go inside any operations that get_inner_reference can handle and see
3574
         if what's inside is a constant: no need to do anything here for
3575
         addresses of variables or functions.  */
3576
      for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3577
           tem = TREE_OPERAND (tem, 0))
3578
        ;
3579
 
3580
      /* If we have an initialized CONST_DECL, retrieve the initializer.  */
3581
      if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3582
        tem = DECL_INITIAL (tem);
3583
 
3584
      if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
3585
        output_constant_def (tem, 0);
3586
      break;
3587
 
3588
    case PLUS_EXPR:
3589
    case MINUS_EXPR:
3590
      output_addressed_constants (TREE_OPERAND (exp, 1));
3591
      /* Fall through.  */
3592
 
3593
    case NOP_EXPR:
3594
    case CONVERT_EXPR:
3595
    case NON_LVALUE_EXPR:
3596
    case VIEW_CONVERT_EXPR:
3597
      output_addressed_constants (TREE_OPERAND (exp, 0));
3598
      break;
3599
 
3600
    case CONSTRUCTOR:
3601
      {
3602
        unsigned HOST_WIDE_INT idx;
3603
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3604
          if (tem != 0)
3605
            output_addressed_constants (tem);
3606
      }
3607
      break;
3608
 
3609
    default:
3610
      break;
3611
    }
3612
}
3613
 
3614
/* Return nonzero if VALUE is a valid constant-valued expression
3615
   for use in initializing a static variable; one that can be an
3616
   element of a "constant" initializer.
3617
 
3618
   Return null_pointer_node if the value is absolute;
3619
   if it is relocatable, return the variable that determines the relocation.
3620
   We assume that VALUE has been folded as much as possible;
3621
   therefore, we do not need to check for such things as
3622
   arithmetic-combinations of integers.  */
3623
 
3624
tree
3625
initializer_constant_valid_p (tree value, tree endtype)
3626
{
3627
  /* Give the front-end a chance to convert VALUE to something that
3628
     looks more like a constant to the back-end.  */
3629
  value = lang_hooks.expand_constant (value);
3630
 
3631
  switch (TREE_CODE (value))
3632
    {
3633
    case CONSTRUCTOR:
3634
      if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3635
           || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3636
          && TREE_CONSTANT (value)
3637
          && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
3638
        {
3639
          unsigned HOST_WIDE_INT idx;
3640
          tree elt;
3641
          bool absolute = true;
3642
 
3643
          FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
3644
            {
3645
              tree reloc;
3646
              reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt));
3647
              if (!reloc)
3648
                return NULL_TREE;
3649
              if (reloc != null_pointer_node)
3650
                absolute = false;
3651
            }
3652
          /* For a non-absolute relocation, there is no single
3653
             variable that can be "the variable that determines the
3654
             relocation."  */
3655
          return absolute ? null_pointer_node : error_mark_node;
3656
        }
3657
 
3658
      return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3659
 
3660
    case INTEGER_CST:
3661
    case VECTOR_CST:
3662
    case REAL_CST:
3663
    case STRING_CST:
3664
    case COMPLEX_CST:
3665
      return null_pointer_node;
3666
 
3667
    case ADDR_EXPR:
3668
    case FDESC_EXPR:
3669
      value = staticp (TREE_OPERAND (value, 0));
3670
      if (value)
3671
        {
3672
          /* "&(*a).f" is like unto pointer arithmetic.  If "a" turns out to
3673
             be a constant, this is old-skool offsetof-like nonsense.  */
3674
          if (TREE_CODE (value) == INDIRECT_REF
3675
              && TREE_CONSTANT (TREE_OPERAND (value, 0)))
3676
            return null_pointer_node;
3677
          /* Taking the address of a nested function involves a trampoline.  */
3678
          if (TREE_CODE (value) == FUNCTION_DECL
3679
              && ((decl_function_context (value)
3680
                   && !DECL_NO_STATIC_CHAIN (value))
3681
                  || DECL_DLLIMPORT_P (value)))
3682
            return NULL_TREE;
3683
          /* "&{...}" requires a temporary to hold the constructed
3684
             object.  */
3685
          if (TREE_CODE (value) == CONSTRUCTOR)
3686
            return NULL_TREE;
3687
        }
3688
      return value;
3689
 
3690
    case VIEW_CONVERT_EXPR:
3691
    case NON_LVALUE_EXPR:
3692
      return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3693
 
3694
    case CONVERT_EXPR:
3695
    case NOP_EXPR:
3696
      {
3697
        tree src;
3698
        tree src_type;
3699
        tree dest_type;
3700
 
3701
        src = TREE_OPERAND (value, 0);
3702
        src_type = TREE_TYPE (src);
3703
        dest_type = TREE_TYPE (value);
3704
 
3705
        /* Allow conversions between pointer types, floating-point
3706
           types, and offset types.  */
3707
        if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
3708
            || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
3709
            || (TREE_CODE (dest_type) == OFFSET_TYPE
3710
                && TREE_CODE (src_type) == OFFSET_TYPE))
3711
          return initializer_constant_valid_p (src, endtype);
3712
 
3713
        /* Allow length-preserving conversions between integer types.  */
3714
        if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
3715
            && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
3716
          return initializer_constant_valid_p (src, endtype);
3717
 
3718
        /* Allow conversions between other integer types only if
3719
           explicit value.  */
3720
        if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
3721
          {
3722
            tree inner = initializer_constant_valid_p (src, endtype);
3723
            if (inner == null_pointer_node)
3724
              return null_pointer_node;
3725
            break;
3726
          }
3727
 
3728
        /* Allow (int) &foo provided int is as wide as a pointer.  */
3729
        if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
3730
            && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
3731
          return initializer_constant_valid_p (src, endtype);
3732
 
3733
        /* Likewise conversions from int to pointers, but also allow
3734
           conversions from 0.  */
3735
        if ((POINTER_TYPE_P (dest_type)
3736
             || TREE_CODE (dest_type) == OFFSET_TYPE)
3737
            && INTEGRAL_TYPE_P (src_type))
3738
          {
3739
            if (integer_zerop (src))
3740
              return null_pointer_node;
3741
            else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
3742
              return initializer_constant_valid_p (src, endtype);
3743
          }
3744
 
3745
        /* Allow conversions to struct or union types if the value
3746
           inside is okay.  */
3747
        if (TREE_CODE (dest_type) == RECORD_TYPE
3748
            || TREE_CODE (dest_type) == UNION_TYPE)
3749
          return initializer_constant_valid_p (src, endtype);
3750
      }
3751
      break;
3752
 
3753
    case PLUS_EXPR:
3754
      if (! INTEGRAL_TYPE_P (endtype)
3755
          || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3756
        {
3757
          tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3758
                                                      endtype);
3759
          tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3760
                                                      endtype);
3761
          /* If either term is absolute, use the other terms relocation.  */
3762
          if (valid0 == null_pointer_node)
3763
            return valid1;
3764
          if (valid1 == null_pointer_node)
3765
            return valid0;
3766
        }
3767
      break;
3768
 
3769
    case MINUS_EXPR:
3770
      if (! INTEGRAL_TYPE_P (endtype)
3771
          || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3772
        {
3773
          tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3774
                                                      endtype);
3775
          tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3776
                                                      endtype);
3777
          /* Win if second argument is absolute.  */
3778
          if (valid1 == null_pointer_node)
3779
            return valid0;
3780
          /* Win if both arguments have the same relocation.
3781
             Then the value is absolute.  */
3782
          if (valid0 == valid1 && valid0 != 0)
3783
            return null_pointer_node;
3784
 
3785
          /* Since GCC guarantees that string constants are unique in the
3786
             generated code, a subtraction between two copies of the same
3787
             constant string is absolute.  */
3788
          if (valid0 && TREE_CODE (valid0) == STRING_CST
3789
              && valid1 && TREE_CODE (valid1) == STRING_CST
3790
              && operand_equal_p (valid0, valid1, 1))
3791
            return null_pointer_node;
3792
        }
3793
 
3794
      /* Support narrowing differences.  */
3795
      if (INTEGRAL_TYPE_P (endtype))
3796
        {
3797
          tree op0, op1;
3798
 
3799
          op0 = TREE_OPERAND (value, 0);
3800
          op1 = TREE_OPERAND (value, 1);
3801
 
3802
          /* Like STRIP_NOPS except allow the operand mode to widen.
3803
             This works around a feature of fold that simplifies
3804
             (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3805
             that the narrower operation is cheaper.  */
3806
 
3807
          while (TREE_CODE (op0) == NOP_EXPR
3808
                 || TREE_CODE (op0) == CONVERT_EXPR
3809
                 || TREE_CODE (op0) == NON_LVALUE_EXPR)
3810
            {
3811
              tree inner = TREE_OPERAND (op0, 0);
3812
              if (inner == error_mark_node
3813
                  || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3814
                  || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3815
                      > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3816
                break;
3817
              op0 = inner;
3818
            }
3819
 
3820
          while (TREE_CODE (op1) == NOP_EXPR
3821
                 || TREE_CODE (op1) == CONVERT_EXPR
3822
                 || TREE_CODE (op1) == NON_LVALUE_EXPR)
3823
            {
3824
              tree inner = TREE_OPERAND (op1, 0);
3825
              if (inner == error_mark_node
3826
                  || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3827
                  || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3828
                      > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3829
                break;
3830
              op1 = inner;
3831
            }
3832
 
3833
          op0 = initializer_constant_valid_p (op0, endtype);
3834
          op1 = initializer_constant_valid_p (op1, endtype);
3835
 
3836
          /* Both initializers must be known.  */
3837
          if (op0 && op1)
3838
            {
3839
              if (op0 == op1)
3840
                return null_pointer_node;
3841
 
3842
              /* Support differences between labels.  */
3843
              if (TREE_CODE (op0) == LABEL_DECL
3844
                  && TREE_CODE (op1) == LABEL_DECL)
3845
                return null_pointer_node;
3846
 
3847
              if (TREE_CODE (op0) == STRING_CST
3848
                  && TREE_CODE (op1) == STRING_CST
3849
                  && operand_equal_p (op0, op1, 1))
3850
                return null_pointer_node;
3851
            }
3852
        }
3853
      break;
3854
 
3855
    default:
3856
      break;
3857
    }
3858
 
3859
  return 0;
3860
}
3861
 
3862
/* Output assembler code for constant EXP to FILE, with no label.
3863
   This includes the pseudo-op such as ".int" or ".byte", and a newline.
3864
   Assumes output_addressed_constants has been done on EXP already.
3865
 
3866
   Generate exactly SIZE bytes of assembler data, padding at the end
3867
   with zeros if necessary.  SIZE must always be specified.
3868
 
3869
   SIZE is important for structure constructors,
3870
   since trailing members may have been omitted from the constructor.
3871
   It is also important for initialization of arrays from string constants
3872
   since the full length of the string constant might not be wanted.
3873
   It is also needed for initialization of unions, where the initializer's
3874
   type is just one member, and that may not be as long as the union.
3875
 
3876
   There a case in which we would fail to output exactly SIZE bytes:
3877
   for a structure constructor that wants to produce more than SIZE bytes.
3878
   But such constructors will never be generated for any possible input.
3879
 
3880
   ALIGN is the alignment of the data in bits.  */
3881
 
3882
void
3883
output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3884
{
3885
  enum tree_code code;
3886
  unsigned HOST_WIDE_INT thissize;
3887
 
3888
  /* Some front-ends use constants other than the standard language-independent
3889
     varieties, but which may still be output directly.  Give the front-end a
3890
     chance to convert EXP to a language-independent representation.  */
3891
  exp = lang_hooks.expand_constant (exp);
3892
 
3893
  if (size == 0 || flag_syntax_only)
3894
    return;
3895
 
3896
  /* See if we're trying to initialize a pointer in a non-default mode
3897
     to the address of some declaration somewhere.  If the target says
3898
     the mode is valid for pointers, assume the target has a way of
3899
     resolving it.  */
3900
  if (TREE_CODE (exp) == NOP_EXPR
3901
      && POINTER_TYPE_P (TREE_TYPE (exp))
3902
      && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
3903
    {
3904
      tree saved_type = TREE_TYPE (exp);
3905
 
3906
      /* Peel off any intermediate conversions-to-pointer for valid
3907
         pointer modes.  */
3908
      while (TREE_CODE (exp) == NOP_EXPR
3909
             && POINTER_TYPE_P (TREE_TYPE (exp))
3910
             && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
3911
        exp = TREE_OPERAND (exp, 0);
3912
 
3913
      /* If what we're left with is the address of something, we can
3914
         convert the address to the final type and output it that
3915
         way.  */
3916
      if (TREE_CODE (exp) == ADDR_EXPR)
3917
        exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
3918
    }
3919
 
3920
  /* Eliminate any conversions since we'll be outputting the underlying
3921
     constant.  */
3922
  while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3923
         || TREE_CODE (exp) == NON_LVALUE_EXPR
3924
         || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3925
    {
3926
      HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
3927
      HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
3928
 
3929
      /* Make sure eliminating the conversion is really a no-op, except with
3930
         VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
3931
         union types to allow for Ada unchecked unions.  */
3932
      if (type_size > op_size
3933
          && TREE_CODE (exp) != VIEW_CONVERT_EXPR
3934
          && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
3935
        internal_error ("no-op convert from %wd to %wd bytes in initializer",
3936
                        op_size, type_size);
3937
 
3938
      exp = TREE_OPERAND (exp, 0);
3939
    }
3940
 
3941
  code = TREE_CODE (TREE_TYPE (exp));
3942
  thissize = int_size_in_bytes (TREE_TYPE (exp));
3943
 
3944
  /* Allow a constructor with no elements for any data type.
3945
     This means to fill the space with zeros.  */
3946
  if (TREE_CODE (exp) == CONSTRUCTOR
3947
      && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp)))
3948
    {
3949
      assemble_zeros (size);
3950
      return;
3951
    }
3952
 
3953
  if (TREE_CODE (exp) == FDESC_EXPR)
3954
    {
3955
#ifdef ASM_OUTPUT_FDESC
3956
      HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3957
      tree decl = TREE_OPERAND (exp, 0);
3958
      ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3959
#else
3960
      gcc_unreachable ();
3961
#endif
3962
      return;
3963
    }
3964
 
3965
  /* Now output the underlying data.  If we've handling the padding, return.
3966
     Otherwise, break and ensure SIZE is the size written.  */
3967
  switch (code)
3968
    {
3969
    case CHAR_TYPE:
3970
    case BOOLEAN_TYPE:
3971
    case INTEGER_TYPE:
3972
    case ENUMERAL_TYPE:
3973
    case POINTER_TYPE:
3974
    case REFERENCE_TYPE:
3975
    case OFFSET_TYPE:
3976
      if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3977
                                           EXPAND_INITIALIZER),
3978
                              MIN (size, thissize), align, 0))
3979
        error ("initializer for integer value is too complicated");
3980
      break;
3981
 
3982
    case REAL_TYPE:
3983
      if (TREE_CODE (exp) != REAL_CST)
3984
        error ("initializer for floating value is not a floating constant");
3985
 
3986
      assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3987
      break;
3988
 
3989
    case COMPLEX_TYPE:
3990
      output_constant (TREE_REALPART (exp), thissize / 2, align);
3991
      output_constant (TREE_IMAGPART (exp), thissize / 2,
3992
                       min_align (align, BITS_PER_UNIT * (thissize / 2)));
3993
      break;
3994
 
3995
    case ARRAY_TYPE:
3996
    case VECTOR_TYPE:
3997
      switch (TREE_CODE (exp))
3998
        {
3999
        case CONSTRUCTOR:
4000
          output_constructor (exp, size, align);
4001
          return;
4002
        case STRING_CST:
4003
          thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
4004
                          size);
4005
          assemble_string (TREE_STRING_POINTER (exp), thissize);
4006
          break;
4007
 
4008
        case VECTOR_CST:
4009
          {
4010
            int elt_size;
4011
            tree link;
4012
            unsigned int nalign;
4013
            enum machine_mode inner;
4014
 
4015
            inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4016
            nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
4017
 
4018
            elt_size = GET_MODE_SIZE (inner);
4019
 
4020
            link = TREE_VECTOR_CST_ELTS (exp);
4021
            output_constant (TREE_VALUE (link), elt_size, align);
4022
            while ((link = TREE_CHAIN (link)) != NULL)
4023
              output_constant (TREE_VALUE (link), elt_size, nalign);
4024
            break;
4025
          }
4026
        default:
4027
          gcc_unreachable ();
4028
        }
4029
      break;
4030
 
4031
    case RECORD_TYPE:
4032
    case UNION_TYPE:
4033
      gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4034
      output_constructor (exp, size, align);
4035
      return;
4036
 
4037
    case ERROR_MARK:
4038
      return;
4039
 
4040
    default:
4041
      gcc_unreachable ();
4042
    }
4043
 
4044
  if (size > thissize)
4045
    assemble_zeros (size - thissize);
4046
}
4047
 
4048
 
4049
/* Subroutine of output_constructor, used for computing the size of
4050
   arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
4051
   type with an unspecified upper bound.  */
4052
 
4053
static unsigned HOST_WIDE_INT
4054
array_size_for_constructor (tree val)
4055
{
4056
  tree max_index, i;
4057
  unsigned HOST_WIDE_INT cnt;
4058
  tree index, value;
4059
 
4060
  /* This code used to attempt to handle string constants that are not
4061
     arrays of single-bytes, but nothing else does, so there's no point in
4062
     doing it here.  */
4063
  if (TREE_CODE (val) == STRING_CST)
4064
    return TREE_STRING_LENGTH (val);
4065
 
4066
  max_index = NULL_TREE;
4067
  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
4068
    {
4069
      if (TREE_CODE (index) == RANGE_EXPR)
4070
        index = TREE_OPERAND (index, 1);
4071
      if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4072
        max_index = index;
4073
    }
4074
 
4075
  if (max_index == NULL_TREE)
4076
    return 0;
4077
 
4078
  /* Compute the total number of array elements.  */
4079
  i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
4080
                  convert (sizetype,
4081
                           TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
4082
  i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
4083
 
4084
  /* Multiply by the array element unit size to find number of bytes.  */
4085
  i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
4086
 
4087
  return tree_low_cst (i, 1);
4088
}
4089
 
4090
/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
4091
   Generate at least SIZE bytes, padding if necessary.  */
4092
 
4093
static void
4094
output_constructor (tree exp, unsigned HOST_WIDE_INT size,
4095
                    unsigned int align)
4096
{
4097
  tree type = TREE_TYPE (exp);
4098
  tree field = 0;
4099
  tree min_index = 0;
4100
  /* Number of bytes output or skipped so far.
4101
     In other words, current position within the constructor.  */
4102
  HOST_WIDE_INT total_bytes = 0;
4103
  /* Nonzero means BYTE contains part of a byte, to be output.  */
4104
  int byte_buffer_in_use = 0;
4105
  int byte = 0;
4106
  unsigned HOST_WIDE_INT cnt;
4107
  constructor_elt *ce;
4108
 
4109
  gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
4110
 
4111
  if (TREE_CODE (type) == RECORD_TYPE)
4112
    field = TYPE_FIELDS (type);
4113
 
4114
  if (TREE_CODE (type) == ARRAY_TYPE
4115
      && TYPE_DOMAIN (type) != 0)
4116
    min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
4117
 
4118
  /* As LINK goes through the elements of the constant,
4119
     FIELD goes through the structure fields, if the constant is a structure.
4120
     if the constant is a union, then we override this,
4121
     by getting the field from the TREE_LIST element.
4122
     But the constant could also be an array.  Then FIELD is zero.
4123
 
4124
     There is always a maximum of one element in the chain LINK for unions
4125
     (even if the initializer in a source program incorrectly contains
4126
     more one).  */
4127
  for (cnt = 0;
4128
       VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce);
4129
       cnt++, field = field ? TREE_CHAIN (field) : 0)
4130
    {
4131
      tree val = ce->value;
4132
      tree index = 0;
4133
 
4134
      /* The element in a union constructor specifies the proper field
4135
         or index.  */
4136
      if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4137
           || TREE_CODE (type) == QUAL_UNION_TYPE)
4138
          && ce->index != 0)
4139
        field = ce->index;
4140
 
4141
      else if (TREE_CODE (type) == ARRAY_TYPE)
4142
        index = ce->index;
4143
 
4144
#ifdef ASM_COMMENT_START
4145
      if (field && flag_verbose_asm)
4146
        fprintf (asm_out_file, "%s %s:\n",
4147
                 ASM_COMMENT_START,
4148
                 DECL_NAME (field)
4149
                 ? IDENTIFIER_POINTER (DECL_NAME (field))
4150
                 : "<anonymous>");
4151
#endif
4152
 
4153
      /* Eliminate the marker that makes a cast not be an lvalue.  */
4154
      if (val != 0)
4155
        STRIP_NOPS (val);
4156
 
4157
      if (index && TREE_CODE (index) == RANGE_EXPR)
4158
        {
4159
          unsigned HOST_WIDE_INT fieldsize
4160
            = int_size_in_bytes (TREE_TYPE (type));
4161
          HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4162
          HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
4163
          HOST_WIDE_INT index;
4164
          unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
4165
 
4166
          for (index = lo_index; index <= hi_index; index++)
4167
            {
4168
              /* Output the element's initial value.  */
4169
              if (val == 0)
4170
                assemble_zeros (fieldsize);
4171
              else
4172
                output_constant (val, fieldsize, align2);
4173
 
4174
              /* Count its size.  */
4175
              total_bytes += fieldsize;
4176
            }
4177
        }
4178
      else if (field == 0 || !DECL_BIT_FIELD (field))
4179
        {
4180
          /* An element that is not a bit-field.  */
4181
 
4182
          unsigned HOST_WIDE_INT fieldsize;
4183
          /* Since this structure is static,
4184
             we know the positions are constant.  */
4185
          HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4186
          unsigned int align2;
4187
 
4188
          if (index != 0)
4189
            pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4190
                   * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4191
 
4192
          /* Output any buffered-up bit-fields preceding this element.  */
4193
          if (byte_buffer_in_use)
4194
            {
4195
              assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4196
              total_bytes++;
4197
              byte_buffer_in_use = 0;
4198
            }
4199
 
4200
          /* Advance to offset of this element.
4201
             Note no alignment needed in an array, since that is guaranteed
4202
             if each element has the proper size.  */
4203
          if ((field != 0 || index != 0) && pos != total_bytes)
4204
            {
4205
              gcc_assert (pos >= total_bytes);
4206
              assemble_zeros (pos - total_bytes);
4207
              total_bytes = pos;
4208
            }
4209
 
4210
          /* Find the alignment of this element.  */
4211
          align2 = min_align (align, BITS_PER_UNIT * pos);
4212
 
4213
          /* Determine size this element should occupy.  */
4214
          if (field)
4215
            {
4216
              fieldsize = 0;
4217
 
4218
              /* If this is an array with an unspecified upper bound,
4219
                 the initializer determines the size.  */
4220
              /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4221
                 but we cannot do this until the deprecated support for
4222
                 initializing zero-length array members is removed.  */
4223
              if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4224
                  && TYPE_DOMAIN (TREE_TYPE (field))
4225
                  && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4226
                {
4227
                  fieldsize = array_size_for_constructor (val);
4228
                  /* Given a non-empty initialization, this field had
4229
                     better be last.  */
4230
                  gcc_assert (!fieldsize || !TREE_CHAIN (field));
4231
                }
4232
              else if (DECL_SIZE_UNIT (field))
4233
                {
4234
                  /* ??? This can't be right.  If the decl size overflows
4235
                     a host integer we will silently emit no data.  */
4236
                  if (host_integerp (DECL_SIZE_UNIT (field), 1))
4237
                    fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4238
                }
4239
            }
4240
          else
4241
            fieldsize = int_size_in_bytes (TREE_TYPE (type));
4242
 
4243
          /* Output the element's initial value.  */
4244
          if (val == 0)
4245
            assemble_zeros (fieldsize);
4246
          else
4247
            output_constant (val, fieldsize, align2);
4248
 
4249
          /* Count its size.  */
4250
          total_bytes += fieldsize;
4251
        }
4252
      else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4253
        error ("invalid initial value for member %qs",
4254
               IDENTIFIER_POINTER (DECL_NAME (field)));
4255
      else
4256
        {
4257
          /* Element that is a bit-field.  */
4258
 
4259
          HOST_WIDE_INT next_offset = int_bit_position (field);
4260
          HOST_WIDE_INT end_offset
4261
            = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4262
 
4263
          if (val == 0)
4264
            val = integer_zero_node;
4265
 
4266
          /* If this field does not start in this (or, next) byte,
4267
             skip some bytes.  */
4268
          if (next_offset / BITS_PER_UNIT != total_bytes)
4269
            {
4270
              /* Output remnant of any bit field in previous bytes.  */
4271
              if (byte_buffer_in_use)
4272
                {
4273
                  assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4274
                  total_bytes++;
4275
                  byte_buffer_in_use = 0;
4276
                }
4277
 
4278
              /* If still not at proper byte, advance to there.  */
4279
              if (next_offset / BITS_PER_UNIT != total_bytes)
4280
                {
4281
                  gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes);
4282
                  assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4283
                  total_bytes = next_offset / BITS_PER_UNIT;
4284
                }
4285
            }
4286
 
4287
          if (! byte_buffer_in_use)
4288
            byte = 0;
4289
 
4290
          /* We must split the element into pieces that fall within
4291
             separate bytes, and combine each byte with previous or
4292
             following bit-fields.  */
4293
 
4294
          /* next_offset is the offset n fbits from the beginning of
4295
             the structure to the next bit of this element to be processed.
4296
             end_offset is the offset of the first bit past the end of
4297
             this element.  */
4298
          while (next_offset < end_offset)
4299
            {
4300
              int this_time;
4301
              int shift;
4302
              HOST_WIDE_INT value;
4303
              HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4304
              HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4305
 
4306
              /* Advance from byte to byte
4307
                 within this element when necessary.  */
4308
              while (next_byte != total_bytes)
4309
                {
4310
                  assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4311
                  total_bytes++;
4312
                  byte = 0;
4313
                }
4314
 
4315
              /* Number of bits we can process at once
4316
                 (all part of the same byte).  */
4317
              this_time = MIN (end_offset - next_offset,
4318
                               BITS_PER_UNIT - next_bit);
4319
              if (BYTES_BIG_ENDIAN)
4320
                {
4321
                  /* On big-endian machine, take the most significant bits
4322
                     first (of the bits that are significant)
4323
                     and put them into bytes from the most significant end.  */
4324
                  shift = end_offset - next_offset - this_time;
4325
 
4326
                  /* Don't try to take a bunch of bits that cross
4327
                     the word boundary in the INTEGER_CST. We can
4328
                     only select bits from the LOW or HIGH part
4329
                     not from both.  */
4330
                  if (shift < HOST_BITS_PER_WIDE_INT
4331
                      && shift + this_time > HOST_BITS_PER_WIDE_INT)
4332
                    {
4333
                      this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4334
                      shift = HOST_BITS_PER_WIDE_INT;
4335
                    }
4336
 
4337
                  /* Now get the bits from the appropriate constant word.  */
4338
                  if (shift < HOST_BITS_PER_WIDE_INT)
4339
                    value = TREE_INT_CST_LOW (val);
4340
                  else
4341
                    {
4342
                      gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4343
                      value = TREE_INT_CST_HIGH (val);
4344
                      shift -= HOST_BITS_PER_WIDE_INT;
4345
                    }
4346
 
4347
                  /* Get the result. This works only when:
4348
                     1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4349
                  byte |= (((value >> shift)
4350
                            & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4351
                           << (BITS_PER_UNIT - this_time - next_bit));
4352
                }
4353
              else
4354
                {
4355
                  /* On little-endian machines,
4356
                     take first the least significant bits of the value
4357
                     and pack them starting at the least significant
4358
                     bits of the bytes.  */
4359
                  shift = next_offset - int_bit_position (field);
4360
 
4361
                  /* Don't try to take a bunch of bits that cross
4362
                     the word boundary in the INTEGER_CST. We can
4363
                     only select bits from the LOW or HIGH part
4364
                     not from both.  */
4365
                  if (shift < HOST_BITS_PER_WIDE_INT
4366
                      && shift + this_time > HOST_BITS_PER_WIDE_INT)
4367
                    this_time = (HOST_BITS_PER_WIDE_INT - shift);
4368
 
4369
                  /* Now get the bits from the appropriate constant word.  */
4370
                  if (shift < HOST_BITS_PER_WIDE_INT)
4371
                    value = TREE_INT_CST_LOW (val);
4372
                  else
4373
                    {
4374
                      gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4375
                      value = TREE_INT_CST_HIGH (val);
4376
                      shift -= HOST_BITS_PER_WIDE_INT;
4377
                    }
4378
 
4379
                  /* Get the result. This works only when:
4380
                     1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4381
                  byte |= (((value >> shift)
4382
                            & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4383
                           << next_bit);
4384
                }
4385
 
4386
              next_offset += this_time;
4387
              byte_buffer_in_use = 1;
4388
            }
4389
        }
4390
    }
4391
 
4392
  if (byte_buffer_in_use)
4393
    {
4394
      assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4395
      total_bytes++;
4396
    }
4397
 
4398
  if ((unsigned HOST_WIDE_INT)total_bytes < size)
4399
    assemble_zeros (size - total_bytes);
4400
}
4401
 
4402
/* This TREE_LIST contains any weak symbol declarations waiting
4403
   to be emitted.  */
4404
static GTY(()) tree weak_decls;
4405
 
4406
/* Mark DECL as weak.  */
4407
 
4408
static void
4409
mark_weak (tree decl)
4410
{
4411
  DECL_WEAK (decl) = 1;
4412
 
4413
  if (DECL_RTL_SET_P (decl)
4414
      && MEM_P (DECL_RTL (decl))
4415
      && XEXP (DECL_RTL (decl), 0)
4416
      && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4417
    SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4418
}
4419
 
4420
/* Merge weak status between NEWDECL and OLDDECL.  */
4421
 
4422
void
4423
merge_weak (tree newdecl, tree olddecl)
4424
{
4425
  if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4426
    {
4427
      if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
4428
        {
4429
          tree *pwd;
4430
          /* We put the NEWDECL on the weak_decls list at some point
4431
             and OLDDECL as well.  Keep just OLDDECL on the list.  */
4432
          for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
4433
            if (TREE_VALUE (*pwd) == newdecl)
4434
              {
4435
                *pwd = TREE_CHAIN (*pwd);
4436
                break;
4437
              }
4438
        }
4439
      return;
4440
    }
4441
 
4442
  if (DECL_WEAK (newdecl))
4443
    {
4444
      tree wd;
4445
 
4446
      /* NEWDECL is weak, but OLDDECL is not.  */
4447
 
4448
      /* If we already output the OLDDECL, we're in trouble; we can't
4449
         go back and make it weak.  This error cannot caught in
4450
         declare_weak because the NEWDECL and OLDDECL was not yet
4451
         been merged; therefore, TREE_ASM_WRITTEN was not set.  */
4452
      if (TREE_ASM_WRITTEN (olddecl))
4453
        error ("weak declaration of %q+D must precede definition",
4454
               newdecl);
4455
 
4456
      /* If we've already generated rtl referencing OLDDECL, we may
4457
         have done so in a way that will not function properly with
4458
         a weak symbol.  */
4459
      else if (TREE_USED (olddecl)
4460
               && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4461
        warning (0, "weak declaration of %q+D after first use results "
4462
                 "in unspecified behavior", newdecl);
4463
 
4464
      if (SUPPORTS_WEAK)
4465
        {
4466
          /* We put the NEWDECL on the weak_decls list at some point.
4467
             Replace it with the OLDDECL.  */
4468
          for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4469
            if (TREE_VALUE (wd) == newdecl)
4470
              {
4471
                TREE_VALUE (wd) = olddecl;
4472
                break;
4473
              }
4474
          /* We may not find the entry on the list.  If NEWDECL is a
4475
             weak alias, then we will have already called
4476
             globalize_decl to remove the entry; in that case, we do
4477
             not need to do anything.  */
4478
        }
4479
 
4480
      /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
4481
      mark_weak (olddecl);
4482
    }
4483
  else
4484
    /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4485
       weak.  Just update NEWDECL to indicate that it's weak too.  */
4486
    mark_weak (newdecl);
4487
}
4488
 
4489
/* Declare DECL to be a weak symbol.  */
4490
 
4491
void
4492
declare_weak (tree decl)
4493
{
4494
  if (! TREE_PUBLIC (decl))
4495
    error ("weak declaration of %q+D must be public", decl);
4496
  else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4497
    error ("weak declaration of %q+D must precede definition", decl);
4498
  else if (SUPPORTS_WEAK)
4499
    {
4500
      if (! DECL_WEAK (decl))
4501
        weak_decls = tree_cons (NULL, decl, weak_decls);
4502
    }
4503
  else
4504
    warning (0, "weak declaration of %q+D not supported", decl);
4505
 
4506
  mark_weak (decl);
4507
}
4508
 
4509
static void
4510
weak_finish_1 (tree decl)
4511
{
4512
#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4513
  const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4514
#endif
4515
 
4516
  if (! TREE_USED (decl))
4517
    return;
4518
 
4519
  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
4520
      && lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
4521
    return;
4522
 
4523
#ifdef ASM_WEAKEN_DECL
4524
  ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4525
#else
4526
#ifdef ASM_WEAKEN_LABEL
4527
  ASM_WEAKEN_LABEL (asm_out_file, name);
4528
#else
4529
#ifdef ASM_OUTPUT_WEAK_ALIAS
4530
  {
4531
    static bool warn_once = 0;
4532
    if (! warn_once)
4533
      {
4534
        warning (0, "only weak aliases are supported in this configuration");
4535
        warn_once = 1;
4536
      }
4537
    return;
4538
  }
4539
#endif
4540
#endif
4541
#endif
4542
}
4543
 
4544
/* This TREE_LIST contains weakref targets.  */
4545
 
4546
static GTY(()) tree weakref_targets;
4547
 
4548
/* Forward declaration.  */
4549
static tree find_decl_and_mark_needed (tree decl, tree target);
4550
 
4551
/* Emit any pending weak declarations.  */
4552
 
4553
void
4554
weak_finish (void)
4555
{
4556
  tree t;
4557
 
4558
  for (t = weakref_targets; t; t = TREE_CHAIN (t))
4559
    {
4560
      tree alias_decl = TREE_PURPOSE (t);
4561
      tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
4562
 
4563
      if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
4564
        /* Remove alias_decl from the weak list, but leave entries for
4565
           the target alone.  */
4566
        target = NULL_TREE;
4567
#ifndef ASM_OUTPUT_WEAKREF
4568
      else if (! TREE_SYMBOL_REFERENCED (target))
4569
        {
4570
          /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
4571
             defined, otherwise we and weak_finish_1 would use a
4572
             different macros.  */
4573
# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
4574
          ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
4575
# else
4576
          tree decl = find_decl_and_mark_needed (alias_decl, target);
4577
 
4578
          if (! decl)
4579
            {
4580
              decl = build_decl (TREE_CODE (alias_decl), target,
4581
                                 TREE_TYPE (alias_decl));
4582
 
4583
              DECL_EXTERNAL (decl) = 1;
4584
              TREE_PUBLIC (decl) = 1;
4585
              DECL_ARTIFICIAL (decl) = 1;
4586
              TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
4587
              TREE_USED (decl) = 1;
4588
            }
4589
 
4590
          weak_finish_1 (decl);
4591
# endif
4592
        }
4593
#endif
4594
 
4595
      {
4596
        tree *p;
4597
        tree t2;
4598
 
4599
        /* Remove the alias and the target from the pending weak list
4600
           so that we do not emit any .weak directives for the former,
4601
           nor multiple .weak directives for the latter.  */
4602
        for (p = &weak_decls; (t2 = *p) ; )
4603
          {
4604
            if (TREE_VALUE (t2) == alias_decl
4605
                || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
4606
              *p = TREE_CHAIN (t2);
4607
            else
4608
              p = &TREE_CHAIN (t2);
4609
          }
4610
 
4611
        /* Remove other weakrefs to the same target, to speed things up.  */
4612
        for (p = &TREE_CHAIN (t); (t2 = *p) ; )
4613
          {
4614
            if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
4615
              *p = TREE_CHAIN (t2);
4616
            else
4617
              p = &TREE_CHAIN (t2);
4618
          }
4619
      }
4620
    }
4621
 
4622
  for (t = weak_decls; t; t = TREE_CHAIN (t))
4623
    {
4624
      tree decl = TREE_VALUE (t);
4625
 
4626
      weak_finish_1 (decl);
4627
    }
4628
}
4629
 
4630
/* Emit the assembly bits to indicate that DECL is globally visible.  */
4631
 
4632
static void
4633
globalize_decl (tree decl)
4634
{
4635
  const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4636
 
4637
#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4638
  if (DECL_WEAK (decl))
4639
    {
4640
      tree *p, t;
4641
 
4642
#ifdef ASM_WEAKEN_DECL
4643
      ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4644
#else
4645
      ASM_WEAKEN_LABEL (asm_out_file, name);
4646
#endif
4647
 
4648
      /* Remove this function from the pending weak list so that
4649
         we do not emit multiple .weak directives for it.  */
4650
      for (p = &weak_decls; (t = *p) ; )
4651
        {
4652
          if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4653
            *p = TREE_CHAIN (t);
4654
          else
4655
            p = &TREE_CHAIN (t);
4656
        }
4657
 
4658
        /* Remove weakrefs to the same target from the pending weakref
4659
           list, for the same reason.  */
4660
        for (p = &weakref_targets; (t = *p) ; )
4661
          {
4662
            if (DECL_ASSEMBLER_NAME (decl)
4663
                == ultimate_transparent_alias_target (&TREE_VALUE (t)))
4664
              *p = TREE_CHAIN (t);
4665
            else
4666
              p = &TREE_CHAIN (t);
4667
          }
4668
 
4669
      return;
4670
    }
4671
#elif defined(ASM_MAKE_LABEL_LINKONCE)
4672
  if (DECL_ONE_ONLY (decl))
4673
    ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
4674
#endif
4675
 
4676
  targetm.asm_out.globalize_label (asm_out_file, name);
4677
}
4678
 
4679
/* We have to be able to tell cgraph about the needed-ness of the target
4680
   of an alias.  This requires that the decl have been defined.  Aliases
4681
   that precede their definition have to be queued for later processing.  */
4682
 
4683
typedef struct alias_pair GTY(())
4684
{
4685
  tree decl;
4686
  tree target;
4687
} alias_pair;
4688
 
4689
/* Define gc'd vector type.  */
4690
DEF_VEC_O(alias_pair);
4691
DEF_VEC_ALLOC_O(alias_pair,gc);
4692
 
4693
static GTY(()) VEC(alias_pair,gc) *alias_pairs;
4694
 
4695
/* Given an assembly name, find the decl it is associated with.  At the
4696
   same time, mark it needed for cgraph.  */
4697
 
4698
static tree
4699
find_decl_and_mark_needed (tree decl, tree target)
4700
{
4701
  struct cgraph_node *fnode = NULL;
4702
  struct cgraph_varpool_node *vnode = NULL;
4703
 
4704
  if (TREE_CODE (decl) == FUNCTION_DECL)
4705
    {
4706
      fnode = cgraph_node_for_asm (target);
4707
      if (fnode == NULL)
4708
        vnode = cgraph_varpool_node_for_asm (target);
4709
    }
4710
  else
4711
    {
4712
      vnode = cgraph_varpool_node_for_asm (target);
4713
      if (vnode == NULL)
4714
        fnode = cgraph_node_for_asm (target);
4715
    }
4716
 
4717
  if (fnode)
4718
    {
4719
      /* We can't mark function nodes as used after cgraph global info
4720
         is finished.  This wouldn't generally be necessary, but C++
4721
         virtual table thunks are introduced late in the game and
4722
         might seem like they need marking, although in fact they
4723
         don't.  */
4724
      if (! cgraph_global_info_ready)
4725
        cgraph_mark_needed_node (fnode);
4726
      return fnode->decl;
4727
    }
4728
  else if (vnode)
4729
    {
4730
      cgraph_varpool_mark_needed_node (vnode);
4731
      return vnode->decl;
4732
    }
4733
  else
4734
    return NULL_TREE;
4735
}
4736
 
4737
/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
4738
   or ASM_OUTPUT_DEF_FROM_DECLS.  The function defines the symbol whose
4739
   tree node is DECL to have the value of the tree node TARGET.  */
4740
 
4741
static void
4742
do_assemble_alias (tree decl, tree target)
4743
{
4744
  if (TREE_ASM_WRITTEN (decl))
4745
    return;
4746
 
4747
  TREE_ASM_WRITTEN (decl) = 1;
4748
  TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4749
 
4750
  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
4751
    {
4752
      ultimate_transparent_alias_target (&target);
4753
 
4754
      if (!TREE_SYMBOL_REFERENCED (target))
4755
        weakref_targets = tree_cons (decl, target, weakref_targets);
4756
 
4757
#ifdef ASM_OUTPUT_WEAKREF
4758
      ASM_OUTPUT_WEAKREF (asm_out_file, decl,
4759
                          IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4760
                          IDENTIFIER_POINTER (target));
4761
#else
4762
      if (!SUPPORTS_WEAK)
4763
        {
4764
          error ("%Jweakref is not supported in this configuration", decl);
4765
          return;
4766
        }
4767
#endif
4768
      return;
4769
    }
4770
 
4771
#ifdef ASM_OUTPUT_DEF
4772
  /* Make name accessible from other files, if appropriate.  */
4773
 
4774
  if (TREE_PUBLIC (decl))
4775
    {
4776
      globalize_decl (decl);
4777
      maybe_assemble_visibility (decl);
4778
    }
4779
 
4780
# ifdef ASM_OUTPUT_DEF_FROM_DECLS
4781
  ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4782
# else
4783
  ASM_OUTPUT_DEF (asm_out_file,
4784
                  IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4785
                  IDENTIFIER_POINTER (target));
4786
# endif
4787
#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4788
  {
4789
    const char *name;
4790
    tree *p, t;
4791
 
4792
    name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4793
# ifdef ASM_WEAKEN_DECL
4794
    ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4795
# else
4796
    ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4797
# endif
4798
    /* Remove this function from the pending weak list so that
4799
       we do not emit multiple .weak directives for it.  */
4800
    for (p = &weak_decls; (t = *p) ; )
4801
      if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4802
        *p = TREE_CHAIN (t);
4803
      else
4804
        p = &TREE_CHAIN (t);
4805
 
4806
    /* Remove weakrefs to the same target from the pending weakref
4807
       list, for the same reason.  */
4808
    for (p = &weakref_targets; (t = *p) ; )
4809
      {
4810
        if (DECL_ASSEMBLER_NAME (decl)
4811
            == ultimate_transparent_alias_target (&TREE_VALUE (t)))
4812
          *p = TREE_CHAIN (t);
4813
        else
4814
          p = &TREE_CHAIN (t);
4815
      }
4816
  }
4817
#endif
4818
}
4819
 
4820
/* First pass of completing pending aliases.  Make sure that cgraph knows
4821
   which symbols will be required.  */
4822
 
4823
void
4824
finish_aliases_1 (void)
4825
{
4826
  unsigned i;
4827
  alias_pair *p;
4828
 
4829
  for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4830
    {
4831
      tree target_decl;
4832
 
4833
      target_decl = find_decl_and_mark_needed (p->decl, p->target);
4834
      if (target_decl == NULL)
4835
        {
4836
          if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
4837
            error ("%q+D aliased to undefined symbol %qs",
4838
                   p->decl, IDENTIFIER_POINTER (p->target));
4839
        }
4840
      else if (DECL_EXTERNAL (target_decl)
4841
               && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
4842
        error ("%q+D aliased to external symbol %qs",
4843
               p->decl, IDENTIFIER_POINTER (p->target));
4844
    }
4845
}
4846
 
4847
/* Second pass of completing pending aliases.  Emit the actual assembly.
4848
   This happens at the end of compilation and thus it is assured that the
4849
   target symbol has been emitted.  */
4850
 
4851
void
4852
finish_aliases_2 (void)
4853
{
4854
  unsigned i;
4855
  alias_pair *p;
4856
 
4857
  for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4858
    do_assemble_alias (p->decl, p->target);
4859
 
4860
  VEC_truncate (alias_pair, alias_pairs, 0);
4861
}
4862
 
4863
/* Emit an assembler directive to make the symbol for DECL an alias to
4864
   the symbol for TARGET.  */
4865
 
4866
void
4867
assemble_alias (tree decl, tree target)
4868
{
4869
  tree target_decl;
4870
  bool is_weakref = false;
4871
 
4872
  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
4873
    {
4874
      tree alias = DECL_ASSEMBLER_NAME (decl);
4875
 
4876
      is_weakref = true;
4877
 
4878
      ultimate_transparent_alias_target (&target);
4879
 
4880
      if (alias == target)
4881
        error ("weakref %q+D ultimately targets itself", decl);
4882
      else
4883
        {
4884
#ifndef ASM_OUTPUT_WEAKREF
4885
          IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
4886
          TREE_CHAIN (alias) = target;
4887
#endif
4888
        }
4889
    }
4890
  else
4891
    {
4892
#if !defined (ASM_OUTPUT_DEF)
4893
# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
4894
      error ("%Jalias definitions not supported in this configuration", decl);
4895
      return;
4896
# else
4897
      if (!DECL_WEAK (decl))
4898
        {
4899
          error ("%Jonly weak aliases are supported in this configuration", decl);
4900
          return;
4901
        }
4902
# endif
4903
#endif
4904
    }
4905
 
4906
  /* We must force creation of DECL_RTL for debug info generation, even though
4907
     we don't use it here.  */
4908
  make_decl_rtl (decl);
4909
  TREE_USED (decl) = 1;
4910
 
4911
  /* A quirk of the initial implementation of aliases required that the user
4912
     add "extern" to all of them.  Which is silly, but now historical.  Do
4913
     note that the symbol is in fact locally defined.  */
4914
  if (! is_weakref)
4915
    DECL_EXTERNAL (decl) = 0;
4916
 
4917
  /* Allow aliases to aliases.  */
4918
  if (TREE_CODE (decl) == FUNCTION_DECL)
4919
    cgraph_node (decl)->alias = true;
4920
  else
4921
    cgraph_varpool_node (decl)->alias = true;
4922
 
4923
  /* If the target has already been emitted, we don't have to queue the
4924
     alias.  This saves a tad o memory.  */
4925
  target_decl = find_decl_and_mark_needed (decl, target);
4926
  if (target_decl && TREE_ASM_WRITTEN (target_decl))
4927
    do_assemble_alias (decl, target);
4928
  else
4929
    {
4930
      alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
4931
      p->decl = decl;
4932
      p->target = target;
4933
    }
4934
}
4935
 
4936
/* Emit an assembler directive to set symbol for DECL visibility to
4937
   the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
4938
 
4939
void
4940
default_assemble_visibility (tree decl, int vis)
4941
{
4942
  static const char * const visibility_types[] = {
4943
    NULL, "internal", "hidden", "protected"
4944
  };
4945
 
4946
  const char *name, *type;
4947
 
4948
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4949
  type = visibility_types[vis];
4950
 
4951
#ifdef HAVE_GAS_HIDDEN
4952
  fprintf (asm_out_file, "\t.%s\t", type);
4953
  assemble_name (asm_out_file, name);
4954
  fprintf (asm_out_file, "\n");
4955
#else
4956
  warning (OPT_Wattributes, "visibility attribute not supported "
4957
           "in this configuration; ignored");
4958
#endif
4959
}
4960
 
4961
/* A helper function to call assemble_visibility when needed for a decl.  */
4962
 
4963
static void
4964
maybe_assemble_visibility (tree decl)
4965
{
4966
  enum symbol_visibility vis = DECL_VISIBILITY (decl);
4967
 
4968
  if (vis != VISIBILITY_DEFAULT)
4969
    targetm.asm_out.visibility (decl, vis);
4970
}
4971
 
4972
/* Returns 1 if the target configuration supports defining public symbols
4973
   so that one of them will be chosen at link time instead of generating a
4974
   multiply-defined symbol error, whether through the use of weak symbols or
4975
   a target-specific mechanism for having duplicates discarded.  */
4976
 
4977
int
4978
supports_one_only (void)
4979
{
4980
  if (SUPPORTS_ONE_ONLY)
4981
    return 1;
4982
  return SUPPORTS_WEAK;
4983
}
4984
 
4985
/* Set up DECL as a public symbol that can be defined in multiple
4986
   translation units without generating a linker error.  */
4987
 
4988
void
4989
make_decl_one_only (tree decl)
4990
{
4991
  gcc_assert (TREE_CODE (decl) == VAR_DECL
4992
              || TREE_CODE (decl) == FUNCTION_DECL);
4993
 
4994
  TREE_PUBLIC (decl) = 1;
4995
 
4996
  if (SUPPORTS_ONE_ONLY)
4997
    {
4998
#ifdef MAKE_DECL_ONE_ONLY
4999
      MAKE_DECL_ONE_ONLY (decl);
5000
#endif
5001
      DECL_ONE_ONLY (decl) = 1;
5002
    }
5003
  else if (TREE_CODE (decl) == VAR_DECL
5004
      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5005
    DECL_COMMON (decl) = 1;
5006
  else
5007
    {
5008
      gcc_assert (SUPPORTS_WEAK);
5009
      DECL_WEAK (decl) = 1;
5010
    }
5011
}
5012
 
5013
void
5014
init_varasm_once (void)
5015
{
5016
  in_named_htab = htab_create_ggc (31, in_named_entry_hash,
5017
                                   in_named_entry_eq, NULL);
5018
  const_desc_htab = htab_create_ggc (1009, const_desc_hash,
5019
                                     const_desc_eq, NULL);
5020
 
5021
  const_alias_set = new_alias_set ();
5022
}
5023
 
5024
enum tls_model
5025
decl_default_tls_model (tree decl)
5026
{
5027
  enum tls_model kind;
5028
  bool is_local;
5029
 
5030
  is_local = targetm.binds_local_p (decl);
5031
  if (!flag_shlib)
5032
    {
5033
      if (is_local)
5034
        kind = TLS_MODEL_LOCAL_EXEC;
5035
      else
5036
        kind = TLS_MODEL_INITIAL_EXEC;
5037
    }
5038
 
5039
  /* Local dynamic is inefficient when we're not combining the
5040
     parts of the address.  */
5041
  else if (optimize && is_local)
5042
    kind = TLS_MODEL_LOCAL_DYNAMIC;
5043
  else
5044
    kind = TLS_MODEL_GLOBAL_DYNAMIC;
5045
  if (kind < flag_tls_default)
5046
    kind = flag_tls_default;
5047
 
5048
  return kind;
5049
}
5050
 
5051
/* Select a set of attributes for section NAME based on the properties
5052
   of DECL and whether or not RELOC indicates that DECL's initializer
5053
   might contain runtime relocations.
5054
 
5055
   We make the section read-only and executable for a function decl,
5056
   read-only for a const data decl, and writable for a non-const data decl.  */
5057
 
5058
unsigned int
5059
default_section_type_flags (tree decl, const char *name, int reloc)
5060
{
5061
  return default_section_type_flags_1 (decl, name, reloc, flag_pic);
5062
}
5063
 
5064
unsigned int
5065
default_section_type_flags_1 (tree decl, const char *name, int reloc,
5066
                              int shlib)
5067
{
5068
  unsigned int flags;
5069
 
5070
  if (decl && TREE_CODE (decl) == FUNCTION_DECL)
5071
    flags = SECTION_CODE;
5072
  else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
5073
    flags = 0;
5074
  else if (current_function_decl
5075
           && cfun
5076
           && cfun->unlikely_text_section_name
5077
           && strcmp (name, cfun->unlikely_text_section_name) == 0)
5078
    flags = SECTION_CODE;
5079
  else if (!decl
5080
           && (!current_function_decl || !cfun)
5081
           && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
5082
    flags = SECTION_CODE;
5083
  else
5084
    flags = SECTION_WRITE;
5085
 
5086
  if (decl && DECL_ONE_ONLY (decl))
5087
    flags |= SECTION_LINKONCE;
5088
 
5089
  if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5090
    flags |= SECTION_TLS | SECTION_WRITE;
5091
 
5092
  if (strcmp (name, ".bss") == 0
5093
      || strncmp (name, ".bss.", 5) == 0
5094
      || strncmp (name, ".gnu.linkonce.b.", 16) == 0
5095
      || strcmp (name, ".sbss") == 0
5096
      || strncmp (name, ".sbss.", 6) == 0
5097
      || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
5098
    flags |= SECTION_BSS;
5099
 
5100
  if (strcmp (name, ".tdata") == 0
5101
      || strncmp (name, ".tdata.", 7) == 0
5102
      || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
5103
    flags |= SECTION_TLS;
5104
 
5105
  if (strcmp (name, ".tbss") == 0
5106
      || strncmp (name, ".tbss.", 6) == 0
5107
      || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
5108
    flags |= SECTION_TLS | SECTION_BSS;
5109
 
5110
  /* These three sections have special ELF types.  They are neither
5111
     SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
5112
     want to print a section type (@progbits or @nobits).  If someone
5113
     is silly enough to emit code or TLS variables to one of these
5114
     sections, then don't handle them specially.  */
5115
  if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
5116
      && (strcmp (name, ".init_array") == 0
5117
          || strcmp (name, ".fini_array") == 0
5118
          || strcmp (name, ".preinit_array") == 0))
5119
    flags |= SECTION_NOTYPE;
5120
 
5121
  return flags;
5122
}
5123
 
5124
/* Output assembly to switch to section NAME with attribute FLAGS.
5125
   Four variants for common object file formats.  */
5126
 
5127
void
5128
default_no_named_section (const char *name ATTRIBUTE_UNUSED,
5129
                          unsigned int flags ATTRIBUTE_UNUSED,
5130
                          tree decl ATTRIBUTE_UNUSED)
5131
{
5132
  /* Some object formats don't support named sections at all.  The
5133
     front-end should already have flagged this as an error.  */
5134
  gcc_unreachable ();
5135
}
5136
 
5137
void
5138
default_elf_asm_named_section (const char *name, unsigned int flags,
5139
                               tree decl ATTRIBUTE_UNUSED)
5140
{
5141
  char flagchars[10], *f = flagchars;
5142
 
5143
  /* If we have already declared this section, we can use an
5144
     abbreviated form to switch back to it -- unless this section is
5145
     part of a COMDAT groups, in which case GAS requires the full
5146
     declaration every time.  */
5147
  if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5148
      && ! named_section_first_declaration (name))
5149
    {
5150
      fprintf (asm_out_file, "\t.section\t%s\n", name);
5151
      return;
5152
    }
5153
 
5154
  if (!(flags & SECTION_DEBUG))
5155
    *f++ = 'a';
5156
  if (flags & SECTION_WRITE)
5157
    *f++ = 'w';
5158
  if (flags & SECTION_CODE)
5159
    *f++ = 'x';
5160
  if (flags & SECTION_SMALL)
5161
    *f++ = 's';
5162
  if (flags & SECTION_MERGE)
5163
    *f++ = 'M';
5164
  if (flags & SECTION_STRINGS)
5165
    *f++ = 'S';
5166
  if (flags & SECTION_TLS)
5167
    *f++ = 'T';
5168
  if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5169
    *f++ = 'G';
5170
  *f = '\0';
5171
 
5172
  fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
5173
 
5174
  if (!(flags & SECTION_NOTYPE))
5175
    {
5176
      const char *type;
5177
      const char *format;
5178
 
5179
      if (flags & SECTION_BSS)
5180
        type = "nobits";
5181
      else
5182
        type = "progbits";
5183
 
5184
      format = ",@%s";
5185
#ifdef ASM_COMMENT_START
5186
      /* On platforms that use "@" as the assembly comment character,
5187
         use "%" instead.  */
5188
      if (strcmp (ASM_COMMENT_START, "@") == 0)
5189
        format = ",%%%s";
5190
#endif
5191
      fprintf (asm_out_file, format, type);
5192
 
5193
      if (flags & SECTION_ENTSIZE)
5194
        fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
5195
      if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5196
        fprintf (asm_out_file, ",%s,comdat",
5197
                 lang_hooks.decls.comdat_group (decl));
5198
    }
5199
 
5200
  putc ('\n', asm_out_file);
5201
}
5202
 
5203
void
5204
default_coff_asm_named_section (const char *name, unsigned int flags,
5205
                                tree decl ATTRIBUTE_UNUSED)
5206
{
5207
  char flagchars[8], *f = flagchars;
5208
 
5209
  if (flags & SECTION_WRITE)
5210
    *f++ = 'w';
5211
  if (flags & SECTION_CODE)
5212
    *f++ = 'x';
5213
  *f = '\0';
5214
 
5215
  fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
5216
}
5217
 
5218
void
5219
default_pe_asm_named_section (const char *name, unsigned int flags,
5220
                              tree decl)
5221
{
5222
  default_coff_asm_named_section (name, flags, decl);
5223
 
5224
  if (flags & SECTION_LINKONCE)
5225
    {
5226
      /* Functions may have been compiled at various levels of
5227
         optimization so we can't use `same_size' here.
5228
         Instead, have the linker pick one.  */
5229
      fprintf (asm_out_file, "\t.linkonce %s\n",
5230
               (flags & SECTION_CODE ? "discard" : "same_size"));
5231
    }
5232
}
5233
 
5234
/* The lame default section selector.  */
5235
 
5236
void
5237
default_select_section (tree decl, int reloc,
5238
                        unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5239
{
5240
  bool readonly = false;
5241
 
5242
  if (DECL_P (decl))
5243
    {
5244
      if (decl_readonly_section (decl, reloc))
5245
        readonly = true;
5246
    }
5247
  else if (TREE_CODE (decl) == CONSTRUCTOR)
5248
    {
5249
      if (! ((flag_pic && reloc)
5250
             || !TREE_READONLY (decl)
5251
             || TREE_SIDE_EFFECTS (decl)
5252
             || !TREE_CONSTANT (decl)))
5253
        readonly = true;
5254
    }
5255
  else if (TREE_CODE (decl) == STRING_CST)
5256
    readonly = true;
5257
  else if (! (flag_pic && reloc))
5258
    readonly = true;
5259
 
5260
  if (readonly)
5261
    readonly_data_section ();
5262
  else
5263
    data_section ();
5264
}
5265
 
5266
enum section_category
5267
categorize_decl_for_section (tree decl, int reloc, int shlib)
5268
{
5269
  enum section_category ret;
5270
 
5271
  if (TREE_CODE (decl) == FUNCTION_DECL)
5272
    return SECCAT_TEXT;
5273
  else if (TREE_CODE (decl) == STRING_CST)
5274
    {
5275
      if (flag_mudflap) /* or !flag_merge_constants */
5276
        return SECCAT_RODATA;
5277
      else
5278
        return SECCAT_RODATA_MERGE_STR;
5279
    }
5280
  else if (TREE_CODE (decl) == VAR_DECL)
5281
    {
5282
      if (DECL_INITIAL (decl) == NULL
5283
          || DECL_INITIAL (decl) == error_mark_node
5284
          || (flag_zero_initialized_in_bss
5285
              /* Leave constant zeroes in .rodata so they can be shared.  */
5286
              && !TREE_READONLY (decl)
5287
              && initializer_zerop (DECL_INITIAL (decl))))
5288
        ret = SECCAT_BSS;
5289
      else if (! TREE_READONLY (decl)
5290
               || TREE_SIDE_EFFECTS (decl)
5291
               || ! TREE_CONSTANT (DECL_INITIAL (decl)))
5292
        {
5293
          if (shlib && (reloc & 2))
5294
            ret = SECCAT_DATA_REL;
5295
          else if (shlib && reloc)
5296
            ret = SECCAT_DATA_REL_LOCAL;
5297
          else
5298
            ret = SECCAT_DATA;
5299
        }
5300
      else if (shlib && (reloc & 2))
5301
        ret = SECCAT_DATA_REL_RO;
5302
      else if (shlib && reloc)
5303
        ret = SECCAT_DATA_REL_RO_LOCAL;
5304
      else if (reloc || flag_merge_constants < 2)
5305
        /* C and C++ don't allow different variables to share the same
5306
           location.  -fmerge-all-constants allows even that (at the
5307
           expense of not conforming).  */
5308
        ret = SECCAT_RODATA;
5309
      else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
5310
        ret = SECCAT_RODATA_MERGE_STR_INIT;
5311
      else
5312
        ret = SECCAT_RODATA_MERGE_CONST;
5313
    }
5314
  else if (TREE_CODE (decl) == CONSTRUCTOR)
5315
    {
5316
      if ((shlib && reloc)
5317
          || TREE_SIDE_EFFECTS (decl)
5318
          || ! TREE_CONSTANT (decl))
5319
        ret = SECCAT_DATA;
5320
      else
5321
        ret = SECCAT_RODATA;
5322
    }
5323
  else
5324
    ret = SECCAT_RODATA;
5325
 
5326
  /* There are no read-only thread-local sections.  */
5327
  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5328
    {
5329
      /* Note that this would be *just* SECCAT_BSS, except that there's
5330
         no concept of a read-only thread-local-data section.  */
5331
      if (ret == SECCAT_BSS
5332
          || (flag_zero_initialized_in_bss
5333
              && initializer_zerop (DECL_INITIAL (decl))))
5334
        ret = SECCAT_TBSS;
5335
      else
5336
        ret = SECCAT_TDATA;
5337
    }
5338
 
5339
  /* If the target uses small data sections, select it.  */
5340
  else if (targetm.in_small_data_p (decl))
5341
    {
5342
      if (ret == SECCAT_BSS)
5343
        ret = SECCAT_SBSS;
5344
      else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
5345
        ret = SECCAT_SRODATA;
5346
      else
5347
        ret = SECCAT_SDATA;
5348
    }
5349
 
5350
  return ret;
5351
}
5352
 
5353
bool
5354
decl_readonly_section (tree decl, int reloc)
5355
{
5356
  return decl_readonly_section_1 (decl, reloc, flag_pic);
5357
}
5358
 
5359
bool
5360
decl_readonly_section_1 (tree decl, int reloc, int shlib)
5361
{
5362
  switch (categorize_decl_for_section (decl, reloc, shlib))
5363
    {
5364
    case SECCAT_RODATA:
5365
    case SECCAT_RODATA_MERGE_STR:
5366
    case SECCAT_RODATA_MERGE_STR_INIT:
5367
    case SECCAT_RODATA_MERGE_CONST:
5368
    case SECCAT_SRODATA:
5369
      return true;
5370
      break;
5371
    default:
5372
      return false;
5373
      break;
5374
    }
5375
}
5376
 
5377
/* Select a section based on the above categorization.  */
5378
 
5379
void
5380
default_elf_select_section (tree decl, int reloc,
5381
                            unsigned HOST_WIDE_INT align)
5382
{
5383
  default_elf_select_section_1 (decl, reloc, align, flag_pic);
5384
}
5385
 
5386
void
5387
default_elf_select_section_1 (tree decl, int reloc,
5388
                              unsigned HOST_WIDE_INT align, int shlib)
5389
{
5390
  const char *sname;
5391
  switch (categorize_decl_for_section (decl, reloc, shlib))
5392
    {
5393
    case SECCAT_TEXT:
5394
      /* We're not supposed to be called on FUNCTION_DECLs.  */
5395
      gcc_unreachable ();
5396
    case SECCAT_RODATA:
5397
      readonly_data_section ();
5398
      return;
5399
    case SECCAT_RODATA_MERGE_STR:
5400
      mergeable_string_section (decl, align, 0);
5401
      return;
5402
    case SECCAT_RODATA_MERGE_STR_INIT:
5403
      mergeable_string_section (DECL_INITIAL (decl), align, 0);
5404
      return;
5405
    case SECCAT_RODATA_MERGE_CONST:
5406
      mergeable_constant_section (DECL_MODE (decl), align, 0);
5407
      return;
5408
    case SECCAT_SRODATA:
5409
      sname = ".sdata2";
5410
      break;
5411
    case SECCAT_DATA:
5412
      data_section ();
5413
      return;
5414
    case SECCAT_DATA_REL:
5415
      sname = ".data.rel";
5416
      break;
5417
    case SECCAT_DATA_REL_LOCAL:
5418
      sname = ".data.rel.local";
5419
      break;
5420
    case SECCAT_DATA_REL_RO:
5421
      sname = ".data.rel.ro";
5422
      break;
5423
    case SECCAT_DATA_REL_RO_LOCAL:
5424
      sname = ".data.rel.ro.local";
5425
      break;
5426
    case SECCAT_SDATA:
5427
      sname = ".sdata";
5428
      break;
5429
    case SECCAT_TDATA:
5430
      sname = ".tdata";
5431
      break;
5432
    case SECCAT_BSS:
5433
#ifdef BSS_SECTION_ASM_OP
5434
      bss_section ();
5435
      return;
5436
#else
5437
      sname = ".bss";
5438
      break;
5439
#endif
5440
    case SECCAT_SBSS:
5441
      sname = ".sbss";
5442
      break;
5443
    case SECCAT_TBSS:
5444
      sname = ".tbss";
5445
      break;
5446
    default:
5447
      gcc_unreachable ();
5448
    }
5449
 
5450
  if (!DECL_P (decl))
5451
    decl = NULL_TREE;
5452
  named_section (decl, sname, reloc);
5453
}
5454
 
5455
/* Construct a unique section name based on the decl name and the
5456
   categorization performed above.  */
5457
 
5458
void
5459
default_unique_section (tree decl, int reloc)
5460
{
5461
  default_unique_section_1 (decl, reloc, flag_pic);
5462
}
5463
 
5464
void
5465
default_unique_section_1 (tree decl, int reloc, int shlib)
5466
{
5467
  /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
5468
  bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
5469
  const char *prefix, *name;
5470
  size_t nlen, plen;
5471
  char *string;
5472
 
5473
  switch (categorize_decl_for_section (decl, reloc, shlib))
5474
    {
5475
    case SECCAT_TEXT:
5476
      prefix = one_only ? ".gnu.linkonce.t." : ".text.";
5477
      break;
5478
    case SECCAT_RODATA:
5479
    case SECCAT_RODATA_MERGE_STR:
5480
    case SECCAT_RODATA_MERGE_STR_INIT:
5481
    case SECCAT_RODATA_MERGE_CONST:
5482
      prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5483
      break;
5484
    case SECCAT_SRODATA:
5485
      prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5486
      break;
5487
    case SECCAT_DATA:
5488
      prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5489
      break;
5490
    case SECCAT_DATA_REL:
5491
      prefix = one_only ? ".gnu.linkonce.d.rel." : ".data.rel.";
5492
      break;
5493
    case SECCAT_DATA_REL_LOCAL:
5494
      prefix = one_only ? ".gnu.linkonce.d.rel.local." : ".data.rel.local.";
5495
      break;
5496
    case SECCAT_DATA_REL_RO:
5497
      prefix = one_only ? ".gnu.linkonce.d.rel.ro." : ".data.rel.ro.";
5498
      break;
5499
    case SECCAT_DATA_REL_RO_LOCAL:
5500
      prefix = one_only ? ".gnu.linkonce.d.rel.ro.local."
5501
               : ".data.rel.ro.local.";
5502
      break;
5503
    case SECCAT_SDATA:
5504
      prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5505
      break;
5506
    case SECCAT_BSS:
5507
      prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5508
      break;
5509
    case SECCAT_SBSS:
5510
      prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5511
      break;
5512
    case SECCAT_TDATA:
5513
      prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
5514
      break;
5515
    case SECCAT_TBSS:
5516
      prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
5517
      break;
5518
    default:
5519
      gcc_unreachable ();
5520
    }
5521
  plen = strlen (prefix);
5522
 
5523
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5524
  name = targetm.strip_name_encoding (name);
5525
  nlen = strlen (name);
5526
 
5527
  string = alloca (nlen + plen + 1);
5528
  memcpy (string, prefix, plen);
5529
  memcpy (string + plen, name, nlen + 1);
5530
 
5531
  DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5532
}
5533
 
5534
void
5535
default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
5536
                            rtx x,
5537
                            unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5538
{
5539
  if (flag_pic)
5540
    switch (GET_CODE (x))
5541
      {
5542
      case CONST:
5543
      case SYMBOL_REF:
5544
      case LABEL_REF:
5545
        data_section ();
5546
        return;
5547
 
5548
      default:
5549
        break;
5550
      }
5551
 
5552
  readonly_data_section ();
5553
}
5554
 
5555
void
5556
default_elf_select_rtx_section (enum machine_mode mode, rtx x,
5557
                                unsigned HOST_WIDE_INT align)
5558
{
5559
  /* ??? Handle small data here somehow.  */
5560
 
5561
  if (flag_pic)
5562
    switch (GET_CODE (x))
5563
      {
5564
      case CONST:
5565
      case SYMBOL_REF:
5566
        named_section (NULL_TREE, ".data.rel.ro", 3);
5567
        return;
5568
 
5569
      case LABEL_REF:
5570
        named_section (NULL_TREE, ".data.rel.ro.local", 1);
5571
        return;
5572
 
5573
      default:
5574
        break;
5575
      }
5576
 
5577
  mergeable_constant_section (mode, align, 0);
5578
}
5579
 
5580
/* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
5581
 
5582
void
5583
default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
5584
{
5585
  rtx symbol;
5586
  int flags;
5587
 
5588
  /* Careful not to prod global register variables.  */
5589
  if (!MEM_P (rtl))
5590
    return;
5591
  symbol = XEXP (rtl, 0);
5592
  if (GET_CODE (symbol) != SYMBOL_REF)
5593
    return;
5594
 
5595
  flags = 0;
5596
  if (TREE_CODE (decl) == FUNCTION_DECL)
5597
    flags |= SYMBOL_FLAG_FUNCTION;
5598
  if (targetm.binds_local_p (decl))
5599
    flags |= SYMBOL_FLAG_LOCAL;
5600
  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5601
    flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
5602
  else if (targetm.in_small_data_p (decl))
5603
    flags |= SYMBOL_FLAG_SMALL;
5604
  /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
5605
     being PUBLIC, the thing *must* be defined in this translation unit.
5606
     Prevent this buglet from being propagated into rtl code as well.  */
5607
  if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
5608
    flags |= SYMBOL_FLAG_EXTERNAL;
5609
 
5610
  SYMBOL_REF_FLAGS (symbol) = flags;
5611
}
5612
 
5613
/* By default, we do nothing for encode_section_info, so we need not
5614
   do anything but discard the '*' marker.  */
5615
 
5616
const char *
5617
default_strip_name_encoding (const char *str)
5618
{
5619
  return str + (*str == '*');
5620
}
5621
 
5622
/* Assume ELF-ish defaults, since that's pretty much the most liberal
5623
   wrt cross-module name binding.  */
5624
 
5625
bool
5626
default_binds_local_p (tree exp)
5627
{
5628
  return default_binds_local_p_1 (exp, flag_shlib);
5629
}
5630
 
5631
bool
5632
default_binds_local_p_1 (tree exp, int shlib)
5633
{
5634
  bool local_p;
5635
 
5636
  /* A non-decl is an entry in the constant pool.  */
5637
  if (!DECL_P (exp))
5638
    local_p = true;
5639
  /* Static variables are always local.  */
5640
  else if (! TREE_PUBLIC (exp))
5641
    local_p = true;
5642
  /* A variable is local if the user explicitly tells us so.  */
5643
  else if (DECL_VISIBILITY_SPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5644
    local_p = true;
5645
  /* Otherwise, variables defined outside this object may not be local.  */
5646
  else if (DECL_EXTERNAL (exp))
5647
    local_p = false;
5648
  /* Linkonce and weak data are never local.  */
5649
  else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
5650
    local_p = false;
5651
  /* If none of the above and visibility is not default, make local.  */
5652
  else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5653
    local_p = true;
5654
  /* If PIC, then assume that any global name can be overridden by
5655
     symbols resolved from other modules.  */
5656
  else if (shlib)
5657
    local_p = false;
5658
  /* Uninitialized COMMON variable may be unified with symbols
5659
     resolved from other modules.  */
5660
  else if (DECL_COMMON (exp)
5661
           && (DECL_INITIAL (exp) == NULL
5662
               || DECL_INITIAL (exp) == error_mark_node))
5663
    local_p = false;
5664
  /* Otherwise we're left with initialized (or non-common) global data
5665
     which is of necessity defined locally.  */
5666
  else
5667
    local_p = true;
5668
 
5669
  return local_p;
5670
}
5671
 
5672
/* Determine whether or not a pointer mode is valid. Assume defaults
5673
   of ptr_mode or Pmode - can be overridden.  */
5674
bool
5675
default_valid_pointer_mode (enum machine_mode mode)
5676
{
5677
  return (mode == ptr_mode || mode == Pmode);
5678
}
5679
 
5680
/* Default function to output code that will globalize a label.  A
5681
   target must define GLOBAL_ASM_OP or provide its own function to
5682
   globalize a label.  */
5683
#ifdef GLOBAL_ASM_OP
5684
void
5685
default_globalize_label (FILE * stream, const char *name)
5686
{
5687
  fputs (GLOBAL_ASM_OP, stream);
5688
  assemble_name (stream, name);
5689
  putc ('\n', stream);
5690
}
5691
#endif /* GLOBAL_ASM_OP */
5692
 
5693
/* Default function to output a label for unwind information.  The
5694
   default is to do nothing.  A target that needs nonlocal labels for
5695
   unwind information must provide its own function to do this.  */
5696
void
5697
default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5698
                           tree decl ATTRIBUTE_UNUSED,
5699
                           int for_eh ATTRIBUTE_UNUSED,
5700
                           int empty ATTRIBUTE_UNUSED)
5701
{
5702
}
5703
 
5704
/* This is how to output an internal numbered label where PREFIX is
5705
   the class of label and LABELNO is the number within the class.  */
5706
 
5707
void
5708
default_internal_label (FILE *stream, const char *prefix,
5709
                        unsigned long labelno)
5710
{
5711
  char *const buf = alloca (40 + strlen (prefix));
5712
  ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5713
  ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
5714
}
5715
 
5716
/* This is the default behavior at the beginning of a file.  It's
5717
   controlled by two other target-hook toggles.  */
5718
void
5719
default_file_start (void)
5720
{
5721
  if (targetm.file_start_app_off && !flag_verbose_asm)
5722
    fputs (ASM_APP_OFF, asm_out_file);
5723
 
5724
  if (targetm.file_start_file_directive)
5725
    output_file_directive (asm_out_file, main_input_filename);
5726
}
5727
 
5728
/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5729
   which emits a special section directive used to indicate whether or
5730
   not this object file needs an executable stack.  This is primarily
5731
   a GNU extension to ELF but could be used on other targets.  */
5732
 
5733
int trampolines_created;
5734
 
5735
void
5736
file_end_indicate_exec_stack (void)
5737
{
5738
  unsigned int flags = SECTION_DEBUG;
5739
  if (trampolines_created)
5740
    flags |= SECTION_CODE;
5741
 
5742
  named_section_flags (".note.GNU-stack", flags);
5743
}
5744
 
5745
#include "gt-varasm.h"

powered by: WebSVN 2.1.0

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