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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 684 jeremybenn
/* 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, 2006, 2007, 2008, 2009,
4
   2010, 2011  Free Software Foundation, Inc.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
 
23
/* This file handles generation of all the assembler code
24
   *except* the instructions of a function.
25
   This includes declarations of variables and their initial values.
26
 
27
   We also output the assembler code for constants stored in memory
28
   and are responsible for combining constants with the same value.  */
29
 
30
#include "config.h"
31
#include "system.h"
32
#include "coretypes.h"
33
#include "tm.h"
34
#include "rtl.h"
35
#include "tree.h"
36
#include "flags.h"
37
#include "function.h"
38
#include "expr.h"
39
#include "hard-reg-set.h"
40
#include "regs.h"
41
#include "output.h"
42
#include "diagnostic-core.h"
43
#include "hashtab.h"
44
#include "ggc.h"
45
#include "langhooks.h"
46
#include "tm_p.h"
47
#include "debug.h"
48
#include "target.h"
49
#include "common/common-target.h"
50
#include "targhooks.h"
51
#include "tree-mudflap.h"
52
#include "cgraph.h"
53
#include "cfglayout.h"
54
#include "basic-block.h"
55
#include "tree-iterator.h"
56
#include "pointer-set.h"
57
 
58
#ifdef XCOFF_DEBUGGING_INFO
59
#include "xcoffout.h"           /* Needed for external data
60
                                   declarations for e.g. AIX 4.x.  */
61
#endif
62
 
63
/* The (assembler) name of the first globally-visible object output.  */
64
extern GTY(()) const char *first_global_object_name;
65
extern GTY(()) const char *weak_global_object_name;
66
 
67
const char *first_global_object_name;
68
const char *weak_global_object_name;
69
 
70
struct addr_const;
71
struct constant_descriptor_rtx;
72
struct rtx_constant_pool;
73
 
74
#define n_deferred_constants (crtl->varasm.deferred_constants)
75
 
76
/* Number for making the label on the next
77
   constant that is stored in memory.  */
78
 
79
static GTY(()) int const_labelno;
80
 
81
/* Carry information from ASM_DECLARE_OBJECT_NAME
82
   to ASM_FINISH_DECLARE_OBJECT.  */
83
 
84
int size_directive_output;
85
 
86
/* The last decl for which assemble_variable was called,
87
   if it did ASM_DECLARE_OBJECT_NAME.
88
   If the last call to assemble_variable didn't do that,
89
   this holds 0.  */
90
 
91
tree last_assemble_variable_decl;
92
 
93
/* The following global variable indicates if the first basic block
94
   in a function belongs to the cold partition or not.  */
95
 
96
bool first_function_block_is_cold;
97
 
98
/* We give all constants their own alias set.  Perhaps redundant with
99
   MEM_READONLY_P, but pre-dates it.  */
100
 
101
static alias_set_type const_alias_set;
102
 
103
/* Whether we saw any functions with no_split_stack.  */
104
 
105
static bool saw_no_split_stack;
106
 
107
static const char *strip_reg_name (const char *);
108
static int contains_pointers_p (tree);
109
#ifdef ASM_OUTPUT_EXTERNAL
110
static bool incorporeal_function_p (tree);
111
#endif
112
static void decode_addr_const (tree, struct addr_const *);
113
static hashval_t const_desc_hash (const void *);
114
static int const_desc_eq (const void *, const void *);
115
static hashval_t const_hash_1 (const tree);
116
static int compare_constant (const tree, const tree);
117
static tree copy_constant (tree);
118
static void output_constant_def_contents (rtx);
119
static void output_addressed_constants (tree);
120
static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
121
static unsigned min_align (unsigned, unsigned);
122
static void globalize_decl (tree);
123
static bool decl_readonly_section_1 (enum section_category);
124
#ifdef BSS_SECTION_ASM_OP
125
#ifdef ASM_OUTPUT_ALIGNED_BSS
126
static void asm_output_aligned_bss (FILE *, tree, const char *,
127
                                    unsigned HOST_WIDE_INT, int)
128
     ATTRIBUTE_UNUSED;
129
#endif
130
#endif /* BSS_SECTION_ASM_OP */
131
static void mark_weak (tree);
132
static void output_constant_pool (const char *, tree);
133
 
134
/* Well-known sections, each one associated with some sort of *_ASM_OP.  */
135
section *text_section;
136
section *data_section;
137
section *readonly_data_section;
138
section *sdata_section;
139
section *ctors_section;
140
section *dtors_section;
141
section *bss_section;
142
section *sbss_section;
143
 
144
/* Various forms of common section.  All are guaranteed to be nonnull.  */
145
section *tls_comm_section;
146
section *comm_section;
147
section *lcomm_section;
148
 
149
/* A SECTION_NOSWITCH section used for declaring global BSS variables.
150
   May be null.  */
151
section *bss_noswitch_section;
152
 
153
/* The section that holds the main exception table, when known.  The section
154
   is set either by the target's init_sections hook or by the first call to
155
   switch_to_exception_section.  */
156
section *exception_section;
157
 
158
/* The section that holds the DWARF2 frame unwind information, when known.
159
   The section is set either by the target's init_sections hook or by the
160
   first call to switch_to_eh_frame_section.  */
161
section *eh_frame_section;
162
 
163
/* asm_out_file's current section.  This is NULL if no section has yet
164
   been selected or if we lose track of what the current section is.  */
165
section *in_section;
166
 
167
/* True if code for the current function is currently being directed
168
   at the cold section.  */
169
bool in_cold_section_p;
170
 
171
/* A linked list of all the unnamed sections.  */
172
static GTY(()) section *unnamed_sections;
173
 
174
/* Return a nonzero value if DECL has a section attribute.  */
175
#define IN_NAMED_SECTION(DECL) \
176
  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
177
   && DECL_SECTION_NAME (DECL) != NULL_TREE)
178
 
179
/* Hash table of named sections.  */
180
static GTY((param_is (section))) htab_t section_htab;
181
 
182
/* A table of object_blocks, indexed by section.  */
183
static GTY((param_is (struct object_block))) htab_t object_block_htab;
184
 
185
/* The next number to use for internal anchor labels.  */
186
static GTY(()) int anchor_labelno;
187
 
188
/* A pool of constants that can be shared between functions.  */
189
static GTY(()) struct rtx_constant_pool *shared_constant_pool;
190
 
191
/* Helper routines for maintaining section_htab.  */
192
 
193
static int
194
section_entry_eq (const void *p1, const void *p2)
195
{
196
  const section *old = (const section *) p1;
197
  const char *new_name = (const char *) p2;
198
 
199
  return strcmp (old->named.name, new_name) == 0;
200
}
201
 
202
static hashval_t
203
section_entry_hash (const void *p)
204
{
205
  const section *old = (const section *) p;
206
  return htab_hash_string (old->named.name);
207
}
208
 
209
/* Return a hash value for section SECT.  */
210
 
211
static hashval_t
212
hash_section (section *sect)
213
{
214
  if (sect->common.flags & SECTION_NAMED)
215
    return htab_hash_string (sect->named.name);
216
  return sect->common.flags;
217
}
218
 
219
/* Helper routines for maintaining object_block_htab.  */
220
 
221
static int
222
object_block_entry_eq (const void *p1, const void *p2)
223
{
224
  const struct object_block *old = (const struct object_block *) p1;
225
  const section *new_section = (const section *) p2;
226
 
227
  return old->sect == new_section;
228
}
229
 
230
static hashval_t
231
object_block_entry_hash (const void *p)
232
{
233
  const struct object_block *old = (const struct object_block *) p;
234
  return hash_section (old->sect);
235
}
236
 
237
/* Return a new unnamed section with the given fields.  */
238
 
239
section *
240
get_unnamed_section (unsigned int flags, void (*callback) (const void *),
241
                     const void *data)
242
{
243
  section *sect;
244
 
245
  sect = ggc_alloc_section ();
246
  sect->unnamed.common.flags = flags | SECTION_UNNAMED;
247
  sect->unnamed.callback = callback;
248
  sect->unnamed.data = data;
249
  sect->unnamed.next = unnamed_sections;
250
 
251
  unnamed_sections = sect;
252
  return sect;
253
}
254
 
255
/* Return a SECTION_NOSWITCH section with the given fields.  */
256
 
257
static section *
258
get_noswitch_section (unsigned int flags, noswitch_section_callback callback)
259
{
260
  section *sect;
261
 
262
  sect = ggc_alloc_section ();
263
  sect->noswitch.common.flags = flags | SECTION_NOSWITCH;
264
  sect->noswitch.callback = callback;
265
 
266
  return sect;
267
}
268
 
269
/* Return the named section structure associated with NAME.  Create
270
   a new section with the given fields if no such structure exists.  */
271
 
272
section *
273
get_section (const char *name, unsigned int flags, tree decl)
274
{
275
  section *sect, **slot;
276
 
277
  slot = (section **)
278
    htab_find_slot_with_hash (section_htab, name,
279
                              htab_hash_string (name), INSERT);
280
  flags |= SECTION_NAMED;
281
  if (*slot == NULL)
282
    {
283
      sect = ggc_alloc_section ();
284
      sect->named.common.flags = flags;
285
      sect->named.name = ggc_strdup (name);
286
      sect->named.decl = decl;
287
      *slot = sect;
288
    }
289
  else
290
    {
291
      sect = *slot;
292
      if ((sect->common.flags & ~SECTION_DECLARED) != flags
293
          && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0)
294
        {
295
          /* It is fine if one of the section flags is
296
             SECTION_WRITE | SECTION_RELRO and the other has none of these
297
             flags (i.e. read-only) in named sections and either the
298
             section hasn't been declared yet or has been declared as writable.
299
             In that case just make sure the resulting flags are
300
             SECTION_WRITE | SECTION_RELRO, ie. writable only because of
301
             relocations.  */
302
          if (((sect->common.flags ^ flags) & (SECTION_WRITE | SECTION_RELRO))
303
              == (SECTION_WRITE | SECTION_RELRO)
304
              && (sect->common.flags
305
                  & ~(SECTION_DECLARED | SECTION_WRITE | SECTION_RELRO))
306
                 == (flags & ~(SECTION_WRITE | SECTION_RELRO))
307
              && ((sect->common.flags & SECTION_DECLARED) == 0
308
                  || (sect->common.flags & SECTION_WRITE)))
309
            {
310
              sect->common.flags |= (SECTION_WRITE | SECTION_RELRO);
311
              return sect;
312
            }
313
          /* Sanity check user variables for flag changes.  */
314
          if (decl == 0)
315
            decl = sect->named.decl;
316
          gcc_assert (decl);
317
          error ("%+D causes a section type conflict with %D",
318
                        decl, sect->named.decl);
319
          if (decl != sect->named.decl)
320
            inform (DECL_SOURCE_LOCATION (sect->named.decl),
321
                    "%qD was declared here", sect->named.decl);
322
          /* Make sure we don't error about one section multiple times.  */
323
          sect->common.flags |= SECTION_OVERRIDE;
324
        }
325
    }
326
  return sect;
327
}
328
 
329
/* Return true if the current compilation mode benefits from having
330
   objects grouped into blocks.  */
331
 
332
static bool
333
use_object_blocks_p (void)
334
{
335
  return flag_section_anchors;
336
}
337
 
338
/* Return the object_block structure for section SECT.  Create a new
339
   structure if we haven't created one already.  Return null if SECT
340
   itself is null.  */
341
 
342
static struct object_block *
343
get_block_for_section (section *sect)
344
{
345
  struct object_block *block;
346
  void **slot;
347
 
348
  if (sect == NULL)
349
    return NULL;
350
 
351
  slot = htab_find_slot_with_hash (object_block_htab, sect,
352
                                   hash_section (sect), INSERT);
353
  block = (struct object_block *) *slot;
354
  if (block == NULL)
355
    {
356
      block = ggc_alloc_cleared_object_block ();
357
      block->sect = sect;
358
      *slot = block;
359
    }
360
  return block;
361
}
362
 
363
/* Create a symbol with label LABEL and place it at byte offset
364
   OFFSET in BLOCK.  OFFSET can be negative if the symbol's offset
365
   is not yet known.  LABEL must be a garbage-collected string.  */
366
 
367
static rtx
368
create_block_symbol (const char *label, struct object_block *block,
369
                     HOST_WIDE_INT offset)
370
{
371
  rtx symbol;
372
  unsigned int size;
373
 
374
  /* Create the extended SYMBOL_REF.  */
375
  size = RTX_HDR_SIZE + sizeof (struct block_symbol);
376
  symbol = ggc_alloc_zone_rtx_def (size, &rtl_zone);
377
 
378
  /* Initialize the normal SYMBOL_REF fields.  */
379
  memset (symbol, 0, size);
380
  PUT_CODE (symbol, SYMBOL_REF);
381
  PUT_MODE (symbol, Pmode);
382
  XSTR (symbol, 0) = label;
383
  SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_HAS_BLOCK_INFO;
384
 
385
  /* Initialize the block_symbol stuff.  */
386
  SYMBOL_REF_BLOCK (symbol) = block;
387
  SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
388
 
389
  return symbol;
390
}
391
 
392
/* Return a section with a particular name and with whatever SECTION_*
393
   flags section_type_flags deems appropriate.  The name of the section
394
   is taken from NAME if nonnull, otherwise it is taken from DECL's
395
   DECL_SECTION_NAME.  DECL is the decl associated with the section
396
   (see the section comment for details) and RELOC is as for
397
   section_type_flags.  */
398
 
399
section *
400
get_named_section (tree decl, const char *name, int reloc)
401
{
402
  unsigned int flags;
403
 
404
  gcc_assert (!decl || DECL_P (decl));
405
  if (name == NULL)
406
    name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
407
 
408
  flags = targetm.section_type_flags (decl, name, reloc);
409
 
410
  return get_section (name, flags, decl);
411
}
412
 
413
/* If required, set DECL_SECTION_NAME to a unique name.  */
414
 
415
void
416
resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
417
                        int flag_function_or_data_sections)
418
{
419
  if (DECL_SECTION_NAME (decl) == NULL_TREE
420
      && targetm_common.have_named_sections
421
      && (flag_function_or_data_sections
422
          || DECL_ONE_ONLY (decl)))
423
    {
424
      targetm.asm_out.unique_section (decl, reloc);
425
      DECL_HAS_IMPLICIT_SECTION_NAME_P (decl) = true;
426
    }
427
}
428
 
429
#ifdef BSS_SECTION_ASM_OP
430
 
431
#ifdef ASM_OUTPUT_ALIGNED_BSS
432
 
433
/* Utility function for targets to use in implementing
434
   ASM_OUTPUT_ALIGNED_BSS.
435
   ??? It is believed that this function will work in most cases so such
436
   support is localized here.  */
437
 
438
static void
439
asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
440
                        const char *name, unsigned HOST_WIDE_INT size,
441
                        int align)
442
{
443
  switch_to_section (bss_section);
444
  ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
445
#ifdef ASM_DECLARE_OBJECT_NAME
446
  last_assemble_variable_decl = decl;
447
  ASM_DECLARE_OBJECT_NAME (file, name, decl);
448
#else
449
  /* Standard thing is just output label for the object.  */
450
  ASM_OUTPUT_LABEL (file, name);
451
#endif /* ASM_DECLARE_OBJECT_NAME */
452
  ASM_OUTPUT_SKIP (file, size ? size : 1);
453
}
454
 
455
#endif
456
 
457
#endif /* BSS_SECTION_ASM_OP */
458
 
459
#ifndef USE_SELECT_SECTION_FOR_FUNCTIONS
460
/* Return the hot section for function DECL.  Return text_section for
461
   null DECLs.  */
462
 
463
static section *
464
hot_function_section (tree decl)
465
{
466
  if (decl != NULL_TREE
467
      && DECL_SECTION_NAME (decl) != NULL_TREE
468
      && targetm_common.have_named_sections)
469
    return get_named_section (decl, NULL, 0);
470
  else
471
    return text_section;
472
}
473
#endif
474
 
475
/* Return section for TEXT_SECTION_NAME if DECL or DECL_SECTION_NAME (DECL)
476
   is NULL.
477
 
478
   When DECL_SECTION_NAME is non-NULL and it is implicit section and
479
   NAMED_SECTION_SUFFIX is non-NULL, then produce section called
480
   concatenate the name with NAMED_SECTION_SUFFIX.
481
   Otherwise produce "TEXT_SECTION_NAME.IMPLICIT_NAME".  */
482
 
483
section *
484
get_named_text_section (tree decl,
485
                        const char *text_section_name,
486
                        const char *named_section_suffix)
487
{
488
  if (decl && DECL_SECTION_NAME (decl))
489
    {
490
      if (named_section_suffix)
491
        {
492
          tree dsn = DECL_SECTION_NAME (decl);
493
          const char *stripped_name;
494
          char *name, *buffer;
495
 
496
          name = (char *) alloca (TREE_STRING_LENGTH (dsn) + 1);
497
          memcpy (name, TREE_STRING_POINTER (dsn),
498
                  TREE_STRING_LENGTH (dsn) + 1);
499
 
500
          stripped_name = targetm.strip_name_encoding (name);
501
 
502
          buffer = ACONCAT ((stripped_name, named_section_suffix, NULL));
503
          return get_named_section (decl, buffer, 0);
504
        }
505
      else if (DECL_HAS_IMPLICIT_SECTION_NAME_P (decl))
506
        {
507
          const char *name;
508
 
509
          /* Do not try to split gnu_linkonce functions.  This gets somewhat
510
             slipperly.  */
511
          if (DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP)
512
            return NULL;
513
          name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
514
          name = targetm.strip_name_encoding (name);
515
          return get_named_section (decl, ACONCAT ((text_section_name, ".",
516
                                                   name, NULL)), 0);
517
        }
518
      else
519
        return NULL;
520
    }
521
  return get_named_section (decl, text_section_name, 0);
522
}
523
 
524
/* Choose named function section based on its frequency.  */
525
 
526
section *
527
default_function_section (tree decl, enum node_frequency freq,
528
                          bool startup, bool exit)
529
{
530
#if defined HAVE_LD_EH_GC_SECTIONS && defined HAVE_LD_EH_GC_SECTIONS_BUG
531
  /* Old GNU linkers have buggy --gc-section support, which sometimes
532
     results in .gcc_except_table* sections being garbage collected.  */
533
  if (decl
534
      && DECL_SECTION_NAME (decl)
535
      && DECL_HAS_IMPLICIT_SECTION_NAME_P (decl))
536
    return NULL;
537
#endif
538
 
539
  if (!flag_reorder_functions
540
      || !targetm_common.have_named_sections)
541
    return NULL;
542
  /* Startup code should go to startup subsection unless it is
543
     unlikely executed (this happens especially with function splitting
544
     where we can split away unnecesary parts of static constructors.  */
545
  if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
546
    return get_named_text_section (decl, ".text.startup", NULL);
547
 
548
  /* Similarly for exit.  */
549
  if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
550
    return get_named_text_section (decl, ".text.exit", NULL);
551
 
552
  /* Group cold functions together, similarly for hot code.  */
553
  switch (freq)
554
    {
555
      case NODE_FREQUENCY_UNLIKELY_EXECUTED:
556
        return get_named_text_section (decl, ".text.unlikely", NULL);
557
      case NODE_FREQUENCY_HOT:
558
        return get_named_text_section (decl, ".text.hot", NULL);
559
      default:
560
        return NULL;
561
    }
562
}
563
 
564
/* Return the section for function DECL.
565
 
566
   If DECL is NULL_TREE, return the text section.  We can be passed
567
   NULL_TREE under some circumstances by dbxout.c at least.
568
 
569
   If FORCE_COLD is true, return cold function section ignoring
570
   the frequency info of cgraph_node.  */
571
 
572
static section *
573
function_section_1 (tree decl, bool force_cold)
574
{
575
  section *section = NULL;
576
  enum node_frequency freq = NODE_FREQUENCY_NORMAL;
577
  bool startup = false, exit = false;
578
 
579
  if (decl)
580
    {
581
      struct cgraph_node *node = cgraph_get_node (decl);
582
 
583
      if (node)
584
        {
585
          freq = node->frequency;
586
          startup = node->only_called_at_startup;
587
          exit = node->only_called_at_exit;
588
        }
589
    }
590
  if (force_cold)
591
    freq = NODE_FREQUENCY_UNLIKELY_EXECUTED;
592
 
593
#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
594
  if (decl != NULL_TREE
595
      && DECL_SECTION_NAME (decl) != NULL_TREE)
596
    {
597
      if (targetm.asm_out.function_section)
598
        section = targetm.asm_out.function_section (decl, freq,
599
                                                    startup, exit);
600
      if (section)
601
        return section;
602
      return get_named_section (decl, NULL, 0);
603
    }
604
  else
605
    return targetm.asm_out.select_section
606
            (decl, freq == NODE_FREQUENCY_UNLIKELY_EXECUTED,
607
             DECL_ALIGN (decl));
608
#else
609
  if (targetm.asm_out.function_section)
610
    section = targetm.asm_out.function_section (decl, freq, startup, exit);
611
  if (section)
612
    return section;
613
  return hot_function_section (decl);
614
#endif
615
}
616
 
617
/* Return the section for function DECL.
618
 
619
   If DECL is NULL_TREE, return the text section.  We can be passed
620
   NULL_TREE under some circumstances by dbxout.c at least.  */
621
 
622
section *
623
function_section (tree decl)
624
{
625
  /* Handle cases where function splitting code decides
626
     to put function entry point into unlikely executed section
627
     despite the fact that the function itself is not cold
628
     (i.e. it is called rarely but contains a hot loop that is
629
     better to live in hot subsection for the code locality).  */
630
  return function_section_1 (decl,
631
                             first_function_block_is_cold);
632
}
633
 
634
/* Return the section for the current function, take IN_COLD_SECTION_P
635
   into account.  */
636
 
637
section *
638
current_function_section (void)
639
{
640
  return function_section_1 (current_function_decl, in_cold_section_p);
641
}
642
 
643
/* Tell assembler to switch to unlikely-to-be-executed text section.  */
644
 
645
section *
646
unlikely_text_section (void)
647
{
648
  return function_section_1 (current_function_decl, true);
649
}
650
 
651
/* When called within a function context, return true if the function
652
   has been assigned a cold text section and if SECT is that section.
653
   When called outside a function context, return true if SECT is the
654
   default cold section.  */
655
 
656
bool
657
unlikely_text_section_p (section *sect)
658
{
659
  return sect == function_section_1 (current_function_decl, true);
660
}
661
 
662
/* Return the read-only data section associated with function DECL.  */
663
 
664
section *
665
default_function_rodata_section (tree decl)
666
{
667
  if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
668
    {
669
      const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
670
 
671
      if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP)
672
        {
673
          const char *dot;
674
          size_t len;
675
          char* rname;
676
 
677
          dot = strchr (name + 1, '.');
678
          if (!dot)
679
            dot = name;
680
          len = strlen (dot) + 8;
681
          rname = (char *) alloca (len);
682
 
683
          strcpy (rname, ".rodata");
684
          strcat (rname, dot);
685
          return get_section (rname, SECTION_LINKONCE, decl);
686
        }
687
      /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo.  */
688
      else if (DECL_ONE_ONLY (decl)
689
               && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
690
        {
691
          size_t len = strlen (name) + 1;
692
          char *rname = (char *) alloca (len);
693
 
694
          memcpy (rname, name, len);
695
          rname[14] = 'r';
696
          return get_section (rname, SECTION_LINKONCE, decl);
697
        }
698
      /* For .text.foo we want to use .rodata.foo.  */
699
      else if (flag_function_sections && flag_data_sections
700
               && strncmp (name, ".text.", 6) == 0)
701
        {
702
          size_t len = strlen (name) + 1;
703
          char *rname = (char *) alloca (len + 2);
704
 
705
          memcpy (rname, ".rodata", 7);
706
          memcpy (rname + 7, name + 5, len - 5);
707
          return get_section (rname, 0, decl);
708
        }
709
    }
710
 
711
  return readonly_data_section;
712
}
713
 
714
/* Return the read-only data section associated with function DECL
715
   for targets where that section should be always the single
716
   readonly data section.  */
717
 
718
section *
719
default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
720
{
721
  return readonly_data_section;
722
}
723
 
724
/* Return the section to use for string merging.  */
725
 
726
static section *
727
mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
728
                          unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
729
                          unsigned int flags ATTRIBUTE_UNUSED)
730
{
731
  HOST_WIDE_INT len;
732
 
733
  if (HAVE_GAS_SHF_MERGE && flag_merge_constants
734
      && TREE_CODE (decl) == STRING_CST
735
      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
736
      && align <= 256
737
      && (len = int_size_in_bytes (TREE_TYPE (decl))) > 0
738
      && TREE_STRING_LENGTH (decl) >= len)
739
    {
740
      enum machine_mode mode;
741
      unsigned int modesize;
742
      const char *str;
743
      HOST_WIDE_INT i;
744
      int j, unit;
745
      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
746
      char *name = (char *) alloca (strlen (prefix) + 30);
747
 
748
      mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
749
      modesize = GET_MODE_BITSIZE (mode);
750
      if (modesize >= 8 && modesize <= 256
751
          && (modesize & (modesize - 1)) == 0)
752
        {
753
          if (align < modesize)
754
            align = modesize;
755
 
756
          str = TREE_STRING_POINTER (decl);
757
          unit = GET_MODE_SIZE (mode);
758
 
759
          /* Check for embedded NUL characters.  */
760
          for (i = 0; i < len; i += unit)
761
            {
762
              for (j = 0; j < unit; j++)
763
                if (str[i + j] != '\0')
764
                  break;
765
              if (j == unit)
766
                break;
767
            }
768
          if (i == len - unit)
769
            {
770
              sprintf (name, "%s.str%d.%d", prefix,
771
                       modesize / 8, (int) (align / 8));
772
              flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
773
              return get_section (name, flags, NULL);
774
            }
775
        }
776
    }
777
 
778
  return readonly_data_section;
779
}
780
 
781
/* Return the section to use for constant merging.  */
782
 
783
section *
784
mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
785
                            unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
786
                            unsigned int flags ATTRIBUTE_UNUSED)
787
{
788
  unsigned int modesize = GET_MODE_BITSIZE (mode);
789
 
790
  if (HAVE_GAS_SHF_MERGE && flag_merge_constants
791
      && mode != VOIDmode
792
      && mode != BLKmode
793
      && modesize <= align
794
      && align >= 8
795
      && align <= 256
796
      && (align & (align - 1)) == 0)
797
    {
798
      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
799
      char *name = (char *) alloca (strlen (prefix) + 30);
800
 
801
      sprintf (name, "%s.cst%d", prefix, (int) (align / 8));
802
      flags |= (align / 8) | SECTION_MERGE;
803
      return get_section (name, flags, NULL);
804
    }
805
  return readonly_data_section;
806
}
807
 
808
/* Given NAME, a putative register name, discard any customary prefixes.  */
809
 
810
static const char *
811
strip_reg_name (const char *name)
812
{
813
#ifdef REGISTER_PREFIX
814
  if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
815
    name += strlen (REGISTER_PREFIX);
816
#endif
817
  if (name[0] == '%' || name[0] == '#')
818
    name++;
819
  return name;
820
}
821
 
822
/* The user has asked for a DECL to have a particular name.  Set (or
823
   change) it in such a way that we don't prefix an underscore to
824
   it.  */
825
void
826
set_user_assembler_name (tree decl, const char *name)
827
{
828
  char *starred = (char *) alloca (strlen (name) + 2);
829
  starred[0] = '*';
830
  strcpy (starred + 1, name);
831
  change_decl_assembler_name (decl, get_identifier (starred));
832
  SET_DECL_RTL (decl, NULL_RTX);
833
}
834
 
835
/* Decode an `asm' spec for a declaration as a register name.
836
   Return the register number, or -1 if nothing specified,
837
   or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
838
   or -3 if ASMSPEC is `cc' and is not recognized,
839
   or -4 if ASMSPEC is `memory' and is not recognized.
840
   Accept an exact spelling or a decimal number.
841
   Prefixes such as % are optional.  */
842
 
843
int
844
decode_reg_name_and_count (const char *asmspec, int *pnregs)
845
{
846
  /* Presume just one register is clobbered.  */
847
  *pnregs = 1;
848
 
849
  if (asmspec != 0)
850
    {
851
      int i;
852
 
853
      /* Get rid of confusing prefixes.  */
854
      asmspec = strip_reg_name (asmspec);
855
 
856
      /* Allow a decimal number as a "register name".  */
857
      for (i = strlen (asmspec) - 1; i >= 0; i--)
858
        if (! ISDIGIT (asmspec[i]))
859
          break;
860
      if (asmspec[0] != 0 && i < 0)
861
        {
862
          i = atoi (asmspec);
863
          if (i < FIRST_PSEUDO_REGISTER && i >= 0)
864
            return i;
865
          else
866
            return -2;
867
        }
868
 
869
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
870
        if (reg_names[i][0]
871
            && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
872
          return i;
873
 
874
#ifdef OVERLAPPING_REGISTER_NAMES
875
      {
876
        static const struct
877
        {
878
          const char *const name;
879
          const int number;
880
          const int nregs;
881
        } table[] = OVERLAPPING_REGISTER_NAMES;
882
 
883
        for (i = 0; i < (int) ARRAY_SIZE (table); i++)
884
          if (table[i].name[0]
885
              && ! strcmp (asmspec, table[i].name))
886
            {
887
              *pnregs = table[i].nregs;
888
              return table[i].number;
889
            }
890
      }
891
#endif /* OVERLAPPING_REGISTER_NAMES */
892
 
893
#ifdef ADDITIONAL_REGISTER_NAMES
894
      {
895
        static const struct { const char *const name; const int number; } table[]
896
          = ADDITIONAL_REGISTER_NAMES;
897
 
898
        for (i = 0; i < (int) ARRAY_SIZE (table); i++)
899
          if (table[i].name[0]
900
              && ! strcmp (asmspec, table[i].name))
901
            return table[i].number;
902
      }
903
#endif /* ADDITIONAL_REGISTER_NAMES */
904
 
905
      if (!strcmp (asmspec, "memory"))
906
        return -4;
907
 
908
      if (!strcmp (asmspec, "cc"))
909
        return -3;
910
 
911
      return -2;
912
    }
913
 
914
  return -1;
915
}
916
 
917
int
918
decode_reg_name (const char *name)
919
{
920
  int count;
921
  return decode_reg_name_and_count (name, &count);
922
}
923
 
924
 
925
/* Return true if DECL's initializer is suitable for a BSS section.  */
926
 
927
static bool
928
bss_initializer_p (const_tree decl)
929
{
930
  return (DECL_INITIAL (decl) == NULL
931
          || DECL_INITIAL (decl) == error_mark_node
932
          || (flag_zero_initialized_in_bss
933
              /* Leave constant zeroes in .rodata so they
934
                 can be shared.  */
935
              && !TREE_READONLY (decl)
936
              && initializer_zerop (DECL_INITIAL (decl))));
937
}
938
 
939
/* Compute the alignment of variable specified by DECL.
940
   DONT_OUTPUT_DATA is from assemble_variable.  */
941
 
942
void
943
align_variable (tree decl, bool dont_output_data)
944
{
945
  unsigned int align = DECL_ALIGN (decl);
946
 
947
  /* In the case for initialing an array whose length isn't specified,
948
     where we have not yet been able to do the layout,
949
     figure out the proper alignment now.  */
950
  if (dont_output_data && DECL_SIZE (decl) == 0
951
      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
952
    align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
953
 
954
  /* Some object file formats have a maximum alignment which they support.
955
     In particular, a.out format supports a maximum alignment of 4.  */
956
  if (align > MAX_OFILE_ALIGNMENT)
957
    {
958
      warning (0, "alignment of %q+D is greater than maximum object "
959
               "file alignment.  Using %d", decl,
960
               MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
961
      align = MAX_OFILE_ALIGNMENT;
962
    }
963
 
964
  /* On some machines, it is good to increase alignment sometimes.  */
965
  if (! DECL_USER_ALIGN (decl))
966
    {
967
#ifdef DATA_ALIGNMENT
968
      unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
969
      /* Don't increase alignment too much for TLS variables - TLS space
970
         is too precious.  */
971
      if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
972
        align = data_align;
973
#endif
974
#ifdef CONSTANT_ALIGNMENT
975
      if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
976
        {
977
          unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),
978
                                                         align);
979
          /* Don't increase alignment too much for TLS variables - TLS space
980
             is too precious.  */
981
          if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
982
            align = const_align;
983
        }
984
#endif
985
    }
986
 
987
  /* Reset the alignment in case we have made it tighter, so we can benefit
988
     from it in get_pointer_alignment.  */
989
  DECL_ALIGN (decl) = align;
990
}
991
 
992
/* Return the section into which the given VAR_DECL or CONST_DECL
993
   should be placed.  PREFER_NOSWITCH_P is true if a noswitch
994
   section should be used wherever possible.  */
995
 
996
section *
997
get_variable_section (tree decl, bool prefer_noswitch_p)
998
{
999
  addr_space_t as = ADDR_SPACE_GENERIC;
1000
  int reloc;
1001
 
1002
  if (TREE_TYPE (decl) != error_mark_node)
1003
    as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
1004
 
1005
  if (DECL_COMMON (decl))
1006
    {
1007
      /* If the decl has been given an explicit section name, or it resides
1008
         in a non-generic address space, then it isn't common, and shouldn't
1009
         be handled as such.  */
1010
      gcc_assert (DECL_SECTION_NAME (decl) == NULL
1011
                  && ADDR_SPACE_GENERIC_P (as));
1012
      if (DECL_THREAD_LOCAL_P (decl))
1013
        return tls_comm_section;
1014
      else if (TREE_PUBLIC (decl) && bss_initializer_p (decl))
1015
        return comm_section;
1016
    }
1017
 
1018
  if (DECL_INITIAL (decl) == error_mark_node)
1019
    reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1020
  else if (DECL_INITIAL (decl))
1021
    reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1022
  else
1023
    reloc = 0;
1024
 
1025
  resolve_unique_section (decl, reloc, flag_data_sections);
1026
  if (IN_NAMED_SECTION (decl))
1027
    return get_named_section (decl, NULL, reloc);
1028
 
1029
  if (ADDR_SPACE_GENERIC_P (as)
1030
      && !DECL_THREAD_LOCAL_P (decl)
1031
      && !(prefer_noswitch_p && targetm.have_switchable_bss_sections)
1032
      && bss_initializer_p (decl))
1033
    {
1034
      if (!TREE_PUBLIC (decl))
1035
        return lcomm_section;
1036
      if (bss_noswitch_section)
1037
        return bss_noswitch_section;
1038
    }
1039
 
1040
  return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
1041
}
1042
 
1043
/* Return the block into which object_block DECL should be placed.  */
1044
 
1045
static struct object_block *
1046
get_block_for_decl (tree decl)
1047
{
1048
  section *sect;
1049
 
1050
  if (TREE_CODE (decl) == VAR_DECL)
1051
    {
1052
      /* The object must be defined in this translation unit.  */
1053
      if (DECL_EXTERNAL (decl))
1054
        return NULL;
1055
 
1056
      /* There's no point using object blocks for something that is
1057
         isolated by definition.  */
1058
      if (DECL_ONE_ONLY (decl))
1059
        return NULL;
1060
    }
1061
 
1062
  /* We can only calculate block offsets if the decl has a known
1063
     constant size.  */
1064
  if (DECL_SIZE_UNIT (decl) == NULL)
1065
    return NULL;
1066
  if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
1067
    return NULL;
1068
 
1069
  /* Find out which section should contain DECL.  We cannot put it into
1070
     an object block if it requires a standalone definition.  */
1071
  if (TREE_CODE (decl) == VAR_DECL)
1072
      align_variable (decl, 0);
1073
  sect = get_variable_section (decl, true);
1074
  if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
1075
    return NULL;
1076
 
1077
  return get_block_for_section (sect);
1078
}
1079
 
1080
/* Make sure block symbol SYMBOL is in block BLOCK.  */
1081
 
1082
static void
1083
change_symbol_block (rtx symbol, struct object_block *block)
1084
{
1085
  if (block != SYMBOL_REF_BLOCK (symbol))
1086
    {
1087
      gcc_assert (SYMBOL_REF_BLOCK_OFFSET (symbol) < 0);
1088
      SYMBOL_REF_BLOCK (symbol) = block;
1089
    }
1090
}
1091
 
1092
/* Return true if it is possible to put DECL in an object_block.  */
1093
 
1094
static bool
1095
use_blocks_for_decl_p (tree decl)
1096
{
1097
  /* Only data DECLs can be placed into object blocks.  */
1098
  if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != CONST_DECL)
1099
    return false;
1100
 
1101
  /* Detect decls created by dw2_force_const_mem.  Such decls are
1102
     special because DECL_INITIAL doesn't specify the decl's true value.
1103
     dw2_output_indirect_constants will instead call assemble_variable
1104
     with dont_output_data set to 1 and then print the contents itself.  */
1105
  if (DECL_INITIAL (decl) == decl)
1106
    return false;
1107
 
1108
  /* If this decl is an alias, then we don't want to emit a
1109
     definition.  */
1110
  if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
1111
    return false;
1112
 
1113
  return true;
1114
}
1115
 
1116
/* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL.  DECL should
1117
   have static storage duration.  In other words, it should not be an
1118
   automatic variable, including PARM_DECLs.
1119
 
1120
   There is, however, one exception: this function handles variables
1121
   explicitly placed in a particular register by the user.
1122
 
1123
   This is never called for PARM_DECL nodes.  */
1124
 
1125
void
1126
make_decl_rtl (tree decl)
1127
{
1128
  const char *name = 0;
1129
  int reg_number;
1130
  rtx x;
1131
 
1132
  /* Check that we are not being given an automatic variable.  */
1133
  gcc_assert (TREE_CODE (decl) != PARM_DECL
1134
              && TREE_CODE (decl) != RESULT_DECL);
1135
 
1136
  /* A weak alias has TREE_PUBLIC set but not the other bits.  */
1137
  gcc_assert (TREE_CODE (decl) != VAR_DECL
1138
              || TREE_STATIC (decl)
1139
              || TREE_PUBLIC (decl)
1140
              || DECL_EXTERNAL (decl)
1141
              || DECL_REGISTER (decl));
1142
 
1143
  /* And that we were not given a type or a label.  */
1144
  gcc_assert (TREE_CODE (decl) != TYPE_DECL
1145
              && TREE_CODE (decl) != LABEL_DECL);
1146
 
1147
  /* For a duplicate declaration, we can be called twice on the
1148
     same DECL node.  Don't discard the RTL already made.  */
1149
  if (DECL_RTL_SET_P (decl))
1150
    {
1151
      /* If the old RTL had the wrong mode, fix the mode.  */
1152
      x = DECL_RTL (decl);
1153
      if (GET_MODE (x) != DECL_MODE (decl))
1154
        SET_DECL_RTL (decl, adjust_address_nv (x, DECL_MODE (decl), 0));
1155
 
1156
      if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
1157
        return;
1158
 
1159
      /* ??? Another way to do this would be to maintain a hashed
1160
         table of such critters.  Instead of adding stuff to a DECL
1161
         to give certain attributes to it, we could use an external
1162
         hash map from DECL to set of attributes.  */
1163
 
1164
      /* Let the target reassign the RTL if it wants.
1165
         This is necessary, for example, when one machine specific
1166
         decl attribute overrides another.  */
1167
      targetm.encode_section_info (decl, DECL_RTL (decl), false);
1168
 
1169
      /* If the symbol has a SYMBOL_REF_BLOCK field, update it based
1170
         on the new decl information.  */
1171
      if (MEM_P (x)
1172
          && GET_CODE (XEXP (x, 0)) == SYMBOL_REF
1173
          && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (x, 0)))
1174
        change_symbol_block (XEXP (x, 0), get_block_for_decl (decl));
1175
 
1176
      /* Make this function static known to the mudflap runtime.  */
1177
      if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1178
        mudflap_enqueue_decl (decl);
1179
 
1180
      return;
1181
    }
1182
 
1183
  /* If this variable belongs to the global constant pool, retrieve the
1184
     pre-computed RTL or recompute it in LTO mode.  */
1185
  if (TREE_CODE (decl) == VAR_DECL && DECL_IN_CONSTANT_POOL (decl))
1186
    {
1187
      SET_DECL_RTL (decl, output_constant_def (DECL_INITIAL (decl), 1));
1188
      return;
1189
    }
1190
 
1191
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1192
 
1193
  if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL
1194
      && DECL_REGISTER (decl))
1195
    {
1196
      error ("register name not specified for %q+D", decl);
1197
    }
1198
  else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
1199
    {
1200
      const char *asmspec = name+1;
1201
      enum machine_mode mode = DECL_MODE (decl);
1202
      reg_number = decode_reg_name (asmspec);
1203
      /* First detect errors in declaring global registers.  */
1204
      if (reg_number == -1)
1205
        error ("register name not specified for %q+D", decl);
1206
      else if (reg_number < 0)
1207
        error ("invalid register name for %q+D", decl);
1208
      else if (mode == BLKmode)
1209
        error ("data type of %q+D isn%'t suitable for a register",
1210
               decl);
1211
      else if (!in_hard_reg_set_p (accessible_reg_set, mode, reg_number))
1212
        error ("the register specified for %q+D cannot be accessed"
1213
               " by the current target", decl);
1214
      else if (!in_hard_reg_set_p (operand_reg_set, mode, reg_number))
1215
        error ("the register specified for %q+D is not general enough"
1216
               " to be used as a register variable", decl);
1217
      else if (!HARD_REGNO_MODE_OK (reg_number, mode))
1218
        error ("register specified for %q+D isn%'t suitable for data type",
1219
               decl);
1220
      /* Now handle properly declared static register variables.  */
1221
      else
1222
        {
1223
          int nregs;
1224
 
1225
          if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
1226
            {
1227
              DECL_INITIAL (decl) = 0;
1228
              error ("global register variable has initial value");
1229
            }
1230
          if (TREE_THIS_VOLATILE (decl))
1231
            warning (OPT_Wvolatile_register_var,
1232
                     "optimization may eliminate reads and/or "
1233
                     "writes to register variables");
1234
 
1235
          /* If the user specified one of the eliminables registers here,
1236
             e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
1237
             confused with that register and be eliminated.  This usage is
1238
             somewhat suspect...  */
1239
 
1240
          SET_DECL_RTL (decl, gen_rtx_raw_REG (mode, reg_number));
1241
          ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
1242
          REG_USERVAR_P (DECL_RTL (decl)) = 1;
1243
 
1244
          if (TREE_STATIC (decl))
1245
            {
1246
              /* Make this register global, so not usable for anything
1247
                 else.  */
1248
#ifdef ASM_DECLARE_REGISTER_GLOBAL
1249
              name = IDENTIFIER_POINTER (DECL_NAME (decl));
1250
              ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
1251
#endif
1252
              nregs = hard_regno_nregs[reg_number][mode];
1253
              while (nregs > 0)
1254
                globalize_reg (decl, reg_number + --nregs);
1255
            }
1256
 
1257
          /* As a register variable, it has no section.  */
1258
          return;
1259
        }
1260
    }
1261
  /* Now handle ordinary static variables and functions (in memory).
1262
     Also handle vars declared register invalidly.  */
1263
  else if (name[0] == '*')
1264
  {
1265
#ifdef REGISTER_PREFIX
1266
    if (strlen (REGISTER_PREFIX) != 0)
1267
      {
1268
        reg_number = decode_reg_name (name);
1269
        if (reg_number >= 0 || reg_number == -3)
1270
          error ("register name given for non-register variable %q+D", decl);
1271
      }
1272
#endif
1273
  }
1274
 
1275
  /* Specifying a section attribute on a variable forces it into a
1276
     non-.bss section, and thus it cannot be common.  */
1277
  /* FIXME: In general this code should not be necessary because
1278
     visibility pass is doing the same work.  But notice_global_symbol
1279
     is called early and it needs to make DECL_RTL to get the name.
1280
     we take care of recomputing the DECL_RTL after visibility is changed.  */
1281
  if (TREE_CODE (decl) == VAR_DECL
1282
      && DECL_SECTION_NAME (decl) != NULL_TREE
1283
      && DECL_INITIAL (decl) == NULL_TREE
1284
      && DECL_COMMON (decl))
1285
    DECL_COMMON (decl) = 0;
1286
 
1287
  /* Variables can't be both common and weak.  */
1288
  if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
1289
    DECL_COMMON (decl) = 0;
1290
 
1291
  if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
1292
    x = create_block_symbol (name, get_block_for_decl (decl), -1);
1293
  else
1294
    {
1295
      enum machine_mode address_mode = Pmode;
1296
      if (TREE_TYPE (decl) != error_mark_node)
1297
        {
1298
          addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
1299
          address_mode = targetm.addr_space.address_mode (as);
1300
        }
1301
      x = gen_rtx_SYMBOL_REF (address_mode, name);
1302
    }
1303
  SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
1304
  SET_SYMBOL_REF_DECL (x, decl);
1305
 
1306
  x = gen_rtx_MEM (DECL_MODE (decl), x);
1307
  if (TREE_CODE (decl) != FUNCTION_DECL)
1308
    set_mem_attributes (x, decl, 1);
1309
  SET_DECL_RTL (decl, x);
1310
 
1311
  /* Optionally set flags or add text to the name to record information
1312
     such as that it is a function name.
1313
     If the name is changed, the macro ASM_OUTPUT_LABELREF
1314
     will have to know how to strip this information.  */
1315
  targetm.encode_section_info (decl, DECL_RTL (decl), true);
1316
 
1317
  /* Make this function static known to the mudflap runtime.  */
1318
  if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1319
    mudflap_enqueue_decl (decl);
1320
}
1321
 
1322
/* Like make_decl_rtl, but inhibit creation of new alias sets when
1323
   calling make_decl_rtl.  Also, reset DECL_RTL before returning the
1324
   rtl.  */
1325
 
1326
rtx
1327
make_decl_rtl_for_debug (tree decl)
1328
{
1329
  unsigned int save_aliasing_flag, save_mudflap_flag;
1330
  rtx rtl;
1331
 
1332
  if (DECL_RTL_SET_P (decl))
1333
    return DECL_RTL (decl);
1334
 
1335
  /* Kludge alert!  Somewhere down the call chain, make_decl_rtl will
1336
     call new_alias_set.  If running with -fcompare-debug, sometimes
1337
     we do not want to create alias sets that will throw the alias
1338
     numbers off in the comparison dumps.  So... clearing
1339
     flag_strict_aliasing will keep new_alias_set() from creating a
1340
     new set.  It is undesirable to register decl with mudflap
1341
     in this case as well.  */
1342
  save_aliasing_flag = flag_strict_aliasing;
1343
  flag_strict_aliasing = 0;
1344
  save_mudflap_flag = flag_mudflap;
1345
  flag_mudflap = 0;
1346
 
1347
  rtl = DECL_RTL (decl);
1348
  /* Reset DECL_RTL back, as various parts of the compiler expects
1349
     DECL_RTL set meaning it is actually going to be output.  */
1350
  SET_DECL_RTL (decl, NULL);
1351
 
1352
  flag_strict_aliasing = save_aliasing_flag;
1353
  flag_mudflap = save_mudflap_flag;
1354
 
1355
  return rtl;
1356
}
1357
 
1358
/* Output a string of literal assembler code
1359
   for an `asm' keyword used between functions.  */
1360
 
1361
void
1362
assemble_asm (tree string)
1363
{
1364
  app_enable ();
1365
 
1366
  if (TREE_CODE (string) == ADDR_EXPR)
1367
    string = TREE_OPERAND (string, 0);
1368
 
1369
  fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1370
}
1371
 
1372
/* Record an element in the table of global destructors.  SYMBOL is
1373
   a SYMBOL_REF of the function to be called; PRIORITY is a number
1374
   between 0 and MAX_INIT_PRIORITY.  */
1375
 
1376
void
1377
default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
1378
                                  int priority ATTRIBUTE_UNUSED)
1379
{
1380
#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1381
  /* Tell GNU LD that this is part of the static destructor set.
1382
     This will work for any system that uses stabs, most usefully
1383
     aout systems.  */
1384
  dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
1385
  dbxout_stab_value_label (XSTR (symbol, 0));
1386
#else
1387
  sorry ("global destructors not supported on this target");
1388
#endif
1389
}
1390
 
1391
/* Write the address of the entity given by SYMBOL to SEC.  */
1392
void
1393
assemble_addr_to_section (rtx symbol, section *sec)
1394
{
1395
  switch_to_section (sec);
1396
  assemble_align (POINTER_SIZE);
1397
  assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1398
}
1399
 
1400
/* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if
1401
   not) section for PRIORITY.  */
1402
section *
1403
get_cdtor_priority_section (int priority, bool constructor_p)
1404
{
1405
  char buf[16];
1406
 
1407
  /* ??? This only works reliably with the GNU linker.  */
1408
  sprintf (buf, "%s.%.5u",
1409
           constructor_p ? ".ctors" : ".dtors",
1410
           /* Invert the numbering so the linker puts us in the proper
1411
              order; constructors are run from right to left, and the
1412
              linker sorts in increasing order.  */
1413
           MAX_INIT_PRIORITY - priority);
1414
  return get_section (buf, SECTION_WRITE, NULL);
1415
}
1416
 
1417
void
1418
default_named_section_asm_out_destructor (rtx symbol, int priority)
1419
{
1420
  section *sec;
1421
 
1422
  if (priority != DEFAULT_INIT_PRIORITY)
1423
    sec = get_cdtor_priority_section (priority,
1424
                                      /*constructor_p=*/false);
1425
  else
1426
    sec = get_section (".dtors", SECTION_WRITE, NULL);
1427
 
1428
  assemble_addr_to_section (symbol, sec);
1429
}
1430
 
1431
#ifdef DTORS_SECTION_ASM_OP
1432
void
1433
default_dtor_section_asm_out_destructor (rtx symbol,
1434
                                         int priority ATTRIBUTE_UNUSED)
1435
{
1436
  assemble_addr_to_section (symbol, dtors_section);
1437
}
1438
#endif
1439
 
1440
/* Likewise for global constructors.  */
1441
 
1442
void
1443
default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
1444
                                   int priority ATTRIBUTE_UNUSED)
1445
{
1446
#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1447
  /* Tell GNU LD that this is part of the static destructor set.
1448
     This will work for any system that uses stabs, most usefully
1449
     aout systems.  */
1450
  dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
1451
  dbxout_stab_value_label (XSTR (symbol, 0));
1452
#else
1453
  sorry ("global constructors not supported on this target");
1454
#endif
1455
}
1456
 
1457
void
1458
default_named_section_asm_out_constructor (rtx symbol, int priority)
1459
{
1460
  section *sec;
1461
 
1462
  if (priority != DEFAULT_INIT_PRIORITY)
1463
    sec = get_cdtor_priority_section (priority,
1464
                                      /*constructor_p=*/true);
1465
  else
1466
    sec = get_section (".ctors", SECTION_WRITE, NULL);
1467
 
1468
  assemble_addr_to_section (symbol, sec);
1469
}
1470
 
1471
#ifdef CTORS_SECTION_ASM_OP
1472
void
1473
default_ctor_section_asm_out_constructor (rtx symbol,
1474
                                          int priority ATTRIBUTE_UNUSED)
1475
{
1476
  assemble_addr_to_section (symbol, ctors_section);
1477
}
1478
#endif
1479
 
1480
/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1481
   a nonzero value if the constant pool should be output before the
1482
   start of the function, or a zero value if the pool should output
1483
   after the end of the function.  The default is to put it before the
1484
   start.  */
1485
 
1486
#ifndef CONSTANT_POOL_BEFORE_FUNCTION
1487
#define CONSTANT_POOL_BEFORE_FUNCTION 1
1488
#endif
1489
 
1490
/* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1491
   to be output to assembler.
1492
   Set first_global_object_name and weak_global_object_name as appropriate.  */
1493
 
1494
void
1495
notice_global_symbol (tree decl)
1496
{
1497
  const char **type = &first_global_object_name;
1498
 
1499
  if (first_global_object_name
1500
      || !TREE_PUBLIC (decl)
1501
      || DECL_EXTERNAL (decl)
1502
      || !DECL_NAME (decl)
1503
      || (TREE_CODE (decl) != FUNCTION_DECL
1504
          && (TREE_CODE (decl) != VAR_DECL
1505
              || (DECL_COMMON (decl)
1506
                  && (DECL_INITIAL (decl) == 0
1507
                      || DECL_INITIAL (decl) == error_mark_node))))
1508
      || !MEM_P (DECL_RTL (decl)))
1509
    return;
1510
 
1511
  /* We win when global object is found, but it is useful to know about weak
1512
     symbol as well so we can produce nicer unique names.  */
1513
  if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl) || flag_shlib)
1514
    type = &weak_global_object_name;
1515
 
1516
  if (!*type)
1517
    {
1518
      const char *p;
1519
      const char *name;
1520
      rtx decl_rtl = DECL_RTL (decl);
1521
 
1522
      p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
1523
      name = ggc_strdup (p);
1524
 
1525
      *type = name;
1526
    }
1527
}
1528
 
1529
/* If not using flag_reorder_blocks_and_partition, decide early whether the
1530
   current function goes into the cold section, so that targets can use
1531
   current_function_section during RTL expansion.  DECL describes the
1532
   function.  */
1533
 
1534
void
1535
decide_function_section (tree decl)
1536
{
1537
  first_function_block_is_cold = false;
1538
 
1539
  if (flag_reorder_blocks_and_partition)
1540
    /* We will decide in assemble_start_function.  */
1541
    return;
1542
 
1543
 if (DECL_SECTION_NAME (decl))
1544
    {
1545
      struct cgraph_node *node = cgraph_get_node (current_function_decl);
1546
      /* Calls to function_section rely on first_function_block_is_cold
1547
         being accurate.  */
1548
      first_function_block_is_cold = (node
1549
                                      && node->frequency
1550
                                      == NODE_FREQUENCY_UNLIKELY_EXECUTED);
1551
    }
1552
 
1553
  in_cold_section_p = first_function_block_is_cold;
1554
}
1555
 
1556
/* Output assembler code for the constant pool of a function and associated
1557
   with defining the name of the function.  DECL describes the function.
1558
   NAME is the function's name.  For the constant pool, we use the current
1559
   constant pool data.  */
1560
 
1561
void
1562
assemble_start_function (tree decl, const char *fnname)
1563
{
1564
  int align;
1565
  char tmp_label[100];
1566
  bool hot_label_written = false;
1567
 
1568
  if (flag_reorder_blocks_and_partition)
1569
    {
1570
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
1571
      crtl->subsections.hot_section_label = ggc_strdup (tmp_label);
1572
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
1573
      crtl->subsections.cold_section_label = ggc_strdup (tmp_label);
1574
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
1575
      crtl->subsections.hot_section_end_label = ggc_strdup (tmp_label);
1576
      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
1577
      crtl->subsections.cold_section_end_label = ggc_strdup (tmp_label);
1578
      const_labelno++;
1579
    }
1580
  else
1581
    {
1582
      crtl->subsections.hot_section_label = NULL;
1583
      crtl->subsections.cold_section_label = NULL;
1584
      crtl->subsections.hot_section_end_label = NULL;
1585
      crtl->subsections.cold_section_end_label = NULL;
1586
    }
1587
 
1588
  /* The following code does not need preprocessing in the assembler.  */
1589
 
1590
  app_disable ();
1591
 
1592
  if (CONSTANT_POOL_BEFORE_FUNCTION)
1593
    output_constant_pool (fnname, decl);
1594
 
1595
  /* Make sure the not and cold text (code) sections are properly
1596
     aligned.  This is necessary here in the case where the function
1597
     has both hot and cold sections, because we don't want to re-set
1598
     the alignment when the section switch happens mid-function.  */
1599
 
1600
  if (flag_reorder_blocks_and_partition)
1601
    {
1602
      first_function_block_is_cold = false;
1603
 
1604
      switch_to_section (unlikely_text_section ());
1605
      assemble_align (DECL_ALIGN (decl));
1606
      ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_label);
1607
 
1608
      /* When the function starts with a cold section, we need to explicitly
1609
         align the hot section and write out the hot section label.
1610
         But if the current function is a thunk, we do not have a CFG.  */
1611
      if (!cfun->is_thunk
1612
          && BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
1613
        {
1614
          switch_to_section (text_section);
1615
          assemble_align (DECL_ALIGN (decl));
1616
          ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label);
1617
          hot_label_written = true;
1618
          first_function_block_is_cold = true;
1619
        }
1620
      in_cold_section_p = first_function_block_is_cold;
1621
    }
1622
 
1623
 
1624
  /* Switch to the correct text section for the start of the function.  */
1625
 
1626
  switch_to_section (function_section (decl));
1627
  if (flag_reorder_blocks_and_partition
1628
      && !hot_label_written)
1629
    ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label);
1630
 
1631
  /* Tell assembler to move to target machine's alignment for functions.  */
1632
  align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT);
1633
  if (align > 0)
1634
    {
1635
      ASM_OUTPUT_ALIGN (asm_out_file, align);
1636
    }
1637
 
1638
  /* Handle a user-specified function alignment.
1639
     Note that we still need to align to DECL_ALIGN, as above,
1640
     because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all.  */
1641
  if (! DECL_USER_ALIGN (decl)
1642
      && align_functions_log > align
1643
      && optimize_function_for_speed_p (cfun))
1644
    {
1645
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1646
      ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
1647
                                 align_functions_log, align_functions - 1);
1648
#else
1649
      ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1650
#endif
1651
    }
1652
 
1653
#ifdef ASM_OUTPUT_FUNCTION_PREFIX
1654
  ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1655
#endif
1656
 
1657
  if (!DECL_IGNORED_P (decl))
1658
    (*debug_hooks->begin_function) (decl);
1659
 
1660
  /* Make function name accessible from other files, if appropriate.  */
1661
 
1662
  if (TREE_PUBLIC (decl))
1663
    {
1664
      notice_global_symbol (decl);
1665
 
1666
      globalize_decl (decl);
1667
 
1668
      maybe_assemble_visibility (decl);
1669
    }
1670
 
1671
  if (DECL_PRESERVE_P (decl))
1672
    targetm.asm_out.mark_decl_preserved (fnname);
1673
 
1674
  /* Do any machine/system dependent processing of the function name.  */
1675
#ifdef ASM_DECLARE_FUNCTION_NAME
1676
  ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1677
#else
1678
  /* Standard thing is just output label for the function.  */
1679
  ASM_OUTPUT_FUNCTION_LABEL (asm_out_file, fnname, current_function_decl);
1680
#endif /* ASM_DECLARE_FUNCTION_NAME */
1681
 
1682
  if (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (decl)))
1683
    saw_no_split_stack = true;
1684
}
1685
 
1686
/* Output assembler code associated with defining the size of the
1687
   function.  DECL describes the function.  NAME is the function's name.  */
1688
 
1689
void
1690
assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED)
1691
{
1692
#ifdef ASM_DECLARE_FUNCTION_SIZE
1693
  /* We could have switched section in the middle of the function.  */
1694
  if (flag_reorder_blocks_and_partition)
1695
    switch_to_section (function_section (decl));
1696
  ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1697
#endif
1698
  if (! CONSTANT_POOL_BEFORE_FUNCTION)
1699
    {
1700
      output_constant_pool (fnname, decl);
1701
      switch_to_section (function_section (decl)); /* need to switch back */
1702
    }
1703
  /* Output labels for end of hot/cold text sections (to be used by
1704
     debug info.)  */
1705
  if (flag_reorder_blocks_and_partition)
1706
    {
1707
      section *save_text_section;
1708
 
1709
      save_text_section = in_section;
1710
      switch_to_section (unlikely_text_section ());
1711
      ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_end_label);
1712
      if (first_function_block_is_cold)
1713
        switch_to_section (text_section);
1714
      else
1715
        switch_to_section (function_section (decl));
1716
      ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_end_label);
1717
      switch_to_section (save_text_section);
1718
    }
1719
}
1720
 
1721
/* Assemble code to leave SIZE bytes of zeros.  */
1722
 
1723
void
1724
assemble_zeros (unsigned HOST_WIDE_INT size)
1725
{
1726
  /* Do no output if -fsyntax-only.  */
1727
  if (flag_syntax_only)
1728
    return;
1729
 
1730
#ifdef ASM_NO_SKIP_IN_TEXT
1731
  /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1732
     so we must output 0s explicitly in the text section.  */
1733
  if (ASM_NO_SKIP_IN_TEXT && (in_section->common.flags & SECTION_CODE) != 0)
1734
    {
1735
      unsigned HOST_WIDE_INT i;
1736
      for (i = 0; i < size; i++)
1737
        assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1738
    }
1739
  else
1740
#endif
1741
    if (size > 0)
1742
      ASM_OUTPUT_SKIP (asm_out_file, size);
1743
}
1744
 
1745
/* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
1746
 
1747
void
1748
assemble_align (int align)
1749
{
1750
  if (align > BITS_PER_UNIT)
1751
    {
1752
      ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1753
    }
1754
}
1755
 
1756
/* Assemble a string constant with the specified C string as contents.  */
1757
 
1758
void
1759
assemble_string (const char *p, int size)
1760
{
1761
  int pos = 0;
1762
  int maximum = 2000;
1763
 
1764
  /* If the string is very long, split it up.  */
1765
 
1766
  while (pos < size)
1767
    {
1768
      int thissize = size - pos;
1769
      if (thissize > maximum)
1770
        thissize = maximum;
1771
 
1772
      ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1773
 
1774
      pos += thissize;
1775
      p += thissize;
1776
    }
1777
}
1778
 
1779
 
1780
/* A noswitch_section_callback for lcomm_section.  */
1781
 
1782
static bool
1783
emit_local (tree decl ATTRIBUTE_UNUSED,
1784
            const char *name ATTRIBUTE_UNUSED,
1785
            unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1786
            unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1787
{
1788
#if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1789
  ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name,
1790
                                 size, DECL_ALIGN (decl));
1791
  return true;
1792
#elif defined ASM_OUTPUT_ALIGNED_LOCAL
1793
  ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl));
1794
  return true;
1795
#else
1796
  ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1797
  return false;
1798
#endif
1799
}
1800
 
1801
/* A noswitch_section_callback for bss_noswitch_section.  */
1802
 
1803
#if defined ASM_OUTPUT_ALIGNED_BSS
1804
static bool
1805
emit_bss (tree decl ATTRIBUTE_UNUSED,
1806
          const char *name ATTRIBUTE_UNUSED,
1807
          unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1808
          unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1809
{
1810
#if defined ASM_OUTPUT_ALIGNED_BSS
1811
  ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl));
1812
  return true;
1813
#endif
1814
}
1815
#endif
1816
 
1817
/* A noswitch_section_callback for comm_section.  */
1818
 
1819
static bool
1820
emit_common (tree decl ATTRIBUTE_UNUSED,
1821
             const char *name ATTRIBUTE_UNUSED,
1822
             unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1823
             unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1824
{
1825
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1826
  ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name,
1827
                                  size, DECL_ALIGN (decl));
1828
  return true;
1829
#elif defined ASM_OUTPUT_ALIGNED_COMMON
1830
  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl));
1831
  return true;
1832
#else
1833
  ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
1834
  return false;
1835
#endif
1836
}
1837
 
1838
/* A noswitch_section_callback for tls_comm_section.  */
1839
 
1840
static bool
1841
emit_tls_common (tree decl ATTRIBUTE_UNUSED,
1842
                 const char *name ATTRIBUTE_UNUSED,
1843
                 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1844
                 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1845
{
1846
#ifdef ASM_OUTPUT_TLS_COMMON
1847
  ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size);
1848
  return true;
1849
#else
1850
  sorry ("thread-local COMMON data not implemented");
1851
  return true;
1852
#endif
1853
}
1854
 
1855
/* Assemble DECL given that it belongs in SECTION_NOSWITCH section SECT.
1856
   NAME is the name of DECL's SYMBOL_REF.  */
1857
 
1858
static void
1859
assemble_noswitch_variable (tree decl, const char *name, section *sect)
1860
{
1861
  unsigned HOST_WIDE_INT size, rounded;
1862
 
1863
  size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1864
  rounded = size;
1865
 
1866
  /* Don't allocate zero bytes of common,
1867
     since that means "undefined external" in the linker.  */
1868
  if (size == 0)
1869
    rounded = 1;
1870
 
1871
  /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1872
     so that each uninitialized object starts on such a boundary.  */
1873
  rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1874
  rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1875
             * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1876
 
1877
  if (!sect->noswitch.callback (decl, name, size, rounded)
1878
      && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
1879
    warning (0, "requested alignment for %q+D is greater than "
1880
             "implemented alignment of %wu", decl, rounded);
1881
}
1882
 
1883
/* A subroutine of assemble_variable.  Output the label and contents of
1884
   DECL, whose address is a SYMBOL_REF with name NAME.  DONT_OUTPUT_DATA
1885
   is as for assemble_variable.  */
1886
 
1887
static void
1888
assemble_variable_contents (tree decl, const char *name,
1889
                            bool dont_output_data)
1890
{
1891
  /* Do any machine/system dependent processing of the object.  */
1892
#ifdef ASM_DECLARE_OBJECT_NAME
1893
  last_assemble_variable_decl = decl;
1894
  ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1895
#else
1896
  /* Standard thing is just output label for the object.  */
1897
  ASM_OUTPUT_LABEL (asm_out_file, name);
1898
#endif /* ASM_DECLARE_OBJECT_NAME */
1899
 
1900
  if (!dont_output_data)
1901
    {
1902
      if (DECL_INITIAL (decl)
1903
          && DECL_INITIAL (decl) != error_mark_node
1904
          && !initializer_zerop (DECL_INITIAL (decl)))
1905
        /* Output the actual data.  */
1906
        output_constant (DECL_INITIAL (decl),
1907
                         tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1908
                         DECL_ALIGN (decl));
1909
      else
1910
        /* Leave space for it.  */
1911
        assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1912
    }
1913
}
1914
 
1915
/* Assemble everything that is needed for a variable or function declaration.
1916
   Not used for automatic variables, and not used for function definitions.
1917
   Should not be called for variables of incomplete structure type.
1918
 
1919
   TOP_LEVEL is nonzero if this variable has file scope.
1920
   AT_END is nonzero if this is the special handling, at end of compilation,
1921
   to define things that have had only tentative definitions.
1922
   DONT_OUTPUT_DATA if nonzero means don't actually output the
1923
   initial value (that will be done by the caller).  */
1924
 
1925
void
1926
assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1927
                   int at_end ATTRIBUTE_UNUSED, int dont_output_data)
1928
{
1929
  const char *name;
1930
  rtx decl_rtl, symbol;
1931
  section *sect;
1932
 
1933
  /* This function is supposed to handle VARIABLES.  Ensure we have one.  */
1934
  gcc_assert (TREE_CODE (decl) == VAR_DECL);
1935
 
1936
  /* Emulated TLS had better not get this far.  */
1937
  gcc_checking_assert (targetm.have_tls || !DECL_THREAD_LOCAL_P (decl));
1938
 
1939
  last_assemble_variable_decl = 0;
1940
 
1941
  /* Normally no need to say anything here for external references,
1942
     since assemble_external is called by the language-specific code
1943
     when a declaration is first seen.  */
1944
 
1945
  if (DECL_EXTERNAL (decl))
1946
    return;
1947
 
1948
  /* Do nothing for global register variables.  */
1949
  if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
1950
    {
1951
      TREE_ASM_WRITTEN (decl) = 1;
1952
      return;
1953
    }
1954
 
1955
  /* If type was incomplete when the variable was declared,
1956
     see if it is complete now.  */
1957
 
1958
  if (DECL_SIZE (decl) == 0)
1959
    layout_decl (decl, 0);
1960
 
1961
  /* Still incomplete => don't allocate it; treat the tentative defn
1962
     (which is what it must have been) as an `extern' reference.  */
1963
 
1964
  if (!dont_output_data && DECL_SIZE (decl) == 0)
1965
    {
1966
      error ("storage size of %q+D isn%'t known", decl);
1967
      TREE_ASM_WRITTEN (decl) = 1;
1968
      return;
1969
    }
1970
 
1971
  /* The first declaration of a variable that comes through this function
1972
     decides whether it is global (in C, has external linkage)
1973
     or local (in C, has internal linkage).  So do nothing more
1974
     if this function has already run.  */
1975
 
1976
  if (TREE_ASM_WRITTEN (decl))
1977
    return;
1978
 
1979
  /* Make sure targetm.encode_section_info is invoked before we set
1980
     ASM_WRITTEN.  */
1981
  decl_rtl = DECL_RTL (decl);
1982
 
1983
  TREE_ASM_WRITTEN (decl) = 1;
1984
 
1985
  /* Do no output if -fsyntax-only.  */
1986
  if (flag_syntax_only)
1987
    return;
1988
 
1989
  if (! dont_output_data
1990
      && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
1991
    {
1992
      error ("size of variable %q+D is too large", decl);
1993
      return;
1994
    }
1995
 
1996
  gcc_assert (MEM_P (decl_rtl));
1997
  gcc_assert (GET_CODE (XEXP (decl_rtl, 0)) == SYMBOL_REF);
1998
  symbol = XEXP (decl_rtl, 0);
1999
 
2000
  /* If this symbol belongs to the tree constant pool, output the constant
2001
     if it hasn't already been written.  */
2002
  if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
2003
    {
2004
      tree decl = SYMBOL_REF_DECL (symbol);
2005
      if (!TREE_ASM_WRITTEN (DECL_INITIAL (decl)))
2006
        output_constant_def_contents (symbol);
2007
      return;
2008
    }
2009
 
2010
  app_disable ();
2011
 
2012
  name = XSTR (symbol, 0);
2013
  if (TREE_PUBLIC (decl) && DECL_NAME (decl))
2014
    notice_global_symbol (decl);
2015
 
2016
  /* Compute the alignment of this data.  */
2017
 
2018
  align_variable (decl, dont_output_data);
2019
  set_mem_align (decl_rtl, DECL_ALIGN (decl));
2020
 
2021
  if (TREE_PUBLIC (decl))
2022
    maybe_assemble_visibility (decl);
2023
 
2024
  if (DECL_PRESERVE_P (decl))
2025
    targetm.asm_out.mark_decl_preserved (name);
2026
 
2027
  /* First make the assembler name(s) global if appropriate.  */
2028
  sect = get_variable_section (decl, false);
2029
  if (TREE_PUBLIC (decl)
2030
      && (sect->common.flags & SECTION_COMMON) == 0)
2031
    globalize_decl (decl);
2032
 
2033
  /* Output any data that we will need to use the address of.  */
2034
  if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
2035
    output_addressed_constants (DECL_INITIAL (decl));
2036
 
2037
  /* dbxout.c needs to know this.  */
2038
  if (sect && (sect->common.flags & SECTION_CODE) != 0)
2039
    DECL_IN_TEXT_SECTION (decl) = 1;
2040
 
2041
  /* If the decl is part of an object_block, make sure that the decl
2042
     has been positioned within its block, but do not write out its
2043
     definition yet.  output_object_blocks will do that later.  */
2044
  if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
2045
    {
2046
      gcc_assert (!dont_output_data);
2047
      place_block_symbol (symbol);
2048
    }
2049
  else if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
2050
    assemble_noswitch_variable (decl, name, sect);
2051
  else
2052
    {
2053
      switch_to_section (sect);
2054
      if (DECL_ALIGN (decl) > BITS_PER_UNIT)
2055
        ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
2056
      assemble_variable_contents (decl, name, dont_output_data);
2057
    }
2058
}
2059
 
2060
/* Return 1 if type TYPE contains any pointers.  */
2061
 
2062
static int
2063
contains_pointers_p (tree type)
2064
{
2065
  switch (TREE_CODE (type))
2066
    {
2067
    case POINTER_TYPE:
2068
    case REFERENCE_TYPE:
2069
      /* I'm not sure whether OFFSET_TYPE needs this treatment,
2070
         so I'll play safe and return 1.  */
2071
    case OFFSET_TYPE:
2072
      return 1;
2073
 
2074
    case RECORD_TYPE:
2075
    case UNION_TYPE:
2076
    case QUAL_UNION_TYPE:
2077
      {
2078
        tree fields;
2079
        /* For a type that has fields, see if the fields have pointers.  */
2080
        for (fields = TYPE_FIELDS (type); fields; fields = DECL_CHAIN (fields))
2081
          if (TREE_CODE (fields) == FIELD_DECL
2082
              && contains_pointers_p (TREE_TYPE (fields)))
2083
            return 1;
2084
        return 0;
2085
      }
2086
 
2087
    case ARRAY_TYPE:
2088
      /* An array type contains pointers if its element type does.  */
2089
      return contains_pointers_p (TREE_TYPE (type));
2090
 
2091
    default:
2092
      return 0;
2093
    }
2094
}
2095
 
2096
/* We delay assemble_external processing until
2097
   the compilation unit is finalized.  This is the best we can do for
2098
   right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay
2099
   it all the way to final.  See PR 17982 for further discussion.  */
2100
static GTY(()) tree pending_assemble_externals;
2101
 
2102
#ifdef ASM_OUTPUT_EXTERNAL
2103
/* True if DECL is a function decl for which no out-of-line copy exists.
2104
   It is assumed that DECL's assembler name has been set.  */
2105
 
2106
static bool
2107
incorporeal_function_p (tree decl)
2108
{
2109
  if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
2110
    {
2111
      const char *name;
2112
 
2113
      if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2114
          && (DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA
2115
              || DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA_WITH_ALIGN))
2116
        return true;
2117
 
2118
      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2119
      /* Atomic or sync builtins which have survived this far will be
2120
         resolved externally and therefore are not incorporeal.  */
2121
      if (strncmp (name, "__builtin_", 10) == 0)
2122
        return true;
2123
    }
2124
  return false;
2125
}
2126
 
2127
/* Actually do the tests to determine if this is necessary, and invoke
2128
   ASM_OUTPUT_EXTERNAL.  */
2129
static void
2130
assemble_external_real (tree decl)
2131
{
2132
  rtx rtl = DECL_RTL (decl);
2133
 
2134
  if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
2135
      && !SYMBOL_REF_USED (XEXP (rtl, 0))
2136
      && !incorporeal_function_p (decl))
2137
    {
2138
      /* Some systems do require some output.  */
2139
      SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
2140
      ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
2141
    }
2142
}
2143
#endif
2144
 
2145
void
2146
process_pending_assemble_externals (void)
2147
{
2148
#ifdef ASM_OUTPUT_EXTERNAL
2149
  tree list;
2150
  for (list = pending_assemble_externals; list; list = TREE_CHAIN (list))
2151
    assemble_external_real (TREE_VALUE (list));
2152
 
2153
  pending_assemble_externals = 0;
2154
#endif
2155
}
2156
 
2157
/* This TREE_LIST contains any weak symbol declarations waiting
2158
   to be emitted.  */
2159
static GTY(()) tree weak_decls;
2160
 
2161
/* Output something to declare an external symbol to the assembler,
2162
   and qualifiers such as weakness.  (Most assemblers don't need
2163
   extern declaration, so we normally output nothing.)  Do nothing if
2164
   DECL is not external.  */
2165
 
2166
void
2167
assemble_external (tree decl ATTRIBUTE_UNUSED)
2168
{
2169
  /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
2170
     main body of this code is only rarely exercised.  To provide some
2171
     testing, on all platforms, we make sure that the ASM_OUT_FILE is
2172
     open.  If it's not, we should not be calling this function.  */
2173
  gcc_assert (asm_out_file);
2174
 
2175
  if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
2176
    return;
2177
 
2178
  /* We want to output annotation for weak and external symbols at
2179
     very last to check if they are references or not.  */
2180
 
2181
  if (TARGET_SUPPORTS_WEAK
2182
      && DECL_WEAK (decl)
2183
      /* TREE_STATIC is a weird and abused creature which is not
2184
         generally the right test for whether an entity has been
2185
         locally emitted, inlined or otherwise not-really-extern, but
2186
         for declarations that can be weak, it happens to be
2187
         match.  */
2188
      && !TREE_STATIC (decl)
2189
      && lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
2190
      && value_member (decl, weak_decls) == NULL_TREE)
2191
    weak_decls = tree_cons (NULL, decl, weak_decls);
2192
 
2193
#ifdef ASM_OUTPUT_EXTERNAL
2194
  if (value_member (decl, pending_assemble_externals) == NULL_TREE)
2195
    pending_assemble_externals = tree_cons (NULL, decl,
2196
                                            pending_assemble_externals);
2197
#endif
2198
}
2199
 
2200
/* Similar, for calling a library function FUN.  */
2201
 
2202
void
2203
assemble_external_libcall (rtx fun)
2204
{
2205
  /* Declare library function name external when first used, if nec.  */
2206
  if (! SYMBOL_REF_USED (fun))
2207
    {
2208
      SYMBOL_REF_USED (fun) = 1;
2209
      targetm.asm_out.external_libcall (fun);
2210
    }
2211
}
2212
 
2213
/* Assemble a label named NAME.  */
2214
 
2215
void
2216
assemble_label (FILE *file, const char *name)
2217
{
2218
  ASM_OUTPUT_LABEL (file, name);
2219
}
2220
 
2221
/* Set the symbol_referenced flag for ID.  */
2222
void
2223
mark_referenced (tree id)
2224
{
2225
  TREE_SYMBOL_REFERENCED (id) = 1;
2226
}
2227
 
2228
/* Set the symbol_referenced flag for DECL and notify callgraph.  */
2229
void
2230
mark_decl_referenced (tree decl)
2231
{
2232
  if (TREE_CODE (decl) == FUNCTION_DECL)
2233
    {
2234
      /* Extern inline functions don't become needed when referenced.
2235
         If we know a method will be emitted in other TU and no new
2236
         functions can be marked reachable, just use the external
2237
         definition.  */
2238
      struct cgraph_node *node = cgraph_get_create_node (decl);
2239
      if (!DECL_EXTERNAL (decl)
2240
          && !node->local.finalized)
2241
        cgraph_mark_needed_node (node);
2242
    }
2243
  else if (TREE_CODE (decl) == VAR_DECL)
2244
    {
2245
      struct varpool_node *node = varpool_node (decl);
2246
      varpool_mark_needed_node (node);
2247
      /* C++ frontend use mark_decl_references to force COMDAT variables
2248
         to be output that might appear dead otherwise.  */
2249
      node->force_output = true;
2250
    }
2251
  /* else do nothing - we can get various sorts of CST nodes here,
2252
     which do not need to be marked.  */
2253
}
2254
 
2255
 
2256
/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
2257
   until we find an identifier that is not itself a transparent alias.
2258
   Modify the alias passed to it by reference (and all aliases on the
2259
   way to the ultimate target), such that they do not have to be
2260
   followed again, and return the ultimate target of the alias
2261
   chain.  */
2262
 
2263
static inline tree
2264
ultimate_transparent_alias_target (tree *alias)
2265
{
2266
  tree target = *alias;
2267
 
2268
  if (IDENTIFIER_TRANSPARENT_ALIAS (target))
2269
    {
2270
      gcc_assert (TREE_CHAIN (target));
2271
      target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
2272
      gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
2273
                  && ! TREE_CHAIN (target));
2274
      *alias = target;
2275
    }
2276
 
2277
  return target;
2278
}
2279
 
2280
/* Output to FILE (an assembly file) a reference to NAME.  If NAME
2281
   starts with a *, the rest of NAME is output verbatim.  Otherwise
2282
   NAME is transformed in a target-specific way (usually by the
2283
   addition of an underscore).  */
2284
 
2285
void
2286
assemble_name_raw (FILE *file, const char *name)
2287
{
2288
  if (name[0] == '*')
2289
    fputs (&name[1], file);
2290
  else
2291
    ASM_OUTPUT_LABELREF (file, name);
2292
}
2293
 
2294
/* Like assemble_name_raw, but should be used when NAME might refer to
2295
   an entity that is also represented as a tree (like a function or
2296
   variable).  If NAME does refer to such an entity, that entity will
2297
   be marked as referenced.  */
2298
 
2299
void
2300
assemble_name (FILE *file, const char *name)
2301
{
2302
  const char *real_name;
2303
  tree id;
2304
 
2305
  real_name = targetm.strip_name_encoding (name);
2306
 
2307
  id = maybe_get_identifier (real_name);
2308
  if (id)
2309
    {
2310
      tree id_orig = id;
2311
 
2312
      mark_referenced (id);
2313
      ultimate_transparent_alias_target (&id);
2314
      if (id != id_orig)
2315
        name = IDENTIFIER_POINTER (id);
2316
      gcc_assert (! TREE_CHAIN (id));
2317
    }
2318
 
2319
  assemble_name_raw (file, name);
2320
}
2321
 
2322
/* Allocate SIZE bytes writable static space with a gensym name
2323
   and return an RTX to refer to its address.  */
2324
 
2325
rtx
2326
assemble_static_space (unsigned HOST_WIDE_INT size)
2327
{
2328
  char name[12];
2329
  const char *namestring;
2330
  rtx x;
2331
 
2332
  ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
2333
  ++const_labelno;
2334
  namestring = ggc_strdup (name);
2335
 
2336
  x = gen_rtx_SYMBOL_REF (Pmode, namestring);
2337
  SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
2338
 
2339
#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
2340
  ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
2341
                                 BIGGEST_ALIGNMENT);
2342
#else
2343
#ifdef ASM_OUTPUT_ALIGNED_LOCAL
2344
  ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
2345
#else
2346
  {
2347
    /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2348
       so that each uninitialized object starts on such a boundary.  */
2349
    /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL.  */
2350
    unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
2351
      = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
2352
         / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2353
         * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
2354
    ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
2355
  }
2356
#endif
2357
#endif
2358
  return x;
2359
}
2360
 
2361
/* Assemble the static constant template for function entry trampolines.
2362
   This is done at most once per compilation.
2363
   Returns an RTX for the address of the template.  */
2364
 
2365
static GTY(()) rtx initial_trampoline;
2366
 
2367
rtx
2368
assemble_trampoline_template (void)
2369
{
2370
  char label[256];
2371
  const char *name;
2372
  int align;
2373
  rtx symbol;
2374
 
2375
  gcc_assert (targetm.asm_out.trampoline_template != NULL);
2376
 
2377
  if (initial_trampoline)
2378
    return initial_trampoline;
2379
 
2380
  /* By default, put trampoline templates in read-only data section.  */
2381
 
2382
#ifdef TRAMPOLINE_SECTION
2383
  switch_to_section (TRAMPOLINE_SECTION);
2384
#else
2385
  switch_to_section (readonly_data_section);
2386
#endif
2387
 
2388
  /* Write the assembler code to define one.  */
2389
  align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
2390
  if (align > 0)
2391
    ASM_OUTPUT_ALIGN (asm_out_file, align);
2392
 
2393
  targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
2394
  targetm.asm_out.trampoline_template (asm_out_file);
2395
 
2396
  /* Record the rtl to refer to it.  */
2397
  ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
2398
  name = ggc_strdup (label);
2399
  symbol = gen_rtx_SYMBOL_REF (Pmode, name);
2400
  SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2401
 
2402
  initial_trampoline = gen_const_mem (BLKmode, symbol);
2403
  set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
2404
  set_mem_size (initial_trampoline, TRAMPOLINE_SIZE);
2405
 
2406
  return initial_trampoline;
2407
}
2408
 
2409
/* A and B are either alignments or offsets.  Return the minimum alignment
2410
   that may be assumed after adding the two together.  */
2411
 
2412
static inline unsigned
2413
min_align (unsigned int a, unsigned int b)
2414
{
2415
  return (a | b) & -(a | b);
2416
}
2417
 
2418
/* Return the assembler directive for creating a given kind of integer
2419
   object.  SIZE is the number of bytes in the object and ALIGNED_P
2420
   indicates whether it is known to be aligned.  Return NULL if the
2421
   assembly dialect has no such directive.
2422
 
2423
   The returned string should be printed at the start of a new line and
2424
   be followed immediately by the object's initial value.  */
2425
 
2426
const char *
2427
integer_asm_op (int size, int aligned_p)
2428
{
2429
  struct asm_int_op *ops;
2430
 
2431
  if (aligned_p)
2432
    ops = &targetm.asm_out.aligned_op;
2433
  else
2434
    ops = &targetm.asm_out.unaligned_op;
2435
 
2436
  switch (size)
2437
    {
2438
    case 1:
2439
      return targetm.asm_out.byte_op;
2440
    case 2:
2441
      return ops->hi;
2442
    case 4:
2443
      return ops->si;
2444
    case 8:
2445
      return ops->di;
2446
    case 16:
2447
      return ops->ti;
2448
    default:
2449
      return NULL;
2450
    }
2451
}
2452
 
2453
/* Use directive OP to assemble an integer object X.  Print OP at the
2454
   start of the line, followed immediately by the value of X.  */
2455
 
2456
void
2457
assemble_integer_with_op (const char *op, rtx x)
2458
{
2459
  fputs (op, asm_out_file);
2460
  output_addr_const (asm_out_file, x);
2461
  fputc ('\n', asm_out_file);
2462
}
2463
 
2464
/* The default implementation of the asm_out.integer target hook.  */
2465
 
2466
bool
2467
default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2468
                          unsigned int size ATTRIBUTE_UNUSED,
2469
                          int aligned_p ATTRIBUTE_UNUSED)
2470
{
2471
  const char *op = integer_asm_op (size, aligned_p);
2472
  /* Avoid GAS bugs for large values.  Specifically negative values whose
2473
     absolute value fits in a bfd_vma, but not in a bfd_signed_vma.  */
2474
  if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT)
2475
    return false;
2476
  return op && (assemble_integer_with_op (op, x), true);
2477
}
2478
 
2479
/* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
2480
   the alignment of the integer in bits.  Return 1 if we were able to output
2481
   the constant, otherwise 0.  We must be able to output the constant,
2482
   if FORCE is nonzero.  */
2483
 
2484
bool
2485
assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
2486
{
2487
  int aligned_p;
2488
 
2489
  aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
2490
 
2491
  /* See if the target hook can handle this kind of object.  */
2492
  if (targetm.asm_out.integer (x, size, aligned_p))
2493
    return true;
2494
 
2495
  /* If the object is a multi-byte one, try splitting it up.  Split
2496
     it into words it if is multi-word, otherwise split it into bytes.  */
2497
  if (size > 1)
2498
    {
2499
      enum machine_mode omode, imode;
2500
      unsigned int subalign;
2501
      unsigned int subsize, i;
2502
      enum mode_class mclass;
2503
 
2504
      subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2505
      subalign = MIN (align, subsize * BITS_PER_UNIT);
2506
      if (GET_CODE (x) == CONST_FIXED)
2507
        mclass = GET_MODE_CLASS (GET_MODE (x));
2508
      else
2509
        mclass = MODE_INT;
2510
 
2511
      omode = mode_for_size (subsize * BITS_PER_UNIT, mclass, 0);
2512
      imode = mode_for_size (size * BITS_PER_UNIT, mclass, 0);
2513
 
2514
      for (i = 0; i < size; i += subsize)
2515
        {
2516
          rtx partial = simplify_subreg (omode, x, imode, i);
2517
          if (!partial || !assemble_integer (partial, subsize, subalign, 0))
2518
            break;
2519
        }
2520
      if (i == size)
2521
        return true;
2522
 
2523
      /* If we've printed some of it, but not all of it, there's no going
2524
         back now.  */
2525
      gcc_assert (!i);
2526
    }
2527
 
2528
  gcc_assert (!force);
2529
 
2530
  return false;
2531
}
2532
 
2533
void
2534
assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
2535
{
2536
  long data[4] = {0, 0, 0, 0};
2537
  int i;
2538
  int bitsize, nelts, nunits, units_per;
2539
 
2540
  /* This is hairy.  We have a quantity of known size.  real_to_target
2541
     will put it into an array of *host* longs, 32 bits per element
2542
     (even if long is more than 32 bits).  We need to determine the
2543
     number of array elements that are occupied (nelts) and the number
2544
     of *target* min-addressable units that will be occupied in the
2545
     object file (nunits).  We cannot assume that 32 divides the
2546
     mode's bitsize (size * BITS_PER_UNIT) evenly.
2547
 
2548
     size * BITS_PER_UNIT is used here to make sure that padding bits
2549
     (which might appear at either end of the value; real_to_target
2550
     will include the padding bits in its output array) are included.  */
2551
 
2552
  nunits = GET_MODE_SIZE (mode);
2553
  bitsize = nunits * BITS_PER_UNIT;
2554
  nelts = CEIL (bitsize, 32);
2555
  units_per = 32 / BITS_PER_UNIT;
2556
 
2557
  real_to_target (data, &d, mode);
2558
 
2559
  /* Put out the first word with the specified alignment.  */
2560
  assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
2561
  nunits -= units_per;
2562
 
2563
  /* Subsequent words need only 32-bit alignment.  */
2564
  align = min_align (align, 32);
2565
 
2566
  for (i = 1; i < nelts; i++)
2567
    {
2568
      assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
2569
      nunits -= units_per;
2570
    }
2571
}
2572
 
2573
/* Given an expression EXP with a constant value,
2574
   reduce it to the sum of an assembler symbol and an integer.
2575
   Store them both in the structure *VALUE.
2576
   EXP must be reducible.  */
2577
 
2578
struct addr_const {
2579
  rtx base;
2580
  HOST_WIDE_INT offset;
2581
};
2582
 
2583
static void
2584
decode_addr_const (tree exp, struct addr_const *value)
2585
{
2586
  tree target = TREE_OPERAND (exp, 0);
2587
  int offset = 0;
2588
  rtx x;
2589
 
2590
  while (1)
2591
    {
2592
      if (TREE_CODE (target) == COMPONENT_REF
2593
          && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2594
        {
2595
          offset += int_byte_position (TREE_OPERAND (target, 1));
2596
          target = TREE_OPERAND (target, 0);
2597
        }
2598
      else if (TREE_CODE (target) == ARRAY_REF
2599
               || TREE_CODE (target) == ARRAY_RANGE_REF)
2600
        {
2601
          offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2602
                     * tree_low_cst (TREE_OPERAND (target, 1), 0));
2603
          target = TREE_OPERAND (target, 0);
2604
        }
2605
      else if (TREE_CODE (target) == MEM_REF
2606
               && TREE_CODE (TREE_OPERAND (target, 0)) == ADDR_EXPR)
2607
        {
2608
          offset += mem_ref_offset (target).low;
2609
          target = TREE_OPERAND (TREE_OPERAND (target, 0), 0);
2610
        }
2611
      else if (TREE_CODE (target) == INDIRECT_REF
2612
               && TREE_CODE (TREE_OPERAND (target, 0)) == NOP_EXPR
2613
               && TREE_CODE (TREE_OPERAND (TREE_OPERAND (target, 0), 0))
2614
                  == ADDR_EXPR)
2615
        target = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (target, 0), 0), 0);
2616
      else
2617
        break;
2618
    }
2619
 
2620
  switch (TREE_CODE (target))
2621
    {
2622
    case VAR_DECL:
2623
    case FUNCTION_DECL:
2624
      x = DECL_RTL (target);
2625
      break;
2626
 
2627
    case LABEL_DECL:
2628
      x = gen_rtx_MEM (FUNCTION_MODE,
2629
                       gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));
2630
      break;
2631
 
2632
    case REAL_CST:
2633
    case FIXED_CST:
2634
    case STRING_CST:
2635
    case COMPLEX_CST:
2636
    case CONSTRUCTOR:
2637
    case INTEGER_CST:
2638
      x = output_constant_def (target, 1);
2639
      break;
2640
 
2641
    default:
2642
      gcc_unreachable ();
2643
    }
2644
 
2645
  gcc_assert (MEM_P (x));
2646
  x = XEXP (x, 0);
2647
 
2648
  value->base = x;
2649
  value->offset = offset;
2650
}
2651
 
2652
 
2653
static GTY((param_is (struct constant_descriptor_tree)))
2654
     htab_t const_desc_htab;
2655
 
2656
static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2657
 
2658
/* Constant pool accessor function.  */
2659
 
2660
htab_t
2661
constant_pool_htab (void)
2662
{
2663
  return const_desc_htab;
2664
}
2665
 
2666
/* Compute a hash code for a constant expression.  */
2667
 
2668
static hashval_t
2669
const_desc_hash (const void *ptr)
2670
{
2671
  return ((const struct constant_descriptor_tree *)ptr)->hash;
2672
}
2673
 
2674
static hashval_t
2675
const_hash_1 (const tree exp)
2676
{
2677
  const char *p;
2678
  hashval_t hi;
2679
  int len, i;
2680
  enum tree_code code = TREE_CODE (exp);
2681
 
2682
  /* Either set P and LEN to the address and len of something to hash and
2683
     exit the switch or return a value.  */
2684
 
2685
  switch (code)
2686
    {
2687
    case INTEGER_CST:
2688
      p = (char *) &TREE_INT_CST (exp);
2689
      len = sizeof TREE_INT_CST (exp);
2690
      break;
2691
 
2692
    case REAL_CST:
2693
      return real_hash (TREE_REAL_CST_PTR (exp));
2694
 
2695
    case FIXED_CST:
2696
      return fixed_hash (TREE_FIXED_CST_PTR (exp));
2697
 
2698
    case STRING_CST:
2699
      p = TREE_STRING_POINTER (exp);
2700
      len = TREE_STRING_LENGTH (exp);
2701
      break;
2702
 
2703
    case COMPLEX_CST:
2704
      return (const_hash_1 (TREE_REALPART (exp)) * 5
2705
              + const_hash_1 (TREE_IMAGPART (exp)));
2706
 
2707
    case VECTOR_CST:
2708
      {
2709
        tree link;
2710
 
2711
        hi = 7 + TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp));
2712
 
2713
        for (link = TREE_VECTOR_CST_ELTS (exp); link; link = TREE_CHAIN (link))
2714
            hi = hi * 563 + const_hash_1 (TREE_VALUE (link));
2715
 
2716
        return hi;
2717
      }
2718
 
2719
    case CONSTRUCTOR:
2720
      {
2721
        unsigned HOST_WIDE_INT idx;
2722
        tree value;
2723
 
2724
        hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2725
 
2726
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
2727
          if (value)
2728
            hi = hi * 603 + const_hash_1 (value);
2729
 
2730
        return hi;
2731
      }
2732
 
2733
    case ADDR_EXPR:
2734
    case FDESC_EXPR:
2735
      {
2736
        struct addr_const value;
2737
 
2738
        decode_addr_const (exp, &value);
2739
        switch (GET_CODE (value.base))
2740
          {
2741
          case SYMBOL_REF:
2742
            /* Don't hash the address of the SYMBOL_REF;
2743
               only use the offset and the symbol name.  */
2744
            hi = value.offset;
2745
            p = XSTR (value.base, 0);
2746
            for (i = 0; p[i] != 0; i++)
2747
              hi = ((hi * 613) + (unsigned) (p[i]));
2748
            break;
2749
 
2750
          case LABEL_REF:
2751
            hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2752
            break;
2753
 
2754
          default:
2755
            gcc_unreachable ();
2756
          }
2757
      }
2758
      return hi;
2759
 
2760
    case PLUS_EXPR:
2761
    case POINTER_PLUS_EXPR:
2762
    case MINUS_EXPR:
2763
      return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2764
              + const_hash_1 (TREE_OPERAND (exp, 1)));
2765
 
2766
    CASE_CONVERT:
2767
      return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
2768
 
2769
    default:
2770
      /* A language specific constant. Just hash the code.  */
2771
      return code;
2772
    }
2773
 
2774
  /* Compute hashing function.  */
2775
  hi = len;
2776
  for (i = 0; i < len; i++)
2777
    hi = ((hi * 613) + (unsigned) (p[i]));
2778
 
2779
  return hi;
2780
}
2781
 
2782
/* Wrapper of compare_constant, for the htab interface.  */
2783
static int
2784
const_desc_eq (const void *p1, const void *p2)
2785
{
2786
  const struct constant_descriptor_tree *const c1
2787
    = (const struct constant_descriptor_tree *) p1;
2788
  const struct constant_descriptor_tree *const c2
2789
    = (const struct constant_descriptor_tree *) p2;
2790
  if (c1->hash != c2->hash)
2791
    return 0;
2792
  return compare_constant (c1->value, c2->value);
2793
}
2794
 
2795
/* Compare t1 and t2, and return 1 only if they are known to result in
2796
   the same bit pattern on output.  */
2797
 
2798
static int
2799
compare_constant (const tree t1, const tree t2)
2800
{
2801
  enum tree_code typecode;
2802
 
2803
  if (t1 == NULL_TREE)
2804
    return t2 == NULL_TREE;
2805
  if (t2 == NULL_TREE)
2806
    return 0;
2807
 
2808
  if (TREE_CODE (t1) != TREE_CODE (t2))
2809
    return 0;
2810
 
2811
  switch (TREE_CODE (t1))
2812
    {
2813
    case INTEGER_CST:
2814
      /* Integer constants are the same only if the same width of type.  */
2815
      if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2816
        return 0;
2817
      if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2818
        return 0;
2819
      return tree_int_cst_equal (t1, t2);
2820
 
2821
    case REAL_CST:
2822
      /* Real constants are the same only if the same width of type.  */
2823
      if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2824
        return 0;
2825
 
2826
      return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2827
 
2828
    case FIXED_CST:
2829
      /* Fixed constants are the same only if the same width of type.  */
2830
      if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2831
        return 0;
2832
 
2833
      return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2));
2834
 
2835
    case STRING_CST:
2836
      if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2837
        return 0;
2838
 
2839
      return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2840
              && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2841
                         TREE_STRING_LENGTH (t1)));
2842
 
2843
    case COMPLEX_CST:
2844
      return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2845
              && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2846
 
2847
    case VECTOR_CST:
2848
      {
2849
        tree link1, link2;
2850
 
2851
        if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (t1))
2852
            != TYPE_VECTOR_SUBPARTS (TREE_TYPE (t2)))
2853
          return 0;
2854
 
2855
        link2 = TREE_VECTOR_CST_ELTS (t2);
2856
        for (link1 = TREE_VECTOR_CST_ELTS (t1);
2857
             link1;
2858
             link1 = TREE_CHAIN (link1))
2859
          {
2860
            if (!compare_constant (TREE_VALUE (link1), TREE_VALUE (link2)))
2861
              return 0;
2862
            link2 = TREE_CHAIN (link2);
2863
          }
2864
 
2865
        return 1;
2866
      }
2867
 
2868
    case CONSTRUCTOR:
2869
      {
2870
        VEC(constructor_elt, gc) *v1, *v2;
2871
        unsigned HOST_WIDE_INT idx;
2872
 
2873
        typecode = TREE_CODE (TREE_TYPE (t1));
2874
        if (typecode != TREE_CODE (TREE_TYPE (t2)))
2875
          return 0;
2876
 
2877
        if (typecode == ARRAY_TYPE)
2878
          {
2879
            HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2880
            /* For arrays, check that the sizes all match.  */
2881
            if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2882
                || size_1 == -1
2883
                || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2884
              return 0;
2885
          }
2886
        else
2887
          {
2888
            /* For record and union constructors, require exact type
2889
               equality.  */
2890
            if (TREE_TYPE (t1) != TREE_TYPE (t2))
2891
              return 0;
2892
          }
2893
 
2894
        v1 = CONSTRUCTOR_ELTS (t1);
2895
        v2 = CONSTRUCTOR_ELTS (t2);
2896
        if (VEC_length (constructor_elt, v1)
2897
            != VEC_length (constructor_elt, v2))
2898
            return 0;
2899
 
2900
        for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx)
2901
          {
2902
            constructor_elt *c1 = VEC_index (constructor_elt, v1, idx);
2903
            constructor_elt *c2 = VEC_index (constructor_elt, v2, idx);
2904
 
2905
            /* Check that each value is the same...  */
2906
            if (!compare_constant (c1->value, c2->value))
2907
              return 0;
2908
            /* ... and that they apply to the same fields!  */
2909
            if (typecode == ARRAY_TYPE)
2910
              {
2911
                if (!compare_constant (c1->index, c2->index))
2912
                  return 0;
2913
              }
2914
            else
2915
              {
2916
                if (c1->index != c2->index)
2917
                  return 0;
2918
              }
2919
          }
2920
 
2921
        return 1;
2922
      }
2923
 
2924
    case ADDR_EXPR:
2925
    case FDESC_EXPR:
2926
      {
2927
        struct addr_const value1, value2;
2928
        enum rtx_code code;
2929
        int ret;
2930
 
2931
        decode_addr_const (t1, &value1);
2932
        decode_addr_const (t2, &value2);
2933
 
2934
        if (value1.offset != value2.offset)
2935
          return 0;
2936
 
2937
        code = GET_CODE (value1.base);
2938
        if (code != GET_CODE (value2.base))
2939
          return 0;
2940
 
2941
        switch (code)
2942
          {
2943
          case SYMBOL_REF:
2944
            ret = (strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2945
            break;
2946
 
2947
          case LABEL_REF:
2948
            ret = (CODE_LABEL_NUMBER (XEXP (value1.base, 0))
2949
                   == CODE_LABEL_NUMBER (XEXP (value2.base, 0)));
2950
            break;
2951
 
2952
          default:
2953
            gcc_unreachable ();
2954
          }
2955
        return ret;
2956
      }
2957
 
2958
    case PLUS_EXPR:
2959
    case POINTER_PLUS_EXPR:
2960
    case MINUS_EXPR:
2961
    case RANGE_EXPR:
2962
      return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2963
              && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2964
 
2965
    CASE_CONVERT:
2966
    case VIEW_CONVERT_EXPR:
2967
      return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2968
 
2969
    default:
2970
      return 0;
2971
    }
2972
 
2973
  gcc_unreachable ();
2974
}
2975
 
2976
/* Make a copy of the whole tree structure for a constant.  This
2977
   handles the same types of nodes that compare_constant handles.  */
2978
 
2979
static tree
2980
copy_constant (tree exp)
2981
{
2982
  switch (TREE_CODE (exp))
2983
    {
2984
    case ADDR_EXPR:
2985
      /* For ADDR_EXPR, we do not want to copy the decl whose address
2986
         is requested.  We do want to copy constants though.  */
2987
      if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
2988
        return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2989
                       copy_constant (TREE_OPERAND (exp, 0)));
2990
      else
2991
        return copy_node (exp);
2992
 
2993
    case INTEGER_CST:
2994
    case REAL_CST:
2995
    case FIXED_CST:
2996
    case STRING_CST:
2997
      return copy_node (exp);
2998
 
2999
    case COMPLEX_CST:
3000
      return build_complex (TREE_TYPE (exp),
3001
                            copy_constant (TREE_REALPART (exp)),
3002
                            copy_constant (TREE_IMAGPART (exp)));
3003
 
3004
    case PLUS_EXPR:
3005
    case POINTER_PLUS_EXPR:
3006
    case MINUS_EXPR:
3007
      return build2 (TREE_CODE (exp), TREE_TYPE (exp),
3008
                     copy_constant (TREE_OPERAND (exp, 0)),
3009
                     copy_constant (TREE_OPERAND (exp, 1)));
3010
 
3011
    CASE_CONVERT:
3012
    case VIEW_CONVERT_EXPR:
3013
      return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3014
                     copy_constant (TREE_OPERAND (exp, 0)));
3015
 
3016
    case VECTOR_CST:
3017
      return build_vector (TREE_TYPE (exp),
3018
                           copy_list (TREE_VECTOR_CST_ELTS (exp)));
3019
 
3020
    case CONSTRUCTOR:
3021
      {
3022
        tree copy = copy_node (exp);
3023
        VEC(constructor_elt, gc) *v;
3024
        unsigned HOST_WIDE_INT idx;
3025
        tree purpose, value;
3026
 
3027
        v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt,
3028
                                                      CONSTRUCTOR_ELTS (exp)));
3029
        FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
3030
          {
3031
            constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
3032
            ce->index = purpose;
3033
            ce->value = copy_constant (value);
3034
          }
3035
        CONSTRUCTOR_ELTS (copy) = v;
3036
        return copy;
3037
      }
3038
 
3039
    default:
3040
      gcc_unreachable ();
3041
    }
3042
}
3043
 
3044
/* Return the section into which constant EXP should be placed.  */
3045
 
3046
static section *
3047
get_constant_section (tree exp, unsigned int align)
3048
{
3049
  return targetm.asm_out.select_section (exp,
3050
                                         compute_reloc_for_constant (exp),
3051
                                         align);
3052
}
3053
 
3054
/* Return the size of constant EXP in bytes.  */
3055
 
3056
static HOST_WIDE_INT
3057
get_constant_size (tree exp)
3058
{
3059
  HOST_WIDE_INT size;
3060
 
3061
  size = int_size_in_bytes (TREE_TYPE (exp));
3062
  if (TREE_CODE (exp) == STRING_CST)
3063
    size = MAX (TREE_STRING_LENGTH (exp), size);
3064
  return size;
3065
}
3066
 
3067
/* Subroutine of output_constant_def:
3068
   No constant equal to EXP is known to have been output.
3069
   Make a constant descriptor to enter EXP in the hash table.
3070
   Assign the label number and construct RTL to refer to the
3071
   constant's location in memory.
3072
   Caller is responsible for updating the hash table.  */
3073
 
3074
static struct constant_descriptor_tree *
3075
build_constant_desc (tree exp)
3076
{
3077
  struct constant_descriptor_tree *desc;
3078
  rtx symbol, rtl;
3079
  char label[256];
3080
  int labelno;
3081
  tree decl;
3082
 
3083
  desc = ggc_alloc_constant_descriptor_tree ();
3084
  desc->value = copy_constant (exp);
3085
 
3086
  /* Propagate marked-ness to copied constant.  */
3087
  if (flag_mudflap && mf_marked_p (exp))
3088
    mf_mark (desc->value);
3089
 
3090
  /* Create a string containing the label name, in LABEL.  */
3091
  labelno = const_labelno++;
3092
  ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
3093
 
3094
  /* Construct the VAR_DECL associated with the constant.  */
3095
  decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label),
3096
                     TREE_TYPE (exp));
3097
  DECL_ARTIFICIAL (decl) = 1;
3098
  DECL_IGNORED_P (decl) = 1;
3099
  TREE_READONLY (decl) = 1;
3100
  TREE_STATIC (decl) = 1;
3101
  TREE_ADDRESSABLE (decl) = 1;
3102
  /* We don't set the RTL yet as this would cause varpool to assume that the
3103
     variable is referenced.  Moreover, it would just be dropped in LTO mode.
3104
     Instead we set the flag that will be recognized in make_decl_rtl.  */
3105
  DECL_IN_CONSTANT_POOL (decl) = 1;
3106
  DECL_INITIAL (decl) = desc->value;
3107
  /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most
3108
     architectures so use DATA_ALIGNMENT as well, except for strings.  */
3109
  if (TREE_CODE (exp) == STRING_CST)
3110
    {
3111
#ifdef CONSTANT_ALIGNMENT
3112
      DECL_ALIGN (decl) = CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl));
3113
#endif
3114
    }
3115
  else
3116
    align_variable (decl, 0);
3117
 
3118
  /* Now construct the SYMBOL_REF and the MEM.  */
3119
  if (use_object_blocks_p ())
3120
    {
3121
      section *sect = get_constant_section (exp, DECL_ALIGN (decl));
3122
      symbol = create_block_symbol (ggc_strdup (label),
3123
                                    get_block_for_section (sect), -1);
3124
    }
3125
  else
3126
    symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3127
  SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3128
  SET_SYMBOL_REF_DECL (symbol, decl);
3129
  TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3130
 
3131
  rtl = gen_const_mem (TYPE_MODE (TREE_TYPE (exp)), symbol);
3132
  set_mem_attributes (rtl, exp, 1);
3133
  set_mem_alias_set (rtl, 0);
3134
  set_mem_alias_set (rtl, const_alias_set);
3135
 
3136
  /* We cannot share RTX'es in pool entries.
3137
     Mark this piece of RTL as required for unsharing.  */
3138
  RTX_FLAG (rtl, used) = 1;
3139
 
3140
  /* Set flags or add text to the name to record information, such as
3141
     that it is a local symbol.  If the name is changed, the macro
3142
     ASM_OUTPUT_LABELREF will have to know how to strip this
3143
     information.  This call might invalidate our local variable
3144
     SYMBOL; we can't use it afterward.  */
3145
  targetm.encode_section_info (exp, rtl, true);
3146
 
3147
  desc->rtl = rtl;
3148
 
3149
  return desc;
3150
}
3151
 
3152
/* Return an rtx representing a reference to constant data in memory
3153
   for the constant expression EXP.
3154
 
3155
   If assembler code for such a constant has already been output,
3156
   return an rtx to refer to it.
3157
   Otherwise, output such a constant in memory
3158
   and generate an rtx for it.
3159
 
3160
   If DEFER is nonzero, this constant can be deferred and output only
3161
   if referenced in the function after all optimizations.
3162
 
3163
   `const_desc_table' records which constants already have label strings.  */
3164
 
3165
rtx
3166
output_constant_def (tree exp, int defer)
3167
{
3168
  struct constant_descriptor_tree *desc;
3169
  struct constant_descriptor_tree key;
3170
  void **loc;
3171
 
3172
  /* Look up EXP in the table of constant descriptors.  If we didn't find
3173
     it, create a new one.  */
3174
  key.value = exp;
3175
  key.hash = const_hash_1 (exp);
3176
  loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
3177
 
3178
  desc = (struct constant_descriptor_tree *) *loc;
3179
  if (desc == 0)
3180
    {
3181
      desc = build_constant_desc (exp);
3182
      desc->hash = key.hash;
3183
      *loc = desc;
3184
    }
3185
 
3186
  maybe_output_constant_def_contents (desc, defer);
3187
  return desc->rtl;
3188
}
3189
 
3190
/* Subroutine of output_constant_def: Decide whether or not we need to
3191
   output the constant DESC now, and if so, do it.  */
3192
static void
3193
maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
3194
                                    int defer)
3195
{
3196
  rtx symbol = XEXP (desc->rtl, 0);
3197
  tree exp = desc->value;
3198
 
3199
  if (flag_syntax_only)
3200
    return;
3201
 
3202
  if (TREE_ASM_WRITTEN (exp))
3203
    /* Already output; don't do it again.  */
3204
    return;
3205
 
3206
  /* We can always defer constants as long as the context allows
3207
     doing so.  */
3208
  if (defer)
3209
    {
3210
      /* Increment n_deferred_constants if it exists.  It needs to be at
3211
         least as large as the number of constants actually referred to
3212
         by the function.  If it's too small we'll stop looking too early
3213
         and fail to emit constants; if it's too large we'll only look
3214
         through the entire function when we could have stopped earlier.  */
3215
      if (cfun)
3216
        n_deferred_constants++;
3217
      return;
3218
    }
3219
 
3220
  output_constant_def_contents (symbol);
3221
}
3222
 
3223
/* Subroutine of output_constant_def_contents.  Output the definition
3224
   of constant EXP, which is pointed to by label LABEL.  ALIGN is the
3225
   constant's alignment in bits.  */
3226
 
3227
static void
3228
assemble_constant_contents (tree exp, const char *label, unsigned int align)
3229
{
3230
  HOST_WIDE_INT size;
3231
 
3232
  size = get_constant_size (exp);
3233
 
3234
  /* Do any machine/system dependent processing of the constant.  */
3235
  targetm.asm_out.declare_constant_name (asm_out_file, label, exp, size);
3236
 
3237
  /* Output the value of EXP.  */
3238
  output_constant (exp, size, align);
3239
}
3240
 
3241
/* We must output the constant data referred to by SYMBOL; do so.  */
3242
 
3243
static void
3244
output_constant_def_contents (rtx symbol)
3245
{
3246
  tree decl = SYMBOL_REF_DECL (symbol);
3247
  tree exp = DECL_INITIAL (decl);
3248
  unsigned int align;
3249
 
3250
  /* Make sure any other constants whose addresses appear in EXP
3251
     are assigned label numbers.  */
3252
  output_addressed_constants (exp);
3253
 
3254
  /* We are no longer deferring this constant.  */
3255
  TREE_ASM_WRITTEN (decl) = TREE_ASM_WRITTEN (exp) = 1;
3256
 
3257
  /* If the constant is part of an object block, make sure that the
3258
     decl has been positioned within its block, but do not write out
3259
     its definition yet.  output_object_blocks will do that later.  */
3260
  if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
3261
    place_block_symbol (symbol);
3262
  else
3263
    {
3264
      align = DECL_ALIGN (decl);
3265
      switch_to_section (get_constant_section (exp, align));
3266
      if (align > BITS_PER_UNIT)
3267
        ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3268
      assemble_constant_contents (exp, XSTR (symbol, 0), align);
3269
    }
3270
  if (flag_mudflap)
3271
    mudflap_enqueue_constant (exp);
3272
}
3273
 
3274
/* Look up EXP in the table of constant descriptors.  Return the rtl
3275
   if it has been emitted, else null.  */
3276
 
3277
rtx
3278
lookup_constant_def (tree exp)
3279
{
3280
  struct constant_descriptor_tree *desc;
3281
  struct constant_descriptor_tree key;
3282
 
3283
  key.value = exp;
3284
  key.hash = const_hash_1 (exp);
3285
  desc = (struct constant_descriptor_tree *)
3286
    htab_find_with_hash (const_desc_htab, &key, key.hash);
3287
 
3288
  return (desc ? desc->rtl : NULL_RTX);
3289
}
3290
 
3291
/* Return a tree representing a reference to constant data in memory
3292
   for the constant expression EXP.
3293
 
3294
   This is the counterpart of output_constant_def at the Tree level.  */
3295
 
3296
tree
3297
tree_output_constant_def (tree exp)
3298
{
3299
  struct constant_descriptor_tree *desc, key;
3300
  void **loc;
3301
  tree decl;
3302
 
3303
  /* Look up EXP in the table of constant descriptors.  If we didn't find
3304
     it, create a new one.  */
3305
  key.value = exp;
3306
  key.hash = const_hash_1 (exp);
3307
  loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
3308
 
3309
  desc = (struct constant_descriptor_tree *) *loc;
3310
  if (desc == 0)
3311
    {
3312
      desc = build_constant_desc (exp);
3313
      desc->hash = key.hash;
3314
      *loc = desc;
3315
    }
3316
 
3317
  decl = SYMBOL_REF_DECL (XEXP (desc->rtl, 0));
3318
  varpool_finalize_decl (decl);
3319
  return decl;
3320
}
3321
 
3322
/* Used in the hash tables to avoid outputting the same constant
3323
   twice.  Unlike 'struct constant_descriptor_tree', RTX constants
3324
   are output once per function, not once per file.  */
3325
/* ??? Only a few targets need per-function constant pools.  Most
3326
   can use one per-file pool.  Should add a targetm bit to tell the
3327
   difference.  */
3328
 
3329
struct GTY(()) rtx_constant_pool {
3330
  /* Pointers to first and last constant in pool, as ordered by offset.  */
3331
  struct constant_descriptor_rtx *first;
3332
  struct constant_descriptor_rtx *last;
3333
 
3334
  /* Hash facility for making memory-constants from constant rtl-expressions.
3335
     It is used on RISC machines where immediate integer arguments and
3336
     constant addresses are restricted so that such constants must be stored
3337
     in memory.  */
3338
  htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
3339
 
3340
  /* Current offset in constant pool (does not include any
3341
     machine-specific header).  */
3342
  HOST_WIDE_INT offset;
3343
};
3344
 
3345
struct GTY((chain_next ("%h.next"))) constant_descriptor_rtx {
3346
  struct constant_descriptor_rtx *next;
3347
  rtx mem;
3348
  rtx sym;
3349
  rtx constant;
3350
  HOST_WIDE_INT offset;
3351
  hashval_t hash;
3352
  enum machine_mode mode;
3353
  unsigned int align;
3354
  int labelno;
3355
  int mark;
3356
};
3357
 
3358
/* Hash and compare functions for const_rtx_htab.  */
3359
 
3360
static hashval_t
3361
const_desc_rtx_hash (const void *ptr)
3362
{
3363
  const struct constant_descriptor_rtx *const desc
3364
    = (const struct constant_descriptor_rtx *) ptr;
3365
  return desc->hash;
3366
}
3367
 
3368
static int
3369
const_desc_rtx_eq (const void *a, const void *b)
3370
{
3371
  const struct constant_descriptor_rtx *const x
3372
    = (const struct constant_descriptor_rtx *) a;
3373
  const struct constant_descriptor_rtx *const y
3374
    = (const struct constant_descriptor_rtx *) b;
3375
 
3376
  if (x->mode != y->mode)
3377
    return 0;
3378
  return rtx_equal_p (x->constant, y->constant);
3379
}
3380
 
3381
/* This is the worker function for const_rtx_hash, called via for_each_rtx.  */
3382
 
3383
static int
3384
const_rtx_hash_1 (rtx *xp, void *data)
3385
{
3386
  unsigned HOST_WIDE_INT hwi;
3387
  enum machine_mode mode;
3388
  enum rtx_code code;
3389
  hashval_t h, *hp;
3390
  rtx x;
3391
 
3392
  x = *xp;
3393
  code = GET_CODE (x);
3394
  mode = GET_MODE (x);
3395
  h = (hashval_t) code * 1048573 + mode;
3396
 
3397
  switch (code)
3398
    {
3399
    case CONST_INT:
3400
      hwi = INTVAL (x);
3401
    fold_hwi:
3402
      {
3403
        int shift = sizeof (hashval_t) * CHAR_BIT;
3404
        const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3405
        int i;
3406
 
3407
        h ^= (hashval_t) hwi;
3408
        for (i = 1; i < n; ++i)
3409
          {
3410
            hwi >>= shift;
3411
            h ^= (hashval_t) hwi;
3412
          }
3413
      }
3414
      break;
3415
 
3416
    case CONST_DOUBLE:
3417
      if (mode == VOIDmode)
3418
        {
3419
          hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3420
          goto fold_hwi;
3421
        }
3422
      else
3423
        h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
3424
      break;
3425
 
3426
    case CONST_FIXED:
3427
      h ^= fixed_hash (CONST_FIXED_VALUE (x));
3428
      break;
3429
 
3430
    case CONST_VECTOR:
3431
      {
3432
        int i;
3433
        for (i = XVECLEN (x, 0); i-- > 0; )
3434
          h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
3435
      }
3436
      break;
3437
 
3438
    case SYMBOL_REF:
3439
      h ^= htab_hash_string (XSTR (x, 0));
3440
      break;
3441
 
3442
    case LABEL_REF:
3443
      h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
3444
      break;
3445
 
3446
    case UNSPEC:
3447
    case UNSPEC_VOLATILE:
3448
      h = h * 251 + XINT (x, 1);
3449
      break;
3450
 
3451
    default:
3452
      break;
3453
    }
3454
 
3455
  hp = (hashval_t *) data;
3456
  *hp = *hp * 509 + h;
3457
  return 0;
3458
}
3459
 
3460
/* Compute a hash value for X, which should be a constant.  */
3461
 
3462
static hashval_t
3463
const_rtx_hash (rtx x)
3464
{
3465
  hashval_t h = 0;
3466
  for_each_rtx (&x, const_rtx_hash_1, &h);
3467
  return h;
3468
}
3469
 
3470
 
3471
/* Create and return a new rtx constant pool.  */
3472
 
3473
static struct rtx_constant_pool *
3474
create_constant_pool (void)
3475
{
3476
  struct rtx_constant_pool *pool;
3477
 
3478
  pool = ggc_alloc_rtx_constant_pool ();
3479
  pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3480
                                          const_desc_rtx_eq, NULL);
3481
  pool->first = NULL;
3482
  pool->last = NULL;
3483
  pool->offset = 0;
3484
  return pool;
3485
}
3486
 
3487
/* Initialize constant pool hashing for a new function.  */
3488
 
3489
void
3490
init_varasm_status (void)
3491
{
3492
  crtl->varasm.pool = create_constant_pool ();
3493
  crtl->varasm.deferred_constants = 0;
3494
}
3495
 
3496
/* Given a MINUS expression, simplify it if both sides
3497
   include the same symbol.  */
3498
 
3499
rtx
3500
simplify_subtraction (rtx x)
3501
{
3502
  rtx r = simplify_rtx (x);
3503
  return r ? r : x;
3504
}
3505
 
3506
/* Given a constant rtx X, make (or find) a memory constant for its value
3507
   and return a MEM rtx to refer to it in memory.  */
3508
 
3509
rtx
3510
force_const_mem (enum machine_mode mode, rtx x)
3511
{
3512
  struct constant_descriptor_rtx *desc, tmp;
3513
  struct rtx_constant_pool *pool;
3514
  char label[256];
3515
  rtx def, symbol;
3516
  hashval_t hash;
3517
  unsigned int align;
3518
  void **slot;
3519
 
3520
  /* If we're not allowed to drop X into the constant pool, don't.  */
3521
  if (targetm.cannot_force_const_mem (mode, x))
3522
    return NULL_RTX;
3523
 
3524
  /* Record that this function has used a constant pool entry.  */
3525
  crtl->uses_const_pool = 1;
3526
 
3527
  /* Decide which pool to use.  */
3528
  pool = (targetm.use_blocks_for_constant_p (mode, x)
3529
          ? shared_constant_pool
3530
          : crtl->varasm.pool);
3531
 
3532
  /* Lookup the value in the hashtable.  */
3533
  tmp.constant = x;
3534
  tmp.mode = mode;
3535
  hash = const_rtx_hash (x);
3536
  slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3537
  desc = (struct constant_descriptor_rtx *) *slot;
3538
 
3539
  /* If the constant was already present, return its memory.  */
3540
  if (desc)
3541
    return copy_rtx (desc->mem);
3542
 
3543
  /* Otherwise, create a new descriptor.  */
3544
  desc = ggc_alloc_constant_descriptor_rtx ();
3545
  *slot = desc;
3546
 
3547
  /* Align the location counter as required by EXP's data type.  */
3548
  align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3549
#ifdef CONSTANT_ALIGNMENT
3550
  {
3551
    tree type = lang_hooks.types.type_for_mode (mode, 0);
3552
    if (type != NULL_TREE)
3553
      align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3554
  }
3555
#endif
3556
 
3557
  pool->offset += (align / BITS_PER_UNIT) - 1;
3558
  pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3559
 
3560
  desc->next = NULL;
3561
  desc->constant = copy_rtx (tmp.constant);
3562
  desc->offset = pool->offset;
3563
  desc->hash = hash;
3564
  desc->mode = mode;
3565
  desc->align = align;
3566
  desc->labelno = const_labelno;
3567
  desc->mark = 0;
3568
 
3569
  pool->offset += GET_MODE_SIZE (mode);
3570
  if (pool->last)
3571
    pool->last->next = desc;
3572
  else
3573
    pool->first = pool->last = desc;
3574
  pool->last = desc;
3575
 
3576
  /* Create a string containing the label name, in LABEL.  */
3577
  ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3578
  ++const_labelno;
3579
 
3580
  /* Construct the SYMBOL_REF.  Make sure to mark it as belonging to
3581
     the constants pool.  */
3582
  if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x))
3583
    {
3584
      section *sect = targetm.asm_out.select_rtx_section (mode, x, align);
3585
      symbol = create_block_symbol (ggc_strdup (label),
3586
                                    get_block_for_section (sect), -1);
3587
    }
3588
  else
3589
    symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3590
  desc->sym = symbol;
3591
  SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3592
  CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3593
  SET_SYMBOL_REF_CONSTANT (symbol, desc);
3594
 
3595
  /* Construct the MEM.  */
3596
  desc->mem = def = gen_const_mem (mode, symbol);
3597
  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
3598
  set_mem_align (def, align);
3599
 
3600
  /* If we're dropping a label to the constant pool, make sure we
3601
     don't delete it.  */
3602
  if (GET_CODE (x) == LABEL_REF)
3603
    LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3604
 
3605
  return copy_rtx (def);
3606
}
3607
 
3608
/* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3609
 
3610
rtx
3611
get_pool_constant (rtx addr)
3612
{
3613
  return SYMBOL_REF_CONSTANT (addr)->constant;
3614
}
3615
 
3616
/* Given a constant pool SYMBOL_REF, return the corresponding constant
3617
   and whether it has been output or not.  */
3618
 
3619
rtx
3620
get_pool_constant_mark (rtx addr, bool *pmarked)
3621
{
3622
  struct constant_descriptor_rtx *desc;
3623
 
3624
  desc = SYMBOL_REF_CONSTANT (addr);
3625
  *pmarked = (desc->mark != 0);
3626
  return desc->constant;
3627
}
3628
 
3629
/* Similar, return the mode.  */
3630
 
3631
enum machine_mode
3632
get_pool_mode (const_rtx addr)
3633
{
3634
  return SYMBOL_REF_CONSTANT (addr)->mode;
3635
}
3636
 
3637
/* Return the size of the constant pool.  */
3638
 
3639
int
3640
get_pool_size (void)
3641
{
3642
  return crtl->varasm.pool->offset;
3643
}
3644
 
3645
/* Worker function for output_constant_pool_1.  Emit assembly for X
3646
   in MODE with known alignment ALIGN.  */
3647
 
3648
static void
3649
output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
3650
{
3651
  switch (GET_MODE_CLASS (mode))
3652
    {
3653
    case MODE_FLOAT:
3654
    case MODE_DECIMAL_FLOAT:
3655
      {
3656
        REAL_VALUE_TYPE r;
3657
 
3658
        gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3659
        REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3660
        assemble_real (r, mode, align);
3661
        break;
3662
      }
3663
 
3664
    case MODE_INT:
3665
    case MODE_PARTIAL_INT:
3666
    case MODE_FRACT:
3667
    case MODE_UFRACT:
3668
    case MODE_ACCUM:
3669
    case MODE_UACCUM:
3670
      assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3671
      break;
3672
 
3673
    case MODE_VECTOR_FLOAT:
3674
    case MODE_VECTOR_INT:
3675
    case MODE_VECTOR_FRACT:
3676
    case MODE_VECTOR_UFRACT:
3677
    case MODE_VECTOR_ACCUM:
3678
    case MODE_VECTOR_UACCUM:
3679
      {
3680
        int i, units;
3681
        enum machine_mode submode = GET_MODE_INNER (mode);
3682
        unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3683
 
3684
        gcc_assert (GET_CODE (x) == CONST_VECTOR);
3685
        units = CONST_VECTOR_NUNITS (x);
3686
 
3687
        for (i = 0; i < units; i++)
3688
          {
3689
            rtx elt = CONST_VECTOR_ELT (x, i);
3690
            output_constant_pool_2 (submode, elt, i ? subalign : align);
3691
          }
3692
      }
3693
      break;
3694
 
3695
    default:
3696
      gcc_unreachable ();
3697
    }
3698
}
3699
 
3700
/* Worker function for output_constant_pool.  Emit constant DESC,
3701
   giving it ALIGN bits of alignment.  */
3702
 
3703
static void
3704
output_constant_pool_1 (struct constant_descriptor_rtx *desc,
3705
                        unsigned int align)
3706
{
3707
  rtx x, tmp;
3708
 
3709
  x = desc->constant;
3710
 
3711
  /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3712
     whose CODE_LABEL has been deleted.  This can occur if a jump table
3713
     is eliminated by optimization.  If so, write a constant of zero
3714
     instead.  Note that this can also happen by turning the
3715
     CODE_LABEL into a NOTE.  */
3716
  /* ??? This seems completely and utterly wrong.  Certainly it's
3717
     not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3718
     functioning even with INSN_DELETED_P and friends.  */
3719
 
3720
  tmp = x;
3721
  switch (GET_CODE (tmp))
3722
    {
3723
    case CONST:
3724
      if (GET_CODE (XEXP (tmp, 0)) != PLUS
3725
          || GET_CODE (XEXP (XEXP (tmp, 0), 0)) != LABEL_REF)
3726
        break;
3727
      tmp = XEXP (XEXP (tmp, 0), 0);
3728
      /* FALLTHRU  */
3729
 
3730
    case LABEL_REF:
3731
      tmp = XEXP (tmp, 0);
3732
      gcc_assert (!INSN_DELETED_P (tmp));
3733
      gcc_assert (!NOTE_P (tmp)
3734
                  || NOTE_KIND (tmp) != NOTE_INSN_DELETED);
3735
      break;
3736
 
3737
    default:
3738
      break;
3739
    }
3740
 
3741
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3742
  ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3743
                                 align, desc->labelno, done);
3744
#endif
3745
 
3746
  assemble_align (align);
3747
 
3748
  /* Output the label.  */
3749
  targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3750
 
3751
  /* Output the data.  */
3752
  output_constant_pool_2 (desc->mode, x, align);
3753
 
3754
  /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3755
     sections have proper size.  */
3756
  if (align > GET_MODE_BITSIZE (desc->mode)
3757
      && in_section
3758
      && (in_section->common.flags & SECTION_MERGE))
3759
    assemble_align (align);
3760
 
3761
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3762
 done:
3763
#endif
3764
  return;
3765
}
3766
 
3767
/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3768
   to as used.  Emit referenced deferred strings.  This function can
3769
   be used with for_each_rtx to mark all SYMBOL_REFs in an rtx.  */
3770
 
3771
static int
3772
mark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED)
3773
{
3774
  rtx x = *current_rtx;
3775
 
3776
  if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3777
    return 0;
3778
 
3779
  if (CONSTANT_POOL_ADDRESS_P (x))
3780
    {
3781
      struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x);
3782
      if (desc->mark == 0)
3783
        {
3784
          desc->mark = 1;
3785
          for_each_rtx (&desc->constant, mark_constant, NULL);
3786
        }
3787
    }
3788
  else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3789
    {
3790
      tree decl = SYMBOL_REF_DECL (x);
3791
      if (!TREE_ASM_WRITTEN (DECL_INITIAL (decl)))
3792
        {
3793
          n_deferred_constants--;
3794
          output_constant_def_contents (x);
3795
        }
3796
    }
3797
 
3798
  return -1;
3799
}
3800
 
3801
/* Look through appropriate parts of INSN, marking all entries in the
3802
   constant pool which are actually being used.  Entries that are only
3803
   referenced by other constants are also marked as used.  Emit
3804
   deferred strings that are used.  */
3805
 
3806
static void
3807
mark_constants (rtx insn)
3808
{
3809
  if (!INSN_P (insn))
3810
    return;
3811
 
3812
  /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3813
     insns, not any notes that may be attached.  We don't want to mark
3814
     a constant just because it happens to appear in a REG_EQUIV note.  */
3815
  if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3816
    {
3817
      rtx seq = PATTERN (insn);
3818
      int i, n = XVECLEN (seq, 0);
3819
      for (i = 0; i < n; ++i)
3820
        {
3821
          rtx subinsn = XVECEXP (seq, 0, i);
3822
          if (INSN_P (subinsn))
3823
            for_each_rtx (&PATTERN (subinsn), mark_constant, NULL);
3824
        }
3825
    }
3826
  else
3827
    for_each_rtx (&PATTERN (insn), mark_constant, NULL);
3828
}
3829
 
3830
/* Look through the instructions for this function, and mark all the
3831
   entries in POOL which are actually being used.  Emit deferred constants
3832
   which have indeed been used.  */
3833
 
3834
static void
3835
mark_constant_pool (void)
3836
{
3837
  rtx insn, link;
3838
 
3839
  if (!crtl->uses_const_pool && n_deferred_constants == 0)
3840
    return;
3841
 
3842
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3843
    mark_constants (insn);
3844
 
3845
  for (link = crtl->epilogue_delay_list;
3846
       link;
3847
       link = XEXP (link, 1))
3848
    mark_constants (XEXP (link, 0));
3849
}
3850
 
3851
/* Write all the constants in POOL.  */
3852
 
3853
static void
3854
output_constant_pool_contents (struct rtx_constant_pool *pool)
3855
{
3856
  struct constant_descriptor_rtx *desc;
3857
 
3858
  for (desc = pool->first; desc ; desc = desc->next)
3859
    if (desc->mark)
3860
      {
3861
        /* If the constant is part of an object_block, make sure that
3862
           the constant has been positioned within its block, but do not
3863
           write out its definition yet.  output_object_blocks will do
3864
           that later.  */
3865
        if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym)
3866
            && SYMBOL_REF_BLOCK (desc->sym))
3867
          place_block_symbol (desc->sym);
3868
        else
3869
          {
3870
            switch_to_section (targetm.asm_out.select_rtx_section
3871
                               (desc->mode, desc->constant, desc->align));
3872
            output_constant_pool_1 (desc, desc->align);
3873
          }
3874
      }
3875
}
3876
 
3877
/* Mark all constants that are used in the current function, then write
3878
   out the function's private constant pool.  */
3879
 
3880
static void
3881
output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3882
                      tree fndecl ATTRIBUTE_UNUSED)
3883
{
3884
  struct rtx_constant_pool *pool = crtl->varasm.pool;
3885
 
3886
  /* It is possible for gcc to call force_const_mem and then to later
3887
     discard the instructions which refer to the constant.  In such a
3888
     case we do not need to output the constant.  */
3889
  mark_constant_pool ();
3890
 
3891
#ifdef ASM_OUTPUT_POOL_PROLOGUE
3892
  ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3893
#endif
3894
 
3895
  output_constant_pool_contents (pool);
3896
 
3897
#ifdef ASM_OUTPUT_POOL_EPILOGUE
3898
  ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3899
#endif
3900
}
3901
 
3902
/* Write the contents of the shared constant pool.  */
3903
 
3904
void
3905
output_shared_constant_pool (void)
3906
{
3907
  output_constant_pool_contents (shared_constant_pool);
3908
}
3909
 
3910
/* Determine what kind of relocations EXP may need.  */
3911
 
3912
int
3913
compute_reloc_for_constant (tree exp)
3914
{
3915
  int reloc = 0, reloc2;
3916
  tree tem;
3917
 
3918
  switch (TREE_CODE (exp))
3919
    {
3920
    case ADDR_EXPR:
3921
    case FDESC_EXPR:
3922
      /* Go inside any operations that get_inner_reference can handle and see
3923
         if what's inside is a constant: no need to do anything here for
3924
         addresses of variables or functions.  */
3925
      for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3926
           tem = TREE_OPERAND (tem, 0))
3927
        ;
3928
 
3929
      if (TREE_PUBLIC (tem))
3930
        reloc |= 2;
3931
      else
3932
        reloc |= 1;
3933
      break;
3934
 
3935
    case PLUS_EXPR:
3936
    case POINTER_PLUS_EXPR:
3937
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3938
      reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3939
      break;
3940
 
3941
    case MINUS_EXPR:
3942
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3943
      reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3944
      /* The difference of two local labels is computable at link time.  */
3945
      if (reloc == 1 && reloc2 == 1)
3946
        reloc = 0;
3947
      else
3948
        reloc |= reloc2;
3949
      break;
3950
 
3951
    CASE_CONVERT:
3952
    case VIEW_CONVERT_EXPR:
3953
      reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3954
      break;
3955
 
3956
    case CONSTRUCTOR:
3957
      {
3958
        unsigned HOST_WIDE_INT idx;
3959
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3960
          if (tem != 0)
3961
            reloc |= compute_reloc_for_constant (tem);
3962
      }
3963
      break;
3964
 
3965
    default:
3966
      break;
3967
    }
3968
  return reloc;
3969
}
3970
 
3971
/* Find all the constants whose addresses are referenced inside of EXP,
3972
   and make sure assembler code with a label has been output for each one.
3973
   Indicate whether an ADDR_EXPR has been encountered.  */
3974
 
3975
static void
3976
output_addressed_constants (tree exp)
3977
{
3978
  tree tem;
3979
 
3980
  switch (TREE_CODE (exp))
3981
    {
3982
    case ADDR_EXPR:
3983
    case FDESC_EXPR:
3984
      /* Go inside any operations that get_inner_reference can handle and see
3985
         if what's inside is a constant: no need to do anything here for
3986
         addresses of variables or functions.  */
3987
      for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3988
           tem = TREE_OPERAND (tem, 0))
3989
        ;
3990
 
3991
      /* If we have an initialized CONST_DECL, retrieve the initializer.  */
3992
      if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3993
        tem = DECL_INITIAL (tem);
3994
 
3995
      if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
3996
        output_constant_def (tem, 0);
3997
      break;
3998
 
3999
    case PLUS_EXPR:
4000
    case POINTER_PLUS_EXPR:
4001
    case MINUS_EXPR:
4002
      output_addressed_constants (TREE_OPERAND (exp, 1));
4003
      /* Fall through.  */
4004
 
4005
    CASE_CONVERT:
4006
    case VIEW_CONVERT_EXPR:
4007
      output_addressed_constants (TREE_OPERAND (exp, 0));
4008
      break;
4009
 
4010
    case CONSTRUCTOR:
4011
      {
4012
        unsigned HOST_WIDE_INT idx;
4013
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
4014
          if (tem != 0)
4015
            output_addressed_constants (tem);
4016
      }
4017
      break;
4018
 
4019
    default:
4020
      break;
4021
    }
4022
}
4023
 
4024
/* Whether a constructor CTOR is a valid static constant initializer if all
4025
   its elements are.  This used to be internal to initializer_constant_valid_p
4026
   and has been exposed to let other functions like categorize_ctor_elements
4027
   evaluate the property while walking a constructor for other purposes.  */
4028
 
4029
bool
4030
constructor_static_from_elts_p (const_tree ctor)
4031
{
4032
  return (TREE_CONSTANT (ctor)
4033
          && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4034
              || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE
4035
              || TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE));
4036
}
4037
 
4038
static tree initializer_constant_valid_p_1 (tree value, tree endtype,
4039
                                            tree *cache);
4040
 
4041
/* A subroutine of initializer_constant_valid_p.  VALUE is a MINUS_EXPR,
4042
   PLUS_EXPR or POINTER_PLUS_EXPR.  This looks for cases of VALUE
4043
   which are valid when ENDTYPE is an integer of any size; in
4044
   particular, this does not accept a pointer minus a constant.  This
4045
   returns null_pointer_node if the VALUE is an absolute constant
4046
   which can be used to initialize a static variable.  Otherwise it
4047
   returns NULL.  */
4048
 
4049
static tree
4050
narrowing_initializer_constant_valid_p (tree value, tree endtype, tree *cache)
4051
{
4052
  tree op0, op1;
4053
 
4054
  if (!INTEGRAL_TYPE_P (endtype))
4055
    return NULL_TREE;
4056
 
4057
  op0 = TREE_OPERAND (value, 0);
4058
  op1 = TREE_OPERAND (value, 1);
4059
 
4060
  /* Like STRIP_NOPS except allow the operand mode to widen.  This
4061
     works around a feature of fold that simplifies (int)(p1 - p2) to
4062
     ((int)p1 - (int)p2) under the theory that the narrower operation
4063
     is cheaper.  */
4064
 
4065
  while (CONVERT_EXPR_P (op0)
4066
         || TREE_CODE (op0) == NON_LVALUE_EXPR)
4067
    {
4068
      tree inner = TREE_OPERAND (op0, 0);
4069
      if (inner == error_mark_node
4070
          || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4071
          || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
4072
              > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4073
        break;
4074
      op0 = inner;
4075
    }
4076
 
4077
  while (CONVERT_EXPR_P (op1)
4078
         || TREE_CODE (op1) == NON_LVALUE_EXPR)
4079
    {
4080
      tree inner = TREE_OPERAND (op1, 0);
4081
      if (inner == error_mark_node
4082
          || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4083
          || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
4084
              > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4085
        break;
4086
      op1 = inner;
4087
    }
4088
 
4089
  op0 = initializer_constant_valid_p_1 (op0, endtype, cache);
4090
  if (!op0)
4091
    return NULL_TREE;
4092
 
4093
  op1 = initializer_constant_valid_p_1 (op1, endtype,
4094
                                        cache ? cache + 2 : NULL);
4095
  /* Both initializers must be known.  */
4096
  if (op1)
4097
    {
4098
      if (op0 == op1
4099
          && (op0 == null_pointer_node
4100
              || TREE_CODE (value) == MINUS_EXPR))
4101
        return null_pointer_node;
4102
 
4103
      /* Support differences between labels.  */
4104
      if (TREE_CODE (op0) == LABEL_DECL
4105
          && TREE_CODE (op1) == LABEL_DECL)
4106
        return null_pointer_node;
4107
 
4108
      if (TREE_CODE (op0) == STRING_CST
4109
          && TREE_CODE (op1) == STRING_CST
4110
          && operand_equal_p (op0, op1, 1))
4111
        return null_pointer_node;
4112
    }
4113
 
4114
  return NULL_TREE;
4115
}
4116
 
4117
/* Helper function of initializer_constant_valid_p.
4118
   Return nonzero if VALUE is a valid constant-valued expression
4119
   for use in initializing a static variable; one that can be an
4120
   element of a "constant" initializer.
4121
 
4122
   Return null_pointer_node if the value is absolute;
4123
   if it is relocatable, return the variable that determines the relocation.
4124
   We assume that VALUE has been folded as much as possible;
4125
   therefore, we do not need to check for such things as
4126
   arithmetic-combinations of integers.
4127
 
4128
   Use CACHE (pointer to 2 tree values) for caching if non-NULL.  */
4129
 
4130
static tree
4131
initializer_constant_valid_p_1 (tree value, tree endtype, tree *cache)
4132
{
4133
  tree ret;
4134
 
4135
  switch (TREE_CODE (value))
4136
    {
4137
    case CONSTRUCTOR:
4138
      if (constructor_static_from_elts_p (value))
4139
        {
4140
          unsigned HOST_WIDE_INT idx;
4141
          tree elt;
4142
          bool absolute = true;
4143
 
4144
          if (cache && cache[0] == value)
4145
            return cache[1];
4146
          FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
4147
            {
4148
              tree reloc;
4149
              reloc = initializer_constant_valid_p_1 (elt, TREE_TYPE (elt),
4150
                                                      NULL);
4151
              if (!reloc)
4152
                {
4153
                  if (cache)
4154
                    {
4155
                      cache[0] = value;
4156
                      cache[1] = NULL_TREE;
4157
                    }
4158
                  return NULL_TREE;
4159
                }
4160
              if (reloc != null_pointer_node)
4161
                absolute = false;
4162
            }
4163
          /* For a non-absolute relocation, there is no single
4164
             variable that can be "the variable that determines the
4165
             relocation."  */
4166
          if (cache)
4167
            {
4168
              cache[0] = value;
4169
              cache[1] = absolute ? null_pointer_node : error_mark_node;
4170
            }
4171
          return absolute ? null_pointer_node : error_mark_node;
4172
        }
4173
 
4174
      return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
4175
 
4176
    case INTEGER_CST:
4177
    case VECTOR_CST:
4178
    case REAL_CST:
4179
    case FIXED_CST:
4180
    case STRING_CST:
4181
    case COMPLEX_CST:
4182
      return null_pointer_node;
4183
 
4184
    case ADDR_EXPR:
4185
    case FDESC_EXPR:
4186
      {
4187
        tree op0 = staticp (TREE_OPERAND (value, 0));
4188
        if (op0)
4189
          {
4190
            /* "&(*a).f" is like unto pointer arithmetic.  If "a" turns out
4191
               to be a constant, this is old-skool offsetof-like nonsense.  */
4192
            if (TREE_CODE (op0) == INDIRECT_REF
4193
                && TREE_CONSTANT (TREE_OPERAND (op0, 0)))
4194
              return null_pointer_node;
4195
            /* Taking the address of a nested function involves a trampoline,
4196
               unless we don't need or want one.  */
4197
            if (TREE_CODE (op0) == FUNCTION_DECL
4198
                && DECL_STATIC_CHAIN (op0)
4199
                && !TREE_NO_TRAMPOLINE (value))
4200
              return NULL_TREE;
4201
            /* "&{...}" requires a temporary to hold the constructed
4202
               object.  */
4203
            if (TREE_CODE (op0) == CONSTRUCTOR)
4204
              return NULL_TREE;
4205
          }
4206
        return op0;
4207
      }
4208
 
4209
    case NON_LVALUE_EXPR:
4210
      return initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4211
                                             endtype, cache);
4212
 
4213
    case VIEW_CONVERT_EXPR:
4214
      {
4215
        tree src = TREE_OPERAND (value, 0);
4216
        tree src_type = TREE_TYPE (src);
4217
        tree dest_type = TREE_TYPE (value);
4218
 
4219
        /* Allow view-conversions from aggregate to non-aggregate type only
4220
           if the bit pattern is fully preserved afterwards; otherwise, the
4221
           RTL expander won't be able to apply a subsequent transformation
4222
           to the underlying constructor.  */
4223
        if (AGGREGATE_TYPE_P (src_type) && !AGGREGATE_TYPE_P (dest_type))
4224
          {
4225
            if (TYPE_MODE (endtype) == TYPE_MODE (dest_type))
4226
              return initializer_constant_valid_p_1 (src, endtype, cache);
4227
            else
4228
              return NULL_TREE;
4229
          }
4230
 
4231
        /* Allow all other kinds of view-conversion.  */
4232
        return initializer_constant_valid_p_1 (src, endtype, cache);
4233
      }
4234
 
4235
    CASE_CONVERT:
4236
      {
4237
        tree src = TREE_OPERAND (value, 0);
4238
        tree src_type = TREE_TYPE (src);
4239
        tree dest_type = TREE_TYPE (value);
4240
 
4241
        /* Allow conversions between pointer types, floating-point
4242
           types, and offset types.  */
4243
        if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
4244
            || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
4245
            || (TREE_CODE (dest_type) == OFFSET_TYPE
4246
                && TREE_CODE (src_type) == OFFSET_TYPE))
4247
          return initializer_constant_valid_p_1 (src, endtype, cache);
4248
 
4249
        /* Allow length-preserving conversions between integer types.  */
4250
        if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
4251
            && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
4252
          return initializer_constant_valid_p_1 (src, endtype, cache);
4253
 
4254
        /* Allow conversions between other integer types only if
4255
           explicit value.  */
4256
        if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
4257
          {
4258
            tree inner = initializer_constant_valid_p_1 (src, endtype, cache);
4259
            if (inner == null_pointer_node)
4260
              return null_pointer_node;
4261
            break;
4262
          }
4263
 
4264
        /* Allow (int) &foo provided int is as wide as a pointer.  */
4265
        if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
4266
            && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
4267
          return initializer_constant_valid_p_1 (src, endtype, cache);
4268
 
4269
        /* Likewise conversions from int to pointers, but also allow
4270
           conversions from 0.  */
4271
        if ((POINTER_TYPE_P (dest_type)
4272
             || TREE_CODE (dest_type) == OFFSET_TYPE)
4273
            && INTEGRAL_TYPE_P (src_type))
4274
          {
4275
            if (TREE_CODE (src) == INTEGER_CST
4276
                && TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))
4277
              return null_pointer_node;
4278
            if (integer_zerop (src))
4279
              return null_pointer_node;
4280
            else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
4281
              return initializer_constant_valid_p_1 (src, endtype, cache);
4282
          }
4283
 
4284
        /* Allow conversions to struct or union types if the value
4285
           inside is okay.  */
4286
        if (TREE_CODE (dest_type) == RECORD_TYPE
4287
            || TREE_CODE (dest_type) == UNION_TYPE)
4288
          return initializer_constant_valid_p_1 (src, endtype, cache);
4289
      }
4290
      break;
4291
 
4292
    case POINTER_PLUS_EXPR:
4293
    case PLUS_EXPR:
4294
      /* Any valid floating-point constants will have been folded by now;
4295
         with -frounding-math we hit this with addition of two constants.  */
4296
      if (TREE_CODE (endtype) == REAL_TYPE)
4297
        return NULL_TREE;
4298
      if (cache && cache[0] == value)
4299
        return cache[1];
4300
      if (! INTEGRAL_TYPE_P (endtype)
4301
          || TYPE_PRECISION (endtype) >= TYPE_PRECISION (TREE_TYPE (value)))
4302
        {
4303
          tree ncache[4] = { NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE };
4304
          tree valid0
4305
            = initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4306
                                              endtype, ncache);
4307
          tree valid1
4308
            = initializer_constant_valid_p_1 (TREE_OPERAND (value, 1),
4309
                                              endtype, ncache + 2);
4310
          /* If either term is absolute, use the other term's relocation.  */
4311
          if (valid0 == null_pointer_node)
4312
            ret = valid1;
4313
          else if (valid1 == null_pointer_node)
4314
            ret = valid0;
4315
          /* Support narrowing pointer differences.  */
4316
          else
4317
            ret = narrowing_initializer_constant_valid_p (value, endtype,
4318
                                                          ncache);
4319
        }
4320
      else
4321
      /* Support narrowing pointer differences.  */
4322
        ret = narrowing_initializer_constant_valid_p (value, endtype, NULL);
4323
      if (cache)
4324
        {
4325
          cache[0] = value;
4326
          cache[1] = ret;
4327
        }
4328
      return ret;
4329
 
4330
    case MINUS_EXPR:
4331
      if (TREE_CODE (endtype) == REAL_TYPE)
4332
        return NULL_TREE;
4333
      if (cache && cache[0] == value)
4334
        return cache[1];
4335
      if (! INTEGRAL_TYPE_P (endtype)
4336
          || TYPE_PRECISION (endtype) >= TYPE_PRECISION (TREE_TYPE (value)))
4337
        {
4338
          tree ncache[4] = { NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE };
4339
          tree valid0
4340
            = initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4341
                                              endtype, ncache);
4342
          tree valid1
4343
            = initializer_constant_valid_p_1 (TREE_OPERAND (value, 1),
4344
                                              endtype, ncache + 2);
4345
          /* Win if second argument is absolute.  */
4346
          if (valid1 == null_pointer_node)
4347
            ret = valid0;
4348
          /* Win if both arguments have the same relocation.
4349
             Then the value is absolute.  */
4350
          else if (valid0 == valid1 && valid0 != 0)
4351
            ret = null_pointer_node;
4352
          /* Since GCC guarantees that string constants are unique in the
4353
             generated code, a subtraction between two copies of the same
4354
             constant string is absolute.  */
4355
          else if (valid0 && TREE_CODE (valid0) == STRING_CST
4356
                   && valid1 && TREE_CODE (valid1) == STRING_CST
4357
                   && operand_equal_p (valid0, valid1, 1))
4358
            ret = null_pointer_node;
4359
          /* Support narrowing differences.  */
4360
          else
4361
            ret = narrowing_initializer_constant_valid_p (value, endtype,
4362
                                                          ncache);
4363
        }
4364
      else
4365
        /* Support narrowing differences.  */
4366
        ret = narrowing_initializer_constant_valid_p (value, endtype, NULL);
4367
      if (cache)
4368
        {
4369
          cache[0] = value;
4370
          cache[1] = ret;
4371
        }
4372
      return ret;
4373
 
4374
    default:
4375
      break;
4376
    }
4377
 
4378
  return NULL_TREE;
4379
}
4380
 
4381
/* Return nonzero if VALUE is a valid constant-valued expression
4382
   for use in initializing a static variable; one that can be an
4383
   element of a "constant" initializer.
4384
 
4385
   Return null_pointer_node if the value is absolute;
4386
   if it is relocatable, return the variable that determines the relocation.
4387
   We assume that VALUE has been folded as much as possible;
4388
   therefore, we do not need to check for such things as
4389
   arithmetic-combinations of integers.  */
4390
tree
4391
initializer_constant_valid_p (tree value, tree endtype)
4392
{
4393
  return initializer_constant_valid_p_1 (value, endtype, NULL);
4394
}
4395
 
4396
/* Return true if VALUE is a valid constant-valued expression
4397
   for use in initializing a static bit-field; one that can be
4398
   an element of a "constant" initializer.  */
4399
 
4400
bool
4401
initializer_constant_valid_for_bitfield_p (tree value)
4402
{
4403
  /* For bitfields we support integer constants or possibly nested aggregates
4404
     of such.  */
4405
  switch (TREE_CODE (value))
4406
    {
4407
    case CONSTRUCTOR:
4408
      {
4409
        unsigned HOST_WIDE_INT idx;
4410
        tree elt;
4411
 
4412
        FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
4413
          if (!initializer_constant_valid_for_bitfield_p (elt))
4414
            return false;
4415
        return true;
4416
      }
4417
 
4418
    case INTEGER_CST:
4419
      return true;
4420
 
4421
    case VIEW_CONVERT_EXPR:
4422
    case NON_LVALUE_EXPR:
4423
      return
4424
        initializer_constant_valid_for_bitfield_p (TREE_OPERAND (value, 0));
4425
 
4426
    default:
4427
      break;
4428
    }
4429
 
4430
  return false;
4431
}
4432
 
4433
/* output_constructor outer state of relevance in recursive calls, typically
4434
   for nested aggregate bitfields.  */
4435
 
4436
typedef struct {
4437
  unsigned int bit_offset;  /* current position in ...  */
4438
  int byte;                 /* ... the outer byte buffer.  */
4439
} oc_outer_state;
4440
 
4441
static unsigned HOST_WIDE_INT
4442
  output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int,
4443
                      oc_outer_state *);
4444
 
4445
/* Output assembler code for constant EXP to FILE, with no label.
4446
   This includes the pseudo-op such as ".int" or ".byte", and a newline.
4447
   Assumes output_addressed_constants has been done on EXP already.
4448
 
4449
   Generate exactly SIZE bytes of assembler data, padding at the end
4450
   with zeros if necessary.  SIZE must always be specified.
4451
 
4452
   SIZE is important for structure constructors,
4453
   since trailing members may have been omitted from the constructor.
4454
   It is also important for initialization of arrays from string constants
4455
   since the full length of the string constant might not be wanted.
4456
   It is also needed for initialization of unions, where the initializer's
4457
   type is just one member, and that may not be as long as the union.
4458
 
4459
   There a case in which we would fail to output exactly SIZE bytes:
4460
   for a structure constructor that wants to produce more than SIZE bytes.
4461
   But such constructors will never be generated for any possible input.
4462
 
4463
   ALIGN is the alignment of the data in bits.  */
4464
 
4465
void
4466
output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
4467
{
4468
  enum tree_code code;
4469
  unsigned HOST_WIDE_INT thissize;
4470
 
4471
  if (size == 0 || flag_syntax_only)
4472
    return;
4473
 
4474
  /* See if we're trying to initialize a pointer in a non-default mode
4475
     to the address of some declaration somewhere.  If the target says
4476
     the mode is valid for pointers, assume the target has a way of
4477
     resolving it.  */
4478
  if (TREE_CODE (exp) == NOP_EXPR
4479
      && POINTER_TYPE_P (TREE_TYPE (exp))
4480
      && targetm.addr_space.valid_pointer_mode
4481
           (TYPE_MODE (TREE_TYPE (exp)),
4482
            TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)))))
4483
    {
4484
      tree saved_type = TREE_TYPE (exp);
4485
 
4486
      /* Peel off any intermediate conversions-to-pointer for valid
4487
         pointer modes.  */
4488
      while (TREE_CODE (exp) == NOP_EXPR
4489
             && POINTER_TYPE_P (TREE_TYPE (exp))
4490
             && targetm.addr_space.valid_pointer_mode
4491
                  (TYPE_MODE (TREE_TYPE (exp)),
4492
                   TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)))))
4493
        exp = TREE_OPERAND (exp, 0);
4494
 
4495
      /* If what we're left with is the address of something, we can
4496
         convert the address to the final type and output it that
4497
         way.  */
4498
      if (TREE_CODE (exp) == ADDR_EXPR)
4499
        exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
4500
      /* Likewise for constant ints.  */
4501
      else if (TREE_CODE (exp) == INTEGER_CST)
4502
        exp = build_int_cst_wide (saved_type, TREE_INT_CST_LOW (exp),
4503
                                  TREE_INT_CST_HIGH (exp));
4504
 
4505
    }
4506
 
4507
  /* Eliminate any conversions since we'll be outputting the underlying
4508
     constant.  */
4509
  while (CONVERT_EXPR_P (exp)
4510
         || TREE_CODE (exp) == NON_LVALUE_EXPR
4511
         || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
4512
    {
4513
      HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
4514
      HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
4515
 
4516
      /* Make sure eliminating the conversion is really a no-op, except with
4517
         VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
4518
         union types to allow for Ada unchecked unions.  */
4519
      if (type_size > op_size
4520
          && TREE_CODE (exp) != VIEW_CONVERT_EXPR
4521
          && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
4522
        /* Keep the conversion. */
4523
        break;
4524
      else
4525
        exp = TREE_OPERAND (exp, 0);
4526
    }
4527
 
4528
  code = TREE_CODE (TREE_TYPE (exp));
4529
  thissize = int_size_in_bytes (TREE_TYPE (exp));
4530
 
4531
  /* Allow a constructor with no elements for any data type.
4532
     This means to fill the space with zeros.  */
4533
  if (TREE_CODE (exp) == CONSTRUCTOR
4534
      && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp)))
4535
    {
4536
      assemble_zeros (size);
4537
      return;
4538
    }
4539
 
4540
  if (TREE_CODE (exp) == FDESC_EXPR)
4541
    {
4542
#ifdef ASM_OUTPUT_FDESC
4543
      HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
4544
      tree decl = TREE_OPERAND (exp, 0);
4545
      ASM_OUTPUT_FDESC (asm_out_file, decl, part);
4546
#else
4547
      gcc_unreachable ();
4548
#endif
4549
      return;
4550
    }
4551
 
4552
  /* Now output the underlying data.  If we've handling the padding, return.
4553
     Otherwise, break and ensure SIZE is the size written.  */
4554
  switch (code)
4555
    {
4556
    case BOOLEAN_TYPE:
4557
    case INTEGER_TYPE:
4558
    case ENUMERAL_TYPE:
4559
    case POINTER_TYPE:
4560
    case REFERENCE_TYPE:
4561
    case OFFSET_TYPE:
4562
    case FIXED_POINT_TYPE:
4563
      if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
4564
                                           EXPAND_INITIALIZER),
4565
                              MIN (size, thissize), align, 0))
4566
        error ("initializer for integer/fixed-point value is too complicated");
4567
      break;
4568
 
4569
    case REAL_TYPE:
4570
      if (TREE_CODE (exp) != REAL_CST)
4571
        error ("initializer for floating value is not a floating constant");
4572
      else
4573
        assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
4574
      break;
4575
 
4576
    case COMPLEX_TYPE:
4577
      output_constant (TREE_REALPART (exp), thissize / 2, align);
4578
      output_constant (TREE_IMAGPART (exp), thissize / 2,
4579
                       min_align (align, BITS_PER_UNIT * (thissize / 2)));
4580
      break;
4581
 
4582
    case ARRAY_TYPE:
4583
    case VECTOR_TYPE:
4584
      switch (TREE_CODE (exp))
4585
        {
4586
        case CONSTRUCTOR:
4587
            output_constructor (exp, size, align, NULL);
4588
          return;
4589
        case STRING_CST:
4590
          thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
4591
                          size);
4592
          assemble_string (TREE_STRING_POINTER (exp), thissize);
4593
          break;
4594
 
4595
        case VECTOR_CST:
4596
          {
4597
            int elt_size;
4598
            tree link;
4599
            unsigned int nalign;
4600
            enum machine_mode inner;
4601
 
4602
            inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4603
            nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
4604
 
4605
            elt_size = GET_MODE_SIZE (inner);
4606
 
4607
            link = TREE_VECTOR_CST_ELTS (exp);
4608
            output_constant (TREE_VALUE (link), elt_size, align);
4609
            thissize = elt_size;
4610
            while ((link = TREE_CHAIN (link)) != NULL)
4611
              {
4612
                output_constant (TREE_VALUE (link), elt_size, nalign);
4613
                thissize += elt_size;
4614
              }
4615
            break;
4616
          }
4617
        default:
4618
          gcc_unreachable ();
4619
        }
4620
      break;
4621
 
4622
    case RECORD_TYPE:
4623
    case UNION_TYPE:
4624
      gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4625
      output_constructor (exp, size, align, NULL);
4626
      return;
4627
 
4628
    case ERROR_MARK:
4629
      return;
4630
 
4631
    default:
4632
      gcc_unreachable ();
4633
    }
4634
 
4635
  if (size > thissize)
4636
    assemble_zeros (size - thissize);
4637
}
4638
 
4639
 
4640
/* Subroutine of output_constructor, used for computing the size of
4641
   arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
4642
   type with an unspecified upper bound.  */
4643
 
4644
static unsigned HOST_WIDE_INT
4645
array_size_for_constructor (tree val)
4646
{
4647
  tree max_index;
4648
  unsigned HOST_WIDE_INT cnt;
4649
  tree index, value, tmp;
4650
  double_int i;
4651
 
4652
  /* This code used to attempt to handle string constants that are not
4653
     arrays of single-bytes, but nothing else does, so there's no point in
4654
     doing it here.  */
4655
  if (TREE_CODE (val) == STRING_CST)
4656
    return TREE_STRING_LENGTH (val);
4657
 
4658
  max_index = NULL_TREE;
4659
  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
4660
    {
4661
      if (TREE_CODE (index) == RANGE_EXPR)
4662
        index = TREE_OPERAND (index, 1);
4663
      if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4664
        max_index = index;
4665
    }
4666
 
4667
  if (max_index == NULL_TREE)
4668
    return 0;
4669
 
4670
  /* Compute the total number of array elements.  */
4671
  tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)));
4672
  i = double_int_sub (tree_to_double_int (max_index), tree_to_double_int (tmp));
4673
  i = double_int_add (i, double_int_one);
4674
 
4675
  /* Multiply by the array element unit size to find number of bytes.  */
4676
  i = double_int_mul (i, tree_to_double_int
4677
                           (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val)))));
4678
 
4679
  gcc_assert (double_int_fits_in_uhwi_p (i));
4680
  return i.low;
4681
}
4682
 
4683
/* Other datastructures + helpers for output_constructor.  */
4684
 
4685
/* output_constructor local state to support interaction with helpers.  */
4686
 
4687
typedef struct {
4688
 
4689
  /* Received arguments.  */
4690
  tree exp;                     /* Constructor expression.  */
4691
  unsigned HOST_WIDE_INT size;  /* # bytes to output - pad if necessary.  */
4692
  unsigned int align;           /* Known initial alignment.  */
4693
 
4694
  /* Constructor expression data.  */
4695
  tree type;       /* Expression type.  */
4696
  tree field;      /* Current field decl in a record.  */
4697
  tree min_index;  /* Lower bound if specified for an array.  */
4698
 
4699
  /* Output processing state.  */
4700
  HOST_WIDE_INT total_bytes;  /* # bytes output so far / current position.  */
4701
  bool byte_buffer_in_use;    /* Whether byte ...  */
4702
  int byte;                   /* ... contains part of a bitfield byte yet to
4703
                                 be output.  */
4704
 
4705
  int last_relative_index;    /* Implicit or explicit index of the last
4706
                                 array element output within a bitfield.  */
4707
  /* Current element.  */
4708
  tree val;    /* Current element value.  */
4709
  tree index;  /* Current element index.  */
4710
 
4711
} oc_local_state;
4712
 
4713
/* Helper for output_constructor.  From the current LOCAL state, output a
4714
   RANGE_EXPR element.  */
4715
 
4716
static void
4717
output_constructor_array_range (oc_local_state *local)
4718
{
4719
  unsigned HOST_WIDE_INT fieldsize
4720
    = int_size_in_bytes (TREE_TYPE (local->type));
4721
 
4722
  HOST_WIDE_INT lo_index
4723
    = tree_low_cst (TREE_OPERAND (local->index, 0), 0);
4724
  HOST_WIDE_INT hi_index
4725
    = tree_low_cst (TREE_OPERAND (local->index, 1), 0);
4726
  HOST_WIDE_INT index;
4727
 
4728
  unsigned int align2
4729
    = min_align (local->align, fieldsize * BITS_PER_UNIT);
4730
 
4731
  for (index = lo_index; index <= hi_index; index++)
4732
    {
4733
      /* Output the element's initial value.  */
4734
      if (local->val == NULL_TREE)
4735
        assemble_zeros (fieldsize);
4736
      else
4737
        output_constant (local->val, fieldsize, align2);
4738
 
4739
      /* Count its size.  */
4740
      local->total_bytes += fieldsize;
4741
    }
4742
}
4743
 
4744
/* Helper for output_constructor.  From the current LOCAL state, output a
4745
   field element that is not true bitfield or part of an outer one.  */
4746
 
4747
static void
4748
output_constructor_regular_field (oc_local_state *local)
4749
{
4750
  /* Field size and position.  Since this structure is static, we know the
4751
     positions are constant.  */
4752
  unsigned HOST_WIDE_INT fieldsize;
4753
  HOST_WIDE_INT fieldpos;
4754
 
4755
  unsigned int align2;
4756
 
4757
  if (local->index != NULL_TREE)
4758
    {
4759
      double_int idx = double_int_sub (tree_to_double_int (local->index),
4760
                                       tree_to_double_int (local->min_index));
4761
      gcc_assert (double_int_fits_in_shwi_p (idx));
4762
      fieldpos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (local->val)), 1)
4763
                  * idx.low);
4764
    }
4765
  else if (local->field != NULL_TREE)
4766
    fieldpos = int_byte_position (local->field);
4767
  else
4768
    fieldpos = 0;
4769
 
4770
  /* Output any buffered-up bit-fields preceding this element.  */
4771
  if (local->byte_buffer_in_use)
4772
    {
4773
      assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
4774
      local->total_bytes++;
4775
      local->byte_buffer_in_use = false;
4776
    }
4777
 
4778
  /* Advance to offset of this element.
4779
     Note no alignment needed in an array, since that is guaranteed
4780
     if each element has the proper size.  */
4781
  if ((local->field != NULL_TREE || local->index != NULL_TREE)
4782
      && fieldpos != local->total_bytes)
4783
    {
4784
      gcc_assert (fieldpos >= local->total_bytes);
4785
      assemble_zeros (fieldpos - local->total_bytes);
4786
      local->total_bytes = fieldpos;
4787
    }
4788
 
4789
  /* Find the alignment of this element.  */
4790
  align2 = min_align (local->align, BITS_PER_UNIT * fieldpos);
4791
 
4792
  /* Determine size this element should occupy.  */
4793
  if (local->field)
4794
    {
4795
      fieldsize = 0;
4796
 
4797
      /* If this is an array with an unspecified upper bound,
4798
         the initializer determines the size.  */
4799
      /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4800
         but we cannot do this until the deprecated support for
4801
         initializing zero-length array members is removed.  */
4802
      if (TREE_CODE (TREE_TYPE (local->field)) == ARRAY_TYPE
4803
          && TYPE_DOMAIN (TREE_TYPE (local->field))
4804
          && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (local->field))))
4805
        {
4806
          fieldsize = array_size_for_constructor (local->val);
4807
          /* Given a non-empty initialization, this field had
4808
             better be last.  */
4809
          gcc_assert (!fieldsize || !DECL_CHAIN (local->field));
4810
        }
4811
      else
4812
        fieldsize = tree_low_cst (DECL_SIZE_UNIT (local->field), 1);
4813
    }
4814
  else
4815
    fieldsize = int_size_in_bytes (TREE_TYPE (local->type));
4816
 
4817
  /* Output the element's initial value.  */
4818
  if (local->val == NULL_TREE)
4819
    assemble_zeros (fieldsize);
4820
  else
4821
    output_constant (local->val, fieldsize, align2);
4822
 
4823
  /* Count its size.  */
4824
  local->total_bytes += fieldsize;
4825
}
4826
 
4827
/* Helper for output_constructor.  From the current LOCAL and OUTER states,
4828
   output an element that is a true bitfield or part of an outer one.  */
4829
 
4830
static void
4831
output_constructor_bitfield (oc_local_state *local, oc_outer_state *outer)
4832
{
4833
  /* Bit size of this element.  */
4834
  HOST_WIDE_INT ebitsize
4835
    = (local->field
4836
       ? tree_low_cst (DECL_SIZE (local->field), 1)
4837
       : tree_low_cst (TYPE_SIZE (TREE_TYPE (local->type)), 1));
4838
 
4839
  /* Relative index of this element if this is an array component.  */
4840
  HOST_WIDE_INT relative_index
4841
    = (!local->field
4842
       ? (local->index
4843
          ? (tree_low_cst (local->index, 0)
4844
             - tree_low_cst (local->min_index, 0))
4845
          : local->last_relative_index + 1)
4846
       : 0);
4847
 
4848
  /* Bit position of this element from the start of the containing
4849
     constructor.  */
4850
  HOST_WIDE_INT constructor_relative_ebitpos
4851
      = (local->field
4852
         ? int_bit_position (local->field)
4853
         : ebitsize * relative_index);
4854
 
4855
  /* Bit position of this element from the start of a possibly ongoing
4856
     outer byte buffer.  */
4857
  HOST_WIDE_INT byte_relative_ebitpos
4858
      = ((outer ? outer->bit_offset : 0) + constructor_relative_ebitpos);
4859
 
4860
  /* From the start of a possibly ongoing outer byte buffer, offsets to
4861
     the first bit of this element and to the first bit past the end of
4862
     this element.  */
4863
  HOST_WIDE_INT next_offset = byte_relative_ebitpos;
4864
  HOST_WIDE_INT end_offset = byte_relative_ebitpos + ebitsize;
4865
 
4866
  local->last_relative_index = relative_index;
4867
 
4868
  if (local->val == NULL_TREE)
4869
    local->val = integer_zero_node;
4870
 
4871
  while (TREE_CODE (local->val) == VIEW_CONVERT_EXPR
4872
         || TREE_CODE (local->val) == NON_LVALUE_EXPR)
4873
    local->val = TREE_OPERAND (local->val, 0);
4874
 
4875
  if (TREE_CODE (local->val) != INTEGER_CST
4876
      && TREE_CODE (local->val) != CONSTRUCTOR)
4877
    {
4878
      error ("invalid initial value for member %qE", DECL_NAME (local->field));
4879
      return;
4880
    }
4881
 
4882
  /* If this field does not start in this (or, next) byte,
4883
     skip some bytes.  */
4884
  if (next_offset / BITS_PER_UNIT != local->total_bytes)
4885
    {
4886
      /* Output remnant of any bit field in previous bytes.  */
4887
      if (local->byte_buffer_in_use)
4888
        {
4889
          assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
4890
          local->total_bytes++;
4891
          local->byte_buffer_in_use = false;
4892
        }
4893
 
4894
      /* If still not at proper byte, advance to there.  */
4895
      if (next_offset / BITS_PER_UNIT != local->total_bytes)
4896
        {
4897
          gcc_assert (next_offset / BITS_PER_UNIT >= local->total_bytes);
4898
          assemble_zeros (next_offset / BITS_PER_UNIT - local->total_bytes);
4899
          local->total_bytes = next_offset / BITS_PER_UNIT;
4900
        }
4901
    }
4902
 
4903
  /* Set up the buffer if necessary.  */
4904
  if (!local->byte_buffer_in_use)
4905
    {
4906
      local->byte = 0;
4907
      if (ebitsize > 0)
4908
        local->byte_buffer_in_use = true;
4909
    }
4910
 
4911
  /* If this is nested constructor, recurse passing the bit offset and the
4912
     pending data, then retrieve the new pending data afterwards.  */
4913
  if (TREE_CODE (local->val) == CONSTRUCTOR)
4914
    {
4915
      oc_outer_state output_state;
4916
 
4917
      output_state.bit_offset = next_offset % BITS_PER_UNIT;
4918
      output_state.byte = local->byte;
4919
      local->total_bytes
4920
          += output_constructor (local->val, 0, 0, &output_state);
4921
      local->byte = output_state.byte;
4922
      return;
4923
    }
4924
 
4925
  /* Otherwise, we must split the element into pieces that fall within
4926
     separate bytes, and combine each byte with previous or following
4927
     bit-fields.  */
4928
  while (next_offset < end_offset)
4929
    {
4930
      int this_time;
4931
      int shift;
4932
      HOST_WIDE_INT value;
4933
      HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4934
      HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4935
 
4936
      /* Advance from byte to byte
4937
         within this element when necessary.  */
4938
      while (next_byte != local->total_bytes)
4939
        {
4940
          assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
4941
          local->total_bytes++;
4942
          local->byte = 0;
4943
        }
4944
 
4945
      /* Number of bits we can process at once
4946
         (all part of the same byte).  */
4947
      this_time = MIN (end_offset - next_offset,
4948
                       BITS_PER_UNIT - next_bit);
4949
      if (BYTES_BIG_ENDIAN)
4950
        {
4951
          /* On big-endian machine, take the most significant bits
4952
             first (of the bits that are significant)
4953
             and put them into bytes from the most significant end.  */
4954
          shift = end_offset - next_offset - this_time;
4955
 
4956
          /* Don't try to take a bunch of bits that cross
4957
             the word boundary in the INTEGER_CST. We can
4958
             only select bits from the LOW or HIGH part
4959
             not from both.  */
4960
          if (shift < HOST_BITS_PER_WIDE_INT
4961
              && shift + this_time > HOST_BITS_PER_WIDE_INT)
4962
            {
4963
              this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4964
              shift = HOST_BITS_PER_WIDE_INT;
4965
            }
4966
 
4967
          /* Now get the bits from the appropriate constant word.  */
4968
          if (shift < HOST_BITS_PER_WIDE_INT)
4969
            value = TREE_INT_CST_LOW (local->val);
4970
          else
4971
            {
4972
              gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4973
              value = TREE_INT_CST_HIGH (local->val);
4974
              shift -= HOST_BITS_PER_WIDE_INT;
4975
            }
4976
 
4977
          /* Get the result. This works only when:
4978
             1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4979
          local->byte |= (((value >> shift)
4980
                           & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4981
                          << (BITS_PER_UNIT - this_time - next_bit));
4982
        }
4983
      else
4984
        {
4985
          /* On little-endian machines,
4986
             take first the least significant bits of the value
4987
             and pack them starting at the least significant
4988
             bits of the bytes.  */
4989
          shift = next_offset - byte_relative_ebitpos;
4990
 
4991
          /* Don't try to take a bunch of bits that cross
4992
             the word boundary in the INTEGER_CST. We can
4993
             only select bits from the LOW or HIGH part
4994
             not from both.  */
4995
          if (shift < HOST_BITS_PER_WIDE_INT
4996
              && shift + this_time > HOST_BITS_PER_WIDE_INT)
4997
            this_time = (HOST_BITS_PER_WIDE_INT - shift);
4998
 
4999
          /* Now get the bits from the appropriate constant word.  */
5000
          if (shift < HOST_BITS_PER_WIDE_INT)
5001
            value = TREE_INT_CST_LOW (local->val);
5002
          else
5003
            {
5004
              gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
5005
              value = TREE_INT_CST_HIGH (local->val);
5006
              shift -= HOST_BITS_PER_WIDE_INT;
5007
            }
5008
 
5009
          /* Get the result. This works only when:
5010
             1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
5011
          local->byte |= (((value >> shift)
5012
                           & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
5013
                          << next_bit);
5014
        }
5015
 
5016
      next_offset += this_time;
5017
      local->byte_buffer_in_use = true;
5018
    }
5019
}
5020
 
5021
/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
5022
   Generate at least SIZE bytes, padding if necessary.  OUTER designates the
5023
   caller output state of relevance in recursive invocations.  */
5024
 
5025
static unsigned HOST_WIDE_INT
5026
output_constructor (tree exp, unsigned HOST_WIDE_INT size,
5027
                    unsigned int align, oc_outer_state * outer)
5028
{
5029
  unsigned HOST_WIDE_INT cnt;
5030
  constructor_elt *ce;
5031
 
5032
  oc_local_state local;
5033
 
5034
  /* Setup our local state to communicate with helpers.  */
5035
  local.exp = exp;
5036
  local.size = size;
5037
  local.align = align;
5038
 
5039
  local.total_bytes = 0;
5040
  local.byte_buffer_in_use = outer != NULL;
5041
  local.byte = outer ? outer->byte : 0;
5042
 
5043
  local.type = TREE_TYPE (exp);
5044
 
5045
  local.last_relative_index = -1;
5046
 
5047
  local.min_index = NULL_TREE;
5048
  if (TREE_CODE (local.type) == ARRAY_TYPE
5049
      && TYPE_DOMAIN (local.type) != NULL_TREE)
5050
    local.min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (local.type));
5051
 
5052
  gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
5053
 
5054
  /* As CE goes through the elements of the constant, FIELD goes through the
5055
     structure fields if the constant is a structure.  If the constant is a
5056
     union, we override this by getting the field from the TREE_LIST element.
5057
     But the constant could also be an array.  Then FIELD is zero.
5058
 
5059
     There is always a maximum of one element in the chain LINK for unions
5060
     (even if the initializer in a source program incorrectly contains
5061
     more one).  */
5062
 
5063
  local.field = NULL_TREE;
5064
  if (TREE_CODE (local.type) == RECORD_TYPE)
5065
    local.field = TYPE_FIELDS (local.type);
5066
 
5067
  for (cnt = 0;
5068
       VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce);
5069
       cnt++, local.field = local.field ? DECL_CHAIN (local.field) : 0)
5070
    {
5071
      local.val = ce->value;
5072
      local.index = NULL_TREE;
5073
 
5074
      /* The element in a union constructor specifies the proper field
5075
         or index.  */
5076
      if ((TREE_CODE (local.type) == RECORD_TYPE
5077
           || TREE_CODE (local.type) == UNION_TYPE
5078
           || TREE_CODE (local.type) == QUAL_UNION_TYPE)
5079
          && ce->index != NULL_TREE)
5080
        local.field = ce->index;
5081
 
5082
      else if (TREE_CODE (local.type) == ARRAY_TYPE)
5083
        local.index = ce->index;
5084
 
5085
      if (local.field && flag_verbose_asm)
5086
        fprintf (asm_out_file, "%s %s:\n",
5087
                 ASM_COMMENT_START,
5088
                 DECL_NAME (local.field)
5089
                 ? IDENTIFIER_POINTER (DECL_NAME (local.field))
5090
                 : "<anonymous>");
5091
 
5092
      /* Eliminate the marker that makes a cast not be an lvalue.  */
5093
      if (local.val != NULL_TREE)
5094
        STRIP_NOPS (local.val);
5095
 
5096
      /* Output the current element, using the appropriate helper ...  */
5097
 
5098
      /* For an array slice not part of an outer bitfield.  */
5099
      if (!outer
5100
          && local.index != NULL_TREE
5101
          && TREE_CODE (local.index) == RANGE_EXPR)
5102
        output_constructor_array_range (&local);
5103
 
5104
      /* For a field that is neither a true bitfield nor part of an outer one,
5105
         known to be at least byte aligned and multiple-of-bytes long.  */
5106
      else if (!outer
5107
               && (local.field == NULL_TREE
5108
                   || !CONSTRUCTOR_BITFIELD_P (local.field)))
5109
        output_constructor_regular_field (&local);
5110
 
5111
      /* For a true bitfield or part of an outer one.  */
5112
      else
5113
        output_constructor_bitfield (&local, outer);
5114
    }
5115
 
5116
  /* If we are not at toplevel, save the pending data for our caller.
5117
     Otherwise output the pending data and padding zeros as needed. */
5118
  if (outer)
5119
    outer->byte = local.byte;
5120
  else
5121
    {
5122
      if (local.byte_buffer_in_use)
5123
        {
5124
          assemble_integer (GEN_INT (local.byte), 1, BITS_PER_UNIT, 1);
5125
          local.total_bytes++;
5126
        }
5127
 
5128
      if ((unsigned HOST_WIDE_INT)local.total_bytes < local.size)
5129
        {
5130
          assemble_zeros (local.size - local.total_bytes);
5131
          local.total_bytes = local.size;
5132
        }
5133
    }
5134
 
5135
  return local.total_bytes;
5136
}
5137
 
5138
/* Mark DECL as weak.  */
5139
 
5140
static void
5141
mark_weak (tree decl)
5142
{
5143
  DECL_WEAK (decl) = 1;
5144
 
5145
  if (DECL_RTL_SET_P (decl)
5146
      && MEM_P (DECL_RTL (decl))
5147
      && XEXP (DECL_RTL (decl), 0)
5148
      && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
5149
    SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
5150
}
5151
 
5152
/* Merge weak status between NEWDECL and OLDDECL.  */
5153
 
5154
void
5155
merge_weak (tree newdecl, tree olddecl)
5156
{
5157
  if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
5158
    {
5159
      if (DECL_WEAK (newdecl) && TARGET_SUPPORTS_WEAK)
5160
        {
5161
          tree *pwd;
5162
          /* We put the NEWDECL on the weak_decls list at some point
5163
             and OLDDECL as well.  Keep just OLDDECL on the list.  */
5164
          for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
5165
            if (TREE_VALUE (*pwd) == newdecl)
5166
              {
5167
                *pwd = TREE_CHAIN (*pwd);
5168
                break;
5169
              }
5170
        }
5171
      return;
5172
    }
5173
 
5174
  if (DECL_WEAK (newdecl))
5175
    {
5176
      tree wd;
5177
 
5178
      /* NEWDECL is weak, but OLDDECL is not.  */
5179
 
5180
      /* If we already output the OLDDECL, we're in trouble; we can't
5181
         go back and make it weak.  This should never happen in
5182
         unit-at-a-time compilation.  */
5183
      gcc_assert (!TREE_ASM_WRITTEN (olddecl));
5184
 
5185
      /* If we've already generated rtl referencing OLDDECL, we may
5186
         have done so in a way that will not function properly with
5187
         a weak symbol.  Again in unit-at-a-time this should be
5188
         impossible.  */
5189
      gcc_assert (!TREE_USED (olddecl)
5190
                  || !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)));
5191
 
5192
      if (TARGET_SUPPORTS_WEAK)
5193
        {
5194
          /* We put the NEWDECL on the weak_decls list at some point.
5195
             Replace it with the OLDDECL.  */
5196
          for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
5197
            if (TREE_VALUE (wd) == newdecl)
5198
              {
5199
                TREE_VALUE (wd) = olddecl;
5200
                break;
5201
              }
5202
          /* We may not find the entry on the list.  If NEWDECL is a
5203
             weak alias, then we will have already called
5204
             globalize_decl to remove the entry; in that case, we do
5205
             not need to do anything.  */
5206
        }
5207
 
5208
      /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
5209
      mark_weak (olddecl);
5210
    }
5211
  else
5212
    /* OLDDECL was weak, but NEWDECL was not explicitly marked as
5213
       weak.  Just update NEWDECL to indicate that it's weak too.  */
5214
    mark_weak (newdecl);
5215
}
5216
 
5217
/* Declare DECL to be a weak symbol.  */
5218
 
5219
void
5220
declare_weak (tree decl)
5221
{
5222
  gcc_assert (TREE_CODE (decl) != FUNCTION_DECL || !TREE_ASM_WRITTEN (decl));
5223
  if (! TREE_PUBLIC (decl))
5224
    error ("weak declaration of %q+D must be public", decl);
5225
  else if (!TARGET_SUPPORTS_WEAK)
5226
    warning (0, "weak declaration of %q+D not supported", decl);
5227
 
5228
  mark_weak (decl);
5229
  if (!lookup_attribute ("weak", DECL_ATTRIBUTES (decl)))
5230
    DECL_ATTRIBUTES (decl)
5231
      = tree_cons (get_identifier ("weak"), NULL, DECL_ATTRIBUTES (decl));
5232
}
5233
 
5234
static void
5235
weak_finish_1 (tree decl)
5236
{
5237
#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
5238
  const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5239
#endif
5240
 
5241
  if (! TREE_USED (decl))
5242
    return;
5243
 
5244
#ifdef ASM_WEAKEN_DECL
5245
  ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
5246
#else
5247
#ifdef ASM_WEAKEN_LABEL
5248
  ASM_WEAKEN_LABEL (asm_out_file, name);
5249
#else
5250
#ifdef ASM_OUTPUT_WEAK_ALIAS
5251
  {
5252
    static bool warn_once = 0;
5253
    if (! warn_once)
5254
      {
5255
        warning (0, "only weak aliases are supported in this configuration");
5256
        warn_once = 1;
5257
      }
5258
    return;
5259
  }
5260
#endif
5261
#endif
5262
#endif
5263
}
5264
 
5265
/* This TREE_LIST contains weakref targets.  */
5266
 
5267
static GTY(()) tree weakref_targets;
5268
 
5269
/* Forward declaration.  */
5270
static tree find_decl_and_mark_needed (tree decl, tree target);
5271
 
5272
/* Emit any pending weak declarations.  */
5273
 
5274
void
5275
weak_finish (void)
5276
{
5277
  tree t;
5278
 
5279
  for (t = weakref_targets; t; t = TREE_CHAIN (t))
5280
    {
5281
      tree alias_decl = TREE_PURPOSE (t);
5282
      tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
5283
 
5284
      if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
5285
        /* Remove alias_decl from the weak list, but leave entries for
5286
           the target alone.  */
5287
        target = NULL_TREE;
5288
#ifndef ASM_OUTPUT_WEAKREF
5289
      else if (! TREE_SYMBOL_REFERENCED (target))
5290
        {
5291
          /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
5292
             defined, otherwise we and weak_finish_1 would use
5293
             different macros.  */
5294
# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
5295
          ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
5296
# else
5297
          tree decl = find_decl_and_mark_needed (alias_decl, target);
5298
 
5299
          if (! decl)
5300
            {
5301
              decl = build_decl (DECL_SOURCE_LOCATION (alias_decl),
5302
                                 TREE_CODE (alias_decl), target,
5303
                                 TREE_TYPE (alias_decl));
5304
 
5305
              DECL_EXTERNAL (decl) = 1;
5306
              TREE_PUBLIC (decl) = 1;
5307
              DECL_ARTIFICIAL (decl) = 1;
5308
              TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
5309
              TREE_USED (decl) = 1;
5310
            }
5311
 
5312
          weak_finish_1 (decl);
5313
# endif
5314
        }
5315
#endif
5316
 
5317
      {
5318
        tree *p;
5319
        tree t2;
5320
 
5321
        /* Remove the alias and the target from the pending weak list
5322
           so that we do not emit any .weak directives for the former,
5323
           nor multiple .weak directives for the latter.  */
5324
        for (p = &weak_decls; (t2 = *p) ; )
5325
          {
5326
            if (TREE_VALUE (t2) == alias_decl
5327
                || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
5328
              *p = TREE_CHAIN (t2);
5329
            else
5330
              p = &TREE_CHAIN (t2);
5331
          }
5332
 
5333
        /* Remove other weakrefs to the same target, to speed things up.  */
5334
        for (p = &TREE_CHAIN (t); (t2 = *p) ; )
5335
          {
5336
            if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
5337
              *p = TREE_CHAIN (t2);
5338
            else
5339
              p = &TREE_CHAIN (t2);
5340
          }
5341
      }
5342
    }
5343
 
5344
  for (t = weak_decls; t; t = TREE_CHAIN (t))
5345
    {
5346
      tree decl = TREE_VALUE (t);
5347
 
5348
      weak_finish_1 (decl);
5349
    }
5350
}
5351
 
5352
/* Emit the assembly bits to indicate that DECL is globally visible.  */
5353
 
5354
static void
5355
globalize_decl (tree decl)
5356
{
5357
 
5358
#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
5359
  if (DECL_WEAK (decl))
5360
    {
5361
      const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
5362
      tree *p, t;
5363
 
5364
#ifdef ASM_WEAKEN_DECL
5365
      ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
5366
#else
5367
      ASM_WEAKEN_LABEL (asm_out_file, name);
5368
#endif
5369
 
5370
      /* Remove this function from the pending weak list so that
5371
         we do not emit multiple .weak directives for it.  */
5372
      for (p = &weak_decls; (t = *p) ; )
5373
        {
5374
          if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5375
            *p = TREE_CHAIN (t);
5376
          else
5377
            p = &TREE_CHAIN (t);
5378
        }
5379
 
5380
      /* Remove weakrefs to the same target from the pending weakref
5381
         list, for the same reason.  */
5382
      for (p = &weakref_targets; (t = *p) ; )
5383
        {
5384
          if (DECL_ASSEMBLER_NAME (decl)
5385
              == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5386
            *p = TREE_CHAIN (t);
5387
          else
5388
            p = &TREE_CHAIN (t);
5389
        }
5390
 
5391
      return;
5392
    }
5393
#endif
5394
 
5395
  targetm.asm_out.globalize_decl_name (asm_out_file, decl);
5396
}
5397
 
5398
VEC(alias_pair,gc) *alias_pairs;
5399
 
5400
/* Given an assembly name, find the decl it is associated with.  At the
5401
   same time, mark it needed for cgraph.  */
5402
 
5403
static tree
5404
find_decl_and_mark_needed (tree decl, tree target)
5405
{
5406
  struct cgraph_node *fnode = NULL;
5407
  struct varpool_node *vnode = NULL;
5408
 
5409
  if (TREE_CODE (decl) == FUNCTION_DECL)
5410
    {
5411
      fnode = cgraph_node_for_asm (target);
5412
      if (fnode == NULL)
5413
        vnode = varpool_node_for_asm (target);
5414
    }
5415
  else
5416
    {
5417
      vnode = varpool_node_for_asm (target);
5418
      if (vnode == NULL)
5419
        fnode = cgraph_node_for_asm (target);
5420
    }
5421
 
5422
  if (fnode)
5423
    {
5424
      cgraph_mark_needed_node (fnode);
5425
      return fnode->decl;
5426
    }
5427
  else if (vnode)
5428
    {
5429
      varpool_mark_needed_node (vnode);
5430
      vnode->force_output = 1;
5431
      return vnode->decl;
5432
    }
5433
  else
5434
    return NULL_TREE;
5435
}
5436
 
5437
/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
5438
   or ASM_OUTPUT_DEF_FROM_DECLS.  The function defines the symbol whose
5439
   tree node is DECL to have the value of the tree node TARGET.  */
5440
 
5441
static void
5442
do_assemble_alias (tree decl, tree target)
5443
{
5444
  /* Emulated TLS had better not get this var.  */
5445
  gcc_assert(!(!targetm.have_tls
5446
               && TREE_CODE (decl) == VAR_DECL
5447
               && DECL_THREAD_LOCAL_P (decl)));
5448
 
5449
  if (TREE_ASM_WRITTEN (decl))
5450
    return;
5451
 
5452
  /* We must force creation of DECL_RTL for debug info generation, even though
5453
     we don't use it here.  */
5454
  make_decl_rtl (decl);
5455
 
5456
  TREE_ASM_WRITTEN (decl) = 1;
5457
  TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
5458
 
5459
  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5460
    {
5461
      ultimate_transparent_alias_target (&target);
5462
 
5463
      if (!TREE_SYMBOL_REFERENCED (target))
5464
        weakref_targets = tree_cons (decl, target, weakref_targets);
5465
 
5466
#ifdef ASM_OUTPUT_WEAKREF
5467
      ASM_OUTPUT_WEAKREF (asm_out_file, decl,
5468
                          IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5469
                          IDENTIFIER_POINTER (target));
5470
#else
5471
      if (!TARGET_SUPPORTS_WEAK)
5472
        {
5473
          error_at (DECL_SOURCE_LOCATION (decl),
5474
                    "weakref is not supported in this configuration");
5475
          return;
5476
        }
5477
#endif
5478
      return;
5479
    }
5480
 
5481
#ifdef ASM_OUTPUT_DEF
5482
  /* Make name accessible from other files, if appropriate.  */
5483
 
5484
  if (TREE_PUBLIC (decl))
5485
    {
5486
      globalize_decl (decl);
5487
      maybe_assemble_visibility (decl);
5488
    }
5489
  if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
5490
    {
5491
#if defined (ASM_OUTPUT_TYPE_DIRECTIVE) && HAVE_GNU_INDIRECT_FUNCTION
5492
      ASM_OUTPUT_TYPE_DIRECTIVE
5493
        (asm_out_file, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5494
         IFUNC_ASM_TYPE);
5495
#else
5496
      error_at (DECL_SOURCE_LOCATION (decl),
5497
                "ifunc is not supported in this configuration");
5498
#endif
5499
    }
5500
 
5501
# ifdef ASM_OUTPUT_DEF_FROM_DECLS
5502
  ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
5503
# else
5504
  ASM_OUTPUT_DEF (asm_out_file,
5505
                  IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5506
                  IDENTIFIER_POINTER (target));
5507
# endif
5508
#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
5509
  {
5510
    const char *name;
5511
    tree *p, t;
5512
 
5513
    name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5514
# ifdef ASM_WEAKEN_DECL
5515
    ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
5516
# else
5517
    ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
5518
# endif
5519
    /* Remove this function from the pending weak list so that
5520
       we do not emit multiple .weak directives for it.  */
5521
    for (p = &weak_decls; (t = *p) ; )
5522
      if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5523
        *p = TREE_CHAIN (t);
5524
      else
5525
        p = &TREE_CHAIN (t);
5526
 
5527
    /* Remove weakrefs to the same target from the pending weakref
5528
       list, for the same reason.  */
5529
    for (p = &weakref_targets; (t = *p) ; )
5530
      {
5531
        if (DECL_ASSEMBLER_NAME (decl)
5532
            == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5533
          *p = TREE_CHAIN (t);
5534
        else
5535
          p = &TREE_CHAIN (t);
5536
      }
5537
  }
5538
#endif
5539
}
5540
 
5541
 
5542
/* Allocate and construct a symbol alias set.  */
5543
 
5544
static symbol_alias_set_t *
5545
symbol_alias_set_create (void)
5546
{
5547
  return pointer_set_create ();
5548
}
5549
 
5550
/* Destruct and free a symbol alias set.  */
5551
 
5552
void
5553
symbol_alias_set_destroy (symbol_alias_set_t *aset)
5554
{
5555
  pointer_set_destroy (aset);
5556
}
5557
 
5558
/* Test if a symbol alias set contains a given name.  */
5559
 
5560
int
5561
symbol_alias_set_contains (const symbol_alias_set_t *aset, tree t)
5562
{
5563
  /* We accept either a DECL or an IDENTIFIER directly.  */
5564
  if (TREE_CODE (t) != IDENTIFIER_NODE)
5565
    t = DECL_ASSEMBLER_NAME (t);
5566
  t = targetm.asm_out.mangle_assembler_name (IDENTIFIER_POINTER (t));
5567
  return pointer_set_contains (aset, t);
5568
}
5569
 
5570
/* Enter a new name into a symbol alias set.  */
5571
 
5572
static int
5573
symbol_alias_set_insert (symbol_alias_set_t *aset, tree t)
5574
{
5575
  /* We accept either a DECL or an IDENTIFIER directly.  */
5576
  if (TREE_CODE (t) != IDENTIFIER_NODE)
5577
    t = DECL_ASSEMBLER_NAME (t);
5578
  t = targetm.asm_out.mangle_assembler_name (IDENTIFIER_POINTER (t));
5579
  return pointer_set_insert (aset, t);
5580
}
5581
 
5582
/* IN_SET_P is a predicate function assuming to be taken
5583
   alias_pair->decl, alias_pair->target and DATA arguments.
5584
 
5585
   Compute set of aliases by including everything where TRIVIALLY_VISIBLE
5586
   predeicate is true and propagate across aliases such that when
5587
   alias DECL is included, its TARGET is included too.  */
5588
 
5589
static symbol_alias_set_t *
5590
propagate_aliases_forward (bool (*in_set_p)
5591
                             (tree decl, tree target, void *data),
5592
                           void *data)
5593
{
5594
  symbol_alias_set_t *set;
5595
  unsigned i;
5596
  alias_pair *p;
5597
  bool changed;
5598
 
5599
  set = symbol_alias_set_create ();
5600
  for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); ++i)
5601
    if (in_set_p (p->decl, p->target, data))
5602
      symbol_alias_set_insert (set, p->decl);
5603
  do
5604
    {
5605
      changed = false;
5606
      for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); ++i)
5607
        if (symbol_alias_set_contains (set, p->decl)
5608
            && !symbol_alias_set_insert (set, p->target))
5609
          changed = true;
5610
    }
5611
  while (changed);
5612
 
5613
  return set;
5614
}
5615
 
5616
/* Like propagate_aliases_forward but do backward propagation.  */
5617
 
5618
symbol_alias_set_t *
5619
propagate_aliases_backward (bool (*in_set_p)
5620
                             (tree decl, tree target, void *data),
5621
                           void *data)
5622
{
5623
  symbol_alias_set_t *set;
5624
  unsigned i;
5625
  alias_pair *p;
5626
  bool changed;
5627
 
5628
  /* We have to compute the set of set nodes including aliases
5629
     themselves.  */
5630
  set = symbol_alias_set_create ();
5631
  for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); ++i)
5632
    if (in_set_p (p->decl, p->target, data))
5633
      symbol_alias_set_insert (set, p->target);
5634
  do
5635
    {
5636
      changed = false;
5637
      for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); ++i)
5638
        if (symbol_alias_set_contains (set, p->target)
5639
            && !symbol_alias_set_insert (set, p->decl))
5640
          changed = true;
5641
    }
5642
  while (changed);
5643
 
5644
  return set;
5645
}
5646
/* See if the alias is trivially visible.  This means
5647
     1) alias is expoerted from the unit or
5648
     2) alias is used in the code.
5649
   We assume that unused cgraph/varpool nodes has been
5650
   removed.
5651
   Used as callback for propagate_aliases.  */
5652
 
5653
static bool
5654
trivially_visible_alias (tree decl, tree target ATTRIBUTE_UNUSED,
5655
                         void *data ATTRIBUTE_UNUSED)
5656
{
5657
  struct cgraph_node *fnode = NULL;
5658
  struct varpool_node *vnode = NULL;
5659
 
5660
  if (!TREE_PUBLIC (decl))
5661
    {
5662
      if (TREE_CODE (decl) == FUNCTION_DECL)
5663
        fnode = cgraph_get_node (decl);
5664
      else
5665
        vnode = varpool_get_node (decl);
5666
      return vnode || fnode;
5667
    }
5668
  else
5669
    return true;
5670
}
5671
 
5672
/* See if the target of alias is defined in this unit.
5673
   Used as callback for propagate_aliases.  */
5674
 
5675
static bool
5676
trivially_defined_alias (tree decl ATTRIBUTE_UNUSED,
5677
                         tree target,
5678
                         void *data ATTRIBUTE_UNUSED)
5679
{
5680
  struct cgraph_node *fnode = NULL;
5681
  struct varpool_node *vnode = NULL;
5682
 
5683
  fnode = cgraph_node_for_asm (target);
5684
  vnode = (fnode == NULL) ? varpool_node_for_asm (target) : NULL;
5685
  return (fnode && fnode->analyzed) || (vnode && vnode->finalized);
5686
}
5687
 
5688
/* Remove the alias pairing for functions that are no longer in the call
5689
   graph.  */
5690
 
5691
void
5692
remove_unreachable_alias_pairs (void)
5693
{
5694
  symbol_alias_set_t *visible;
5695
  unsigned i;
5696
  alias_pair *p;
5697
 
5698
  if (alias_pairs == NULL)
5699
    return;
5700
 
5701
  /* We have to compute the set of visible nodes including aliases
5702
     themselves.  */
5703
  visible = propagate_aliases_forward (trivially_visible_alias, NULL);
5704
 
5705
  for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); )
5706
    {
5707
      if (!DECL_EXTERNAL (p->decl)
5708
          && !symbol_alias_set_contains (visible, p->decl))
5709
        {
5710
          VEC_unordered_remove (alias_pair, alias_pairs, i);
5711
          continue;
5712
        }
5713
 
5714
      i++;
5715
    }
5716
 
5717
  symbol_alias_set_destroy (visible);
5718
}
5719
 
5720
 
5721
/* First pass of completing pending aliases.  Make sure that cgraph knows
5722
   which symbols will be required.  */
5723
 
5724
void
5725
finish_aliases_1 (void)
5726
{
5727
  symbol_alias_set_t *defined;
5728
  unsigned i;
5729
  alias_pair *p;
5730
 
5731
  if (alias_pairs == NULL)
5732
    return;
5733
 
5734
  /* We have to compute the set of defined nodes including aliases
5735
     themselves.  */
5736
  defined = propagate_aliases_backward (trivially_defined_alias, NULL);
5737
 
5738
  FOR_EACH_VEC_ELT (alias_pair, alias_pairs, i, p)
5739
    {
5740
      tree target_decl;
5741
 
5742
      target_decl = find_decl_and_mark_needed (p->decl, p->target);
5743
      if (target_decl == NULL)
5744
        {
5745
          if (symbol_alias_set_contains (defined, p->target))
5746
            continue;
5747
 
5748
          if (! (p->emitted_diags & ALIAS_DIAG_TO_UNDEF)
5749
              && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
5750
            {
5751
              error ("%q+D aliased to undefined symbol %qE",
5752
                     p->decl, p->target);
5753
              p->emitted_diags |= ALIAS_DIAG_TO_UNDEF;
5754
            }
5755
        }
5756
      else if (! (p->emitted_diags & ALIAS_DIAG_TO_EXTERN)
5757
               && DECL_EXTERNAL (target_decl)
5758
               /* We use local aliases for C++ thunks to force the tailcall
5759
                  to bind locally.  This is a hack - to keep it working do
5760
                  the following (which is not strictly correct).  */
5761
               && (! TREE_CODE (target_decl) == FUNCTION_DECL
5762
                   || ! DECL_VIRTUAL_P (target_decl))
5763
               && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
5764
        {
5765
          error ("%q+D aliased to external symbol %qE",
5766
                 p->decl, p->target);
5767
          p->emitted_diags |= ALIAS_DIAG_TO_EXTERN;
5768
        }
5769
    }
5770
 
5771
  symbol_alias_set_destroy (defined);
5772
}
5773
 
5774
/* Second pass of completing pending aliases.  Emit the actual assembly.
5775
   This happens at the end of compilation and thus it is assured that the
5776
   target symbol has been emitted.  */
5777
 
5778
void
5779
finish_aliases_2 (void)
5780
{
5781
  unsigned i;
5782
  alias_pair *p;
5783
 
5784
  FOR_EACH_VEC_ELT (alias_pair, alias_pairs, i, p)
5785
    do_assemble_alias (p->decl, p->target);
5786
 
5787
  VEC_truncate (alias_pair, alias_pairs, 0);
5788
}
5789
 
5790
/* Emit an assembler directive to make the symbol for DECL an alias to
5791
   the symbol for TARGET.  */
5792
 
5793
void
5794
assemble_alias (tree decl, tree target)
5795
{
5796
  tree target_decl;
5797
 
5798
  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5799
    {
5800
      tree alias = DECL_ASSEMBLER_NAME (decl);
5801
 
5802
      ultimate_transparent_alias_target (&target);
5803
 
5804
      if (alias == target)
5805
        error ("weakref %q+D ultimately targets itself", decl);
5806
      else
5807
        {
5808
#ifndef ASM_OUTPUT_WEAKREF
5809
          IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
5810
          TREE_CHAIN (alias) = target;
5811
#endif
5812
        }
5813
      if (TREE_PUBLIC (decl))
5814
        error ("weakref %q+D must have static linkage", decl);
5815
    }
5816
  else
5817
    {
5818
#if !defined (ASM_OUTPUT_DEF)
5819
# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
5820
      error_at (DECL_SOURCE_LOCATION (decl),
5821
                "alias definitions not supported in this configuration");
5822
      return;
5823
# else
5824
      if (!DECL_WEAK (decl))
5825
        {
5826
          if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
5827
            error_at (DECL_SOURCE_LOCATION (decl),
5828
                      "ifunc is not supported in this configuration");
5829
          else
5830
            error_at (DECL_SOURCE_LOCATION (decl),
5831
                      "only weak aliases are supported in this configuration");
5832
          return;
5833
        }
5834
# endif
5835
#endif
5836
    }
5837
  TREE_USED (decl) = 1;
5838
 
5839
  /* Allow aliases to aliases.  */
5840
  if (TREE_CODE (decl) == FUNCTION_DECL)
5841
    cgraph_get_create_node (decl)->alias = true;
5842
  else
5843
    varpool_node (decl)->alias = true;
5844
 
5845
  /* If the target has already been emitted, we don't have to queue the
5846
     alias.  This saves a tad of memory.  */
5847
  if (cgraph_global_info_ready)
5848
    target_decl = find_decl_and_mark_needed (decl, target);
5849
  else
5850
    target_decl= NULL;
5851
  if (target_decl && TREE_ASM_WRITTEN (target_decl))
5852
    do_assemble_alias (decl, target);
5853
  else
5854
    {
5855
      alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
5856
      p->decl = decl;
5857
      p->target = target;
5858
      p->emitted_diags = ALIAS_DIAG_NONE;
5859
    }
5860
}
5861
 
5862
/* Record and output a table of translations from original function
5863
   to its transaction aware clone.  Note that tm_pure functions are
5864
   considered to be their own clone.  */
5865
 
5866
static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
5867
     htab_t tm_clone_hash;
5868
 
5869
void
5870
record_tm_clone_pair (tree o, tree n)
5871
{
5872
  struct tree_map **slot, *h;
5873
 
5874
  if (tm_clone_hash == NULL)
5875
    tm_clone_hash = htab_create_ggc (32, tree_map_hash, tree_map_eq, 0);
5876
 
5877
  h = ggc_alloc_tree_map ();
5878
  h->hash = htab_hash_pointer (o);
5879
  h->base.from = o;
5880
  h->to = n;
5881
 
5882
  slot = (struct tree_map **)
5883
    htab_find_slot_with_hash (tm_clone_hash, h, h->hash, INSERT);
5884
  *slot = h;
5885
}
5886
 
5887
tree
5888
get_tm_clone_pair (tree o)
5889
{
5890
  if (tm_clone_hash)
5891
    {
5892
      struct tree_map *h, in;
5893
 
5894
      in.base.from = o;
5895
      in.hash = htab_hash_pointer (o);
5896
      h = (struct tree_map *) htab_find_with_hash (tm_clone_hash,
5897
                                                   &in, in.hash);
5898
      if (h)
5899
        return h->to;
5900
    }
5901
  return NULL_TREE;
5902
}
5903
 
5904
typedef struct tm_alias_pair
5905
{
5906
  unsigned int uid;
5907
  tree from;
5908
  tree to;
5909
} tm_alias_pair;
5910
 
5911
DEF_VEC_O(tm_alias_pair);
5912
DEF_VEC_ALLOC_O(tm_alias_pair,heap);
5913
 
5914
/* Helper function for finish_tm_clone_pairs.  Dump a hash table entry
5915
   into a VEC in INFO.  */
5916
 
5917
static int
5918
dump_tm_clone_to_vec (void **slot, void *info)
5919
{
5920
  struct tree_map *map = (struct tree_map *) *slot;
5921
  VEC(tm_alias_pair,heap) **tm_alias_pairs
5922
    = (VEC(tm_alias_pair, heap) **) info;
5923
  tm_alias_pair *p;
5924
 
5925
  p = VEC_safe_push (tm_alias_pair, heap, *tm_alias_pairs, NULL);
5926
  p->from = map->base.from;
5927
  p->to = map->to;
5928
  p->uid = DECL_UID (p->from);
5929
  return 1;
5930
}
5931
 
5932
/* Dump the actual pairs to the .tm_clone_table section.  */
5933
 
5934
static void
5935
dump_tm_clone_pairs (VEC(tm_alias_pair,heap) *tm_alias_pairs)
5936
{
5937
  unsigned i;
5938
  tm_alias_pair *p;
5939
  bool switched = false;
5940
 
5941
  FOR_EACH_VEC_ELT (tm_alias_pair, tm_alias_pairs, i, p)
5942
    {
5943
      tree src = p->from;
5944
      tree dst = p->to;
5945
      struct cgraph_node *src_n = cgraph_get_node (src);
5946
      struct cgraph_node *dst_n = cgraph_get_node (dst);
5947
 
5948
      /* The function ipa_tm_create_version() marks the clone as needed if
5949
         the original function was needed.  But we also mark the clone as
5950
         needed if we ever called the clone indirectly through
5951
         TM_GETTMCLONE.  If neither of these are true, we didn't generate
5952
         a clone, and we didn't call it indirectly... no sense keeping it
5953
         in the clone table.  */
5954
      if (!dst_n || !dst_n->needed)
5955
        continue;
5956
 
5957
      /* This covers the case where we have optimized the original
5958
         function away, and only access the transactional clone.  */
5959
      if (!src_n || !src_n->needed)
5960
        continue;
5961
 
5962
      if (!switched)
5963
        {
5964
          switch_to_section (targetm.asm_out.tm_clone_table_section ());
5965
          assemble_align (POINTER_SIZE);
5966
          switched = true;
5967
        }
5968
 
5969
      assemble_integer (XEXP (DECL_RTL (src), 0),
5970
                        POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
5971
      assemble_integer (XEXP (DECL_RTL (dst), 0),
5972
                        POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
5973
    }
5974
}
5975
 
5976
/* Provide a default for the tm_clone_table section.  */
5977
 
5978
section *
5979
default_clone_table_section (void)
5980
{
5981
  return get_named_section (NULL, ".tm_clone_table", 3);
5982
}
5983
 
5984
/* Helper comparison function for qsorting by the DECL_UID stored in
5985
   alias_pair->emitted_diags.  */
5986
 
5987
static int
5988
tm_alias_pair_cmp (const void *x, const void *y)
5989
{
5990
  const tm_alias_pair *p1 = (const tm_alias_pair *) x;
5991
  const tm_alias_pair *p2 = (const tm_alias_pair *) y;
5992
  if (p1->uid < p2->uid)
5993
    return -1;
5994
  if (p1->uid > p2->uid)
5995
    return 1;
5996
  return 0;
5997
}
5998
 
5999
void
6000
finish_tm_clone_pairs (void)
6001
{
6002
  VEC(tm_alias_pair,heap) *tm_alias_pairs = NULL;
6003
 
6004
  if (tm_clone_hash == NULL)
6005
    return;
6006
 
6007
  /* We need a determenistic order for the .tm_clone_table, otherwise
6008
     we will get bootstrap comparison failures, so dump the hash table
6009
     to a vector, sort it, and dump the vector.  */
6010
 
6011
  /* Dump the hashtable to a vector.  */
6012
  htab_traverse_noresize (tm_clone_hash, dump_tm_clone_to_vec,
6013
                          (void *) &tm_alias_pairs);
6014
  /* Sort it.  */
6015
  VEC_qsort (tm_alias_pair, tm_alias_pairs, tm_alias_pair_cmp);
6016
 
6017
  /* Dump it.  */
6018
  dump_tm_clone_pairs (tm_alias_pairs);
6019
 
6020
  htab_delete (tm_clone_hash);
6021
  tm_clone_hash = NULL;
6022
  VEC_free (tm_alias_pair, heap, tm_alias_pairs);
6023
}
6024
 
6025
 
6026
/* Emit an assembler directive to set symbol for DECL visibility to
6027
   the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
6028
 
6029
void
6030
default_assemble_visibility (tree decl ATTRIBUTE_UNUSED,
6031
                             int vis ATTRIBUTE_UNUSED)
6032
{
6033
#ifdef HAVE_GAS_HIDDEN
6034
  static const char * const visibility_types[] = {
6035
    NULL, "protected", "hidden", "internal"
6036
  };
6037
 
6038
  const char *name, *type;
6039
 
6040
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
6041
  type = visibility_types[vis];
6042
 
6043
  fprintf (asm_out_file, "\t.%s\t", type);
6044
  assemble_name (asm_out_file, name);
6045
  fprintf (asm_out_file, "\n");
6046
#else
6047
  warning (OPT_Wattributes, "visibility attribute not supported "
6048
           "in this configuration; ignored");
6049
#endif
6050
}
6051
 
6052
/* A helper function to call assemble_visibility when needed for a decl.  */
6053
 
6054
int
6055
maybe_assemble_visibility (tree decl)
6056
{
6057
  enum symbol_visibility vis = DECL_VISIBILITY (decl);
6058
 
6059
  if (vis != VISIBILITY_DEFAULT)
6060
    {
6061
      targetm.asm_out.assemble_visibility (decl, vis);
6062
      return 1;
6063
    }
6064
  else
6065
    return 0;
6066
}
6067
 
6068
/* Returns 1 if the target configuration supports defining public symbols
6069
   so that one of them will be chosen at link time instead of generating a
6070
   multiply-defined symbol error, whether through the use of weak symbols or
6071
   a target-specific mechanism for having duplicates discarded.  */
6072
 
6073
int
6074
supports_one_only (void)
6075
{
6076
  if (SUPPORTS_ONE_ONLY)
6077
    return 1;
6078
  return TARGET_SUPPORTS_WEAK;
6079
}
6080
 
6081
/* Set up DECL as a public symbol that can be defined in multiple
6082
   translation units without generating a linker error.  */
6083
 
6084
void
6085
make_decl_one_only (tree decl, tree comdat_group)
6086
{
6087
  gcc_assert (TREE_CODE (decl) == VAR_DECL
6088
              || TREE_CODE (decl) == FUNCTION_DECL);
6089
 
6090
  TREE_PUBLIC (decl) = 1;
6091
 
6092
  if (SUPPORTS_ONE_ONLY)
6093
    {
6094
#ifdef MAKE_DECL_ONE_ONLY
6095
      MAKE_DECL_ONE_ONLY (decl);
6096
#endif
6097
      DECL_COMDAT_GROUP (decl) = comdat_group;
6098
    }
6099
  else if (TREE_CODE (decl) == VAR_DECL
6100
      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
6101
    DECL_COMMON (decl) = 1;
6102
  else
6103
    {
6104
      gcc_assert (TARGET_SUPPORTS_WEAK);
6105
      DECL_WEAK (decl) = 1;
6106
    }
6107
}
6108
 
6109
void
6110
init_varasm_once (void)
6111
{
6112
  section_htab = htab_create_ggc (31, section_entry_hash,
6113
                                  section_entry_eq, NULL);
6114
  object_block_htab = htab_create_ggc (31, object_block_entry_hash,
6115
                                       object_block_entry_eq, NULL);
6116
  const_desc_htab = htab_create_ggc (1009, const_desc_hash,
6117
                                     const_desc_eq, NULL);
6118
 
6119
  const_alias_set = new_alias_set ();
6120
  shared_constant_pool = create_constant_pool ();
6121
 
6122
#ifdef TEXT_SECTION_ASM_OP
6123
  text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op,
6124
                                      TEXT_SECTION_ASM_OP);
6125
#endif
6126
 
6127
#ifdef DATA_SECTION_ASM_OP
6128
  data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
6129
                                      DATA_SECTION_ASM_OP);
6130
#endif
6131
 
6132
#ifdef SDATA_SECTION_ASM_OP
6133
  sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
6134
                                       SDATA_SECTION_ASM_OP);
6135
#endif
6136
 
6137
#ifdef READONLY_DATA_SECTION_ASM_OP
6138
  readonly_data_section = get_unnamed_section (0, output_section_asm_op,
6139
                                               READONLY_DATA_SECTION_ASM_OP);
6140
#endif
6141
 
6142
#ifdef CTORS_SECTION_ASM_OP
6143
  ctors_section = get_unnamed_section (0, output_section_asm_op,
6144
                                       CTORS_SECTION_ASM_OP);
6145
#endif
6146
 
6147
#ifdef DTORS_SECTION_ASM_OP
6148
  dtors_section = get_unnamed_section (0, output_section_asm_op,
6149
                                       DTORS_SECTION_ASM_OP);
6150
#endif
6151
 
6152
#ifdef BSS_SECTION_ASM_OP
6153
  bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
6154
                                     output_section_asm_op,
6155
                                     BSS_SECTION_ASM_OP);
6156
#endif
6157
 
6158
#ifdef SBSS_SECTION_ASM_OP
6159
  sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
6160
                                      output_section_asm_op,
6161
                                      SBSS_SECTION_ASM_OP);
6162
#endif
6163
 
6164
  tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6165
                                           | SECTION_COMMON, emit_tls_common);
6166
  lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6167
                                        | SECTION_COMMON, emit_local);
6168
  comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6169
                                       | SECTION_COMMON, emit_common);
6170
 
6171
#if defined ASM_OUTPUT_ALIGNED_BSS
6172
  bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS,
6173
                                               emit_bss);
6174
#endif
6175
 
6176
  targetm.asm_out.init_sections ();
6177
 
6178
  if (readonly_data_section == NULL)
6179
    readonly_data_section = text_section;
6180
}
6181
 
6182
enum tls_model
6183
decl_default_tls_model (const_tree decl)
6184
{
6185
  enum tls_model kind;
6186
  bool is_local;
6187
 
6188
  is_local = targetm.binds_local_p (decl);
6189
  if (!flag_shlib)
6190
    {
6191
      if (is_local)
6192
        kind = TLS_MODEL_LOCAL_EXEC;
6193
      else
6194
        kind = TLS_MODEL_INITIAL_EXEC;
6195
    }
6196
 
6197
  /* Local dynamic is inefficient when we're not combining the
6198
     parts of the address.  */
6199
  else if (optimize && is_local)
6200
    kind = TLS_MODEL_LOCAL_DYNAMIC;
6201
  else
6202
    kind = TLS_MODEL_GLOBAL_DYNAMIC;
6203
  if (kind < flag_tls_default)
6204
    kind = flag_tls_default;
6205
 
6206
  return kind;
6207
}
6208
 
6209
/* Select a set of attributes for section NAME based on the properties
6210
   of DECL and whether or not RELOC indicates that DECL's initializer
6211
   might contain runtime relocations.
6212
 
6213
   We make the section read-only and executable for a function decl,
6214
   read-only for a const data decl, and writable for a non-const data decl.  */
6215
 
6216
unsigned int
6217
default_section_type_flags (tree decl, const char *name, int reloc)
6218
{
6219
  unsigned int flags;
6220
 
6221
  if (decl && TREE_CODE (decl) == FUNCTION_DECL)
6222
    flags = SECTION_CODE;
6223
  else if (decl)
6224
    {
6225
      enum section_category category
6226
        = categorize_decl_for_section (decl, reloc);
6227
      if (decl_readonly_section_1 (category))
6228
        flags = 0;
6229
      else if (category == SECCAT_DATA_REL_RO
6230
               || category == SECCAT_DATA_REL_RO_LOCAL)
6231
        flags = SECTION_WRITE | SECTION_RELRO;
6232
      else
6233
        flags = SECTION_WRITE;
6234
    }
6235
  else
6236
    {
6237
      flags = SECTION_WRITE;
6238
      if (strcmp (name, ".data.rel.ro") == 0
6239
          || strcmp (name, ".data.rel.ro.local") == 0)
6240
        flags |= SECTION_RELRO;
6241
    }
6242
 
6243
  if (decl && DECL_ONE_ONLY (decl))
6244
    flags |= SECTION_LINKONCE;
6245
 
6246
  if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
6247
    flags |= SECTION_TLS | SECTION_WRITE;
6248
 
6249
  if (strcmp (name, ".bss") == 0
6250
      || strncmp (name, ".bss.", 5) == 0
6251
      || strncmp (name, ".gnu.linkonce.b.", 16) == 0
6252
      || strcmp (name, ".sbss") == 0
6253
      || strncmp (name, ".sbss.", 6) == 0
6254
      || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
6255
    flags |= SECTION_BSS;
6256
 
6257
  if (strcmp (name, ".tdata") == 0
6258
      || strncmp (name, ".tdata.", 7) == 0
6259
      || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
6260
    flags |= SECTION_TLS;
6261
 
6262
  if (strcmp (name, ".tbss") == 0
6263
      || strncmp (name, ".tbss.", 6) == 0
6264
      || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
6265
    flags |= SECTION_TLS | SECTION_BSS;
6266
 
6267
  /* These three sections have special ELF types.  They are neither
6268
     SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
6269
     want to print a section type (@progbits or @nobits).  If someone
6270
     is silly enough to emit code or TLS variables to one of these
6271
     sections, then don't handle them specially.  */
6272
  if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
6273
      && (strcmp (name, ".init_array") == 0
6274
          || strcmp (name, ".fini_array") == 0
6275
          || strcmp (name, ".preinit_array") == 0))
6276
    flags |= SECTION_NOTYPE;
6277
 
6278
  return flags;
6279
}
6280
 
6281
/* Return true if the target supports some form of global BSS,
6282
   either through bss_noswitch_section, or by selecting a BSS
6283
   section in TARGET_ASM_SELECT_SECTION.  */
6284
 
6285
bool
6286
have_global_bss_p (void)
6287
{
6288
  return bss_noswitch_section || targetm.have_switchable_bss_sections;
6289
}
6290
 
6291
/* Output assembly to switch to section NAME with attribute FLAGS.
6292
   Four variants for common object file formats.  */
6293
 
6294
void
6295
default_no_named_section (const char *name ATTRIBUTE_UNUSED,
6296
                          unsigned int flags ATTRIBUTE_UNUSED,
6297
                          tree decl ATTRIBUTE_UNUSED)
6298
{
6299
  /* Some object formats don't support named sections at all.  The
6300
     front-end should already have flagged this as an error.  */
6301
  gcc_unreachable ();
6302
}
6303
 
6304
#ifndef TLS_SECTION_ASM_FLAG
6305
#define TLS_SECTION_ASM_FLAG 'T'
6306
#endif
6307
 
6308
void
6309
default_elf_asm_named_section (const char *name, unsigned int flags,
6310
                               tree decl ATTRIBUTE_UNUSED)
6311
{
6312
  char flagchars[10], *f = flagchars;
6313
 
6314
  /* If we have already declared this section, we can use an
6315
     abbreviated form to switch back to it -- unless this section is
6316
     part of a COMDAT groups, in which case GAS requires the full
6317
     declaration every time.  */
6318
  if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6319
      && (flags & SECTION_DECLARED))
6320
    {
6321
      fprintf (asm_out_file, "\t.section\t%s\n", name);
6322
      return;
6323
    }
6324
 
6325
  if (!(flags & SECTION_DEBUG))
6326
    *f++ = 'a';
6327
  if (flags & SECTION_EXCLUDE)
6328
    *f++ = 'e';
6329
  if (flags & SECTION_WRITE)
6330
    *f++ = 'w';
6331
  if (flags & SECTION_CODE)
6332
    *f++ = 'x';
6333
  if (flags & SECTION_SMALL)
6334
    *f++ = 's';
6335
  if (flags & SECTION_MERGE)
6336
    *f++ = 'M';
6337
  if (flags & SECTION_STRINGS)
6338
    *f++ = 'S';
6339
  if (flags & SECTION_TLS)
6340
    *f++ = TLS_SECTION_ASM_FLAG;
6341
  if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6342
    *f++ = 'G';
6343
  *f = '\0';
6344
 
6345
  fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
6346
 
6347
  if (!(flags & SECTION_NOTYPE))
6348
    {
6349
      const char *type;
6350
      const char *format;
6351
 
6352
      if (flags & SECTION_BSS)
6353
        type = "nobits";
6354
      else
6355
        type = "progbits";
6356
 
6357
      format = ",@%s";
6358
      /* On platforms that use "@" as the assembly comment character,
6359
         use "%" instead.  */
6360
      if (strcmp (ASM_COMMENT_START, "@") == 0)
6361
        format = ",%%%s";
6362
      fprintf (asm_out_file, format, type);
6363
 
6364
      if (flags & SECTION_ENTSIZE)
6365
        fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
6366
      if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6367
        {
6368
          if (TREE_CODE (decl) == IDENTIFIER_NODE)
6369
            fprintf (asm_out_file, ",%s,comdat", IDENTIFIER_POINTER (decl));
6370
          else
6371
            fprintf (asm_out_file, ",%s,comdat",
6372
                     IDENTIFIER_POINTER (DECL_COMDAT_GROUP (decl)));
6373
        }
6374
    }
6375
 
6376
  putc ('\n', asm_out_file);
6377
}
6378
 
6379
void
6380
default_coff_asm_named_section (const char *name, unsigned int flags,
6381
                                tree decl ATTRIBUTE_UNUSED)
6382
{
6383
  char flagchars[8], *f = flagchars;
6384
 
6385
  if (flags & SECTION_WRITE)
6386
    *f++ = 'w';
6387
  if (flags & SECTION_CODE)
6388
    *f++ = 'x';
6389
  *f = '\0';
6390
 
6391
  fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
6392
}
6393
 
6394
void
6395
default_pe_asm_named_section (const char *name, unsigned int flags,
6396
                              tree decl)
6397
{
6398
  default_coff_asm_named_section (name, flags, decl);
6399
 
6400
  if (flags & SECTION_LINKONCE)
6401
    {
6402
      /* Functions may have been compiled at various levels of
6403
         optimization so we can't use `same_size' here.
6404
         Instead, have the linker pick one.  */
6405
      fprintf (asm_out_file, "\t.linkonce %s\n",
6406
               (flags & SECTION_CODE ? "discard" : "same_size"));
6407
    }
6408
}
6409
 
6410
/* The lame default section selector.  */
6411
 
6412
section *
6413
default_select_section (tree decl, int reloc,
6414
                        unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
6415
{
6416
  if (DECL_P (decl))
6417
    {
6418
      if (decl_readonly_section (decl, reloc))
6419
        return readonly_data_section;
6420
    }
6421
  else if (TREE_CODE (decl) == CONSTRUCTOR)
6422
    {
6423
      if (! ((flag_pic && reloc)
6424
             || !TREE_READONLY (decl)
6425
             || TREE_SIDE_EFFECTS (decl)
6426
             || !TREE_CONSTANT (decl)))
6427
        return readonly_data_section;
6428
    }
6429
  else if (TREE_CODE (decl) == STRING_CST)
6430
    return readonly_data_section;
6431
  else if (! (flag_pic && reloc))
6432
    return readonly_data_section;
6433
 
6434
  return data_section;
6435
}
6436
 
6437
enum section_category
6438
categorize_decl_for_section (const_tree decl, int reloc)
6439
{
6440
  enum section_category ret;
6441
 
6442
  if (TREE_CODE (decl) == FUNCTION_DECL)
6443
    return SECCAT_TEXT;
6444
  else if (TREE_CODE (decl) == STRING_CST)
6445
    {
6446
      if (flag_mudflap) /* or !flag_merge_constants */
6447
        return SECCAT_RODATA;
6448
      else
6449
        return SECCAT_RODATA_MERGE_STR;
6450
    }
6451
  else if (TREE_CODE (decl) == VAR_DECL)
6452
    {
6453
      if (bss_initializer_p (decl))
6454
        ret = SECCAT_BSS;
6455
      else if (! TREE_READONLY (decl)
6456
               || TREE_SIDE_EFFECTS (decl)
6457
               || ! TREE_CONSTANT (DECL_INITIAL (decl)))
6458
        {
6459
          /* Here the reloc_rw_mask is not testing whether the section should
6460
             be read-only or not, but whether the dynamic link will have to
6461
             do something.  If so, we wish to segregate the data in order to
6462
             minimize cache misses inside the dynamic linker.  */
6463
          if (reloc & targetm.asm_out.reloc_rw_mask ())
6464
            ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL;
6465
          else
6466
            ret = SECCAT_DATA;
6467
        }
6468
      else if (reloc & targetm.asm_out.reloc_rw_mask ())
6469
        ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO;
6470
      else if (reloc || flag_merge_constants < 2)
6471
        /* C and C++ don't allow different variables to share the same
6472
           location.  -fmerge-all-constants allows even that (at the
6473
           expense of not conforming).  */
6474
        ret = SECCAT_RODATA;
6475
      else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
6476
        ret = SECCAT_RODATA_MERGE_STR_INIT;
6477
      else
6478
        ret = SECCAT_RODATA_MERGE_CONST;
6479
    }
6480
  else if (TREE_CODE (decl) == CONSTRUCTOR)
6481
    {
6482
      if ((reloc & targetm.asm_out.reloc_rw_mask ())
6483
          || TREE_SIDE_EFFECTS (decl)
6484
          || ! TREE_CONSTANT (decl))
6485
        ret = SECCAT_DATA;
6486
      else
6487
        ret = SECCAT_RODATA;
6488
    }
6489
  else
6490
    ret = SECCAT_RODATA;
6491
 
6492
  /* There are no read-only thread-local sections.  */
6493
  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
6494
    {
6495
      /* Note that this would be *just* SECCAT_BSS, except that there's
6496
         no concept of a read-only thread-local-data section.  */
6497
      if (ret == SECCAT_BSS
6498
               || (flag_zero_initialized_in_bss
6499
                   && initializer_zerop (DECL_INITIAL (decl))))
6500
        ret = SECCAT_TBSS;
6501
      else
6502
        ret = SECCAT_TDATA;
6503
    }
6504
 
6505
  /* If the target uses small data sections, select it.  */
6506
  else if (targetm.in_small_data_p (decl))
6507
    {
6508
      if (ret == SECCAT_BSS)
6509
        ret = SECCAT_SBSS;
6510
      else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
6511
        ret = SECCAT_SRODATA;
6512
      else
6513
        ret = SECCAT_SDATA;
6514
    }
6515
 
6516
  return ret;
6517
}
6518
 
6519
static bool
6520
decl_readonly_section_1 (enum section_category category)
6521
{
6522
  switch (category)
6523
    {
6524
    case SECCAT_RODATA:
6525
    case SECCAT_RODATA_MERGE_STR:
6526
    case SECCAT_RODATA_MERGE_STR_INIT:
6527
    case SECCAT_RODATA_MERGE_CONST:
6528
    case SECCAT_SRODATA:
6529
      return true;
6530
    default:
6531
      return false;
6532
    }
6533
}
6534
 
6535
bool
6536
decl_readonly_section (const_tree decl, int reloc)
6537
{
6538
  return decl_readonly_section_1 (categorize_decl_for_section (decl, reloc));
6539
}
6540
 
6541
/* Select a section based on the above categorization.  */
6542
 
6543
section *
6544
default_elf_select_section (tree decl, int reloc,
6545
                            unsigned HOST_WIDE_INT align)
6546
{
6547
  const char *sname;
6548
  switch (categorize_decl_for_section (decl, reloc))
6549
    {
6550
    case SECCAT_TEXT:
6551
      /* We're not supposed to be called on FUNCTION_DECLs.  */
6552
      gcc_unreachable ();
6553
    case SECCAT_RODATA:
6554
      return readonly_data_section;
6555
    case SECCAT_RODATA_MERGE_STR:
6556
      return mergeable_string_section (decl, align, 0);
6557
    case SECCAT_RODATA_MERGE_STR_INIT:
6558
      return mergeable_string_section (DECL_INITIAL (decl), align, 0);
6559
    case SECCAT_RODATA_MERGE_CONST:
6560
      return mergeable_constant_section (DECL_MODE (decl), align, 0);
6561
    case SECCAT_SRODATA:
6562
      sname = ".sdata2";
6563
      break;
6564
    case SECCAT_DATA:
6565
      return data_section;
6566
    case SECCAT_DATA_REL:
6567
      sname = ".data.rel";
6568
      break;
6569
    case SECCAT_DATA_REL_LOCAL:
6570
      sname = ".data.rel.local";
6571
      break;
6572
    case SECCAT_DATA_REL_RO:
6573
      sname = ".data.rel.ro";
6574
      break;
6575
    case SECCAT_DATA_REL_RO_LOCAL:
6576
      sname = ".data.rel.ro.local";
6577
      break;
6578
    case SECCAT_SDATA:
6579
      sname = ".sdata";
6580
      break;
6581
    case SECCAT_TDATA:
6582
      sname = ".tdata";
6583
      break;
6584
    case SECCAT_BSS:
6585
      if (bss_section)
6586
        return bss_section;
6587
      sname = ".bss";
6588
      break;
6589
    case SECCAT_SBSS:
6590
      sname = ".sbss";
6591
      break;
6592
    case SECCAT_TBSS:
6593
      sname = ".tbss";
6594
      break;
6595
    default:
6596
      gcc_unreachable ();
6597
    }
6598
 
6599
  if (!DECL_P (decl))
6600
    decl = NULL_TREE;
6601
  return get_named_section (decl, sname, reloc);
6602
}
6603
 
6604
/* Construct a unique section name based on the decl name and the
6605
   categorization performed above.  */
6606
 
6607
void
6608
default_unique_section (tree decl, int reloc)
6609
{
6610
  /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
6611
  bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
6612
  const char *prefix, *name, *linkonce;
6613
  char *string;
6614
 
6615
  switch (categorize_decl_for_section (decl, reloc))
6616
    {
6617
    case SECCAT_TEXT:
6618
      prefix = one_only ? ".t" : ".text";
6619
      break;
6620
    case SECCAT_RODATA:
6621
    case SECCAT_RODATA_MERGE_STR:
6622
    case SECCAT_RODATA_MERGE_STR_INIT:
6623
    case SECCAT_RODATA_MERGE_CONST:
6624
      prefix = one_only ? ".r" : ".rodata";
6625
      break;
6626
    case SECCAT_SRODATA:
6627
      prefix = one_only ? ".s2" : ".sdata2";
6628
      break;
6629
    case SECCAT_DATA:
6630
      prefix = one_only ? ".d" : ".data";
6631
      break;
6632
    case SECCAT_DATA_REL:
6633
      prefix = one_only ? ".d.rel" : ".data.rel";
6634
      break;
6635
    case SECCAT_DATA_REL_LOCAL:
6636
      prefix = one_only ? ".d.rel.local" : ".data.rel.local";
6637
      break;
6638
    case SECCAT_DATA_REL_RO:
6639
      prefix = one_only ? ".d.rel.ro" : ".data.rel.ro";
6640
      break;
6641
    case SECCAT_DATA_REL_RO_LOCAL:
6642
      prefix = one_only ? ".d.rel.ro.local" : ".data.rel.ro.local";
6643
      break;
6644
    case SECCAT_SDATA:
6645
      prefix = one_only ? ".s" : ".sdata";
6646
      break;
6647
    case SECCAT_BSS:
6648
      prefix = one_only ? ".b" : ".bss";
6649
      break;
6650
    case SECCAT_SBSS:
6651
      prefix = one_only ? ".sb" : ".sbss";
6652
      break;
6653
    case SECCAT_TDATA:
6654
      prefix = one_only ? ".td" : ".tdata";
6655
      break;
6656
    case SECCAT_TBSS:
6657
      prefix = one_only ? ".tb" : ".tbss";
6658
      break;
6659
    default:
6660
      gcc_unreachable ();
6661
    }
6662
 
6663
  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
6664
  name = targetm.strip_name_encoding (name);
6665
 
6666
  /* If we're using one_only, then there needs to be a .gnu.linkonce
6667
     prefix to the section name.  */
6668
  linkonce = one_only ? ".gnu.linkonce" : "";
6669
 
6670
  string = ACONCAT ((linkonce, prefix, ".", name, NULL));
6671
 
6672
  DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
6673
}
6674
 
6675
/* Like compute_reloc_for_constant, except for an RTX.  The return value
6676
   is a mask for which bit 1 indicates a global relocation, and bit 0
6677
   indicates a local relocation.  */
6678
 
6679
static int
6680
compute_reloc_for_rtx_1 (rtx *xp, void *data)
6681
{
6682
  int *preloc = (int *) data;
6683
  rtx x = *xp;
6684
 
6685
  switch (GET_CODE (x))
6686
    {
6687
    case SYMBOL_REF:
6688
      *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
6689
      break;
6690
    case LABEL_REF:
6691
      *preloc |= 1;
6692
      break;
6693
    default:
6694
      break;
6695
    }
6696
 
6697
  return 0;
6698
}
6699
 
6700
static int
6701
compute_reloc_for_rtx (rtx x)
6702
{
6703
  int reloc;
6704
 
6705
  switch (GET_CODE (x))
6706
    {
6707
    case CONST:
6708
    case SYMBOL_REF:
6709
    case LABEL_REF:
6710
      reloc = 0;
6711
      for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc);
6712
      return reloc;
6713
 
6714
    default:
6715
      return 0;
6716
    }
6717
}
6718
 
6719
section *
6720
default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
6721
                            rtx x,
6722
                            unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
6723
{
6724
  if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ())
6725
    return data_section;
6726
  else
6727
    return readonly_data_section;
6728
}
6729
 
6730
section *
6731
default_elf_select_rtx_section (enum machine_mode mode, rtx x,
6732
                                unsigned HOST_WIDE_INT align)
6733
{
6734
  int reloc = compute_reloc_for_rtx (x);
6735
 
6736
  /* ??? Handle small data here somehow.  */
6737
 
6738
  if (reloc & targetm.asm_out.reloc_rw_mask ())
6739
    {
6740
      if (reloc == 1)
6741
        return get_named_section (NULL, ".data.rel.ro.local", 1);
6742
      else
6743
        return get_named_section (NULL, ".data.rel.ro", 3);
6744
    }
6745
 
6746
  return mergeable_constant_section (mode, align, 0);
6747
}
6748
 
6749
/* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
6750
 
6751
void
6752
default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
6753
{
6754
  rtx symbol;
6755
  int flags;
6756
 
6757
  /* Careful not to prod global register variables.  */
6758
  if (!MEM_P (rtl))
6759
    return;
6760
  symbol = XEXP (rtl, 0);
6761
  if (GET_CODE (symbol) != SYMBOL_REF)
6762
    return;
6763
 
6764
  flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO;
6765
  if (TREE_CODE (decl) == FUNCTION_DECL)
6766
    flags |= SYMBOL_FLAG_FUNCTION;
6767
  if (targetm.binds_local_p (decl))
6768
    flags |= SYMBOL_FLAG_LOCAL;
6769
  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
6770
    flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
6771
  else if (targetm.in_small_data_p (decl))
6772
    flags |= SYMBOL_FLAG_SMALL;
6773
  /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
6774
     being PUBLIC, the thing *must* be defined in this translation unit.
6775
     Prevent this buglet from being propagated into rtl code as well.  */
6776
  if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
6777
    flags |= SYMBOL_FLAG_EXTERNAL;
6778
 
6779
  SYMBOL_REF_FLAGS (symbol) = flags;
6780
}
6781
 
6782
/* By default, we do nothing for encode_section_info, so we need not
6783
   do anything but discard the '*' marker.  */
6784
 
6785
const char *
6786
default_strip_name_encoding (const char *str)
6787
{
6788
  return str + (*str == '*');
6789
}
6790
 
6791
#ifdef ASM_OUTPUT_DEF
6792
/* The default implementation of TARGET_ASM_OUTPUT_ANCHOR.  Define the
6793
   anchor relative to ".", the current section position.  */
6794
 
6795
void
6796
default_asm_output_anchor (rtx symbol)
6797
{
6798
  char buffer[100];
6799
 
6800
  sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC,
6801
           SYMBOL_REF_BLOCK_OFFSET (symbol));
6802
  ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
6803
}
6804
#endif
6805
 
6806
/* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P.  */
6807
 
6808
bool
6809
default_use_anchors_for_symbol_p (const_rtx symbol)
6810
{
6811
  section *sect;
6812
  tree decl;
6813
 
6814
  /* Don't use anchors for mergeable sections.  The linker might move
6815
     the objects around.  */
6816
  sect = SYMBOL_REF_BLOCK (symbol)->sect;
6817
  if (sect->common.flags & SECTION_MERGE)
6818
    return false;
6819
 
6820
  /* Don't use anchors for small data sections.  The small data register
6821
     acts as an anchor for such sections.  */
6822
  if (sect->common.flags & SECTION_SMALL)
6823
    return false;
6824
 
6825
  decl = SYMBOL_REF_DECL (symbol);
6826
  if (decl && DECL_P (decl))
6827
    {
6828
      /* Don't use section anchors for decls that might be defined by
6829
         other modules.  */
6830
      if (!targetm.binds_local_p (decl))
6831
        return false;
6832
 
6833
      /* Don't use section anchors for decls that will be placed in a
6834
         small data section.  */
6835
      /* ??? Ideally, this check would be redundant with the SECTION_SMALL
6836
         one above.  The problem is that we only use SECTION_SMALL for
6837
         sections that should be marked as small in the section directive.  */
6838
      if (targetm.in_small_data_p (decl))
6839
        return false;
6840
    }
6841
  return true;
6842
}
6843
 
6844
/* Return true when RESOLUTION indicate that symbol will be bound to the
6845
   definition provided by current .o file.  */
6846
 
6847
static bool
6848
resolution_to_local_definition_p (enum ld_plugin_symbol_resolution resolution)
6849
{
6850
  return (resolution == LDPR_PREVAILING_DEF
6851
          || resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
6852
          || resolution == LDPR_PREVAILING_DEF_IRONLY);
6853
}
6854
 
6855
/* Return true when RESOLUTION indicate that symbol will be bound locally
6856
   within current executable or DSO.  */
6857
 
6858
static bool
6859
resolution_local_p (enum ld_plugin_symbol_resolution resolution)
6860
{
6861
  return (resolution == LDPR_PREVAILING_DEF
6862
          || resolution == LDPR_PREVAILING_DEF_IRONLY
6863
          || resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
6864
          || resolution == LDPR_PREEMPTED_REG
6865
          || resolution == LDPR_PREEMPTED_IR
6866
          || resolution == LDPR_RESOLVED_IR
6867
          || resolution == LDPR_RESOLVED_EXEC);
6868
}
6869
 
6870
/* Assume ELF-ish defaults, since that's pretty much the most liberal
6871
   wrt cross-module name binding.  */
6872
 
6873
bool
6874
default_binds_local_p (const_tree exp)
6875
{
6876
  return default_binds_local_p_1 (exp, flag_shlib);
6877
}
6878
 
6879
bool
6880
default_binds_local_p_1 (const_tree exp, int shlib)
6881
{
6882
  bool local_p;
6883
  bool resolved_locally = false;
6884
  bool resolved_to_local_def = false;
6885
 
6886
  /* With resolution file in hands, take look into resolutions.
6887
     We can't just return true for resolved_locally symbols,
6888
     because dynamic linking might overwrite symbols
6889
     in shared libraries.  */
6890
  if (TREE_CODE (exp) == VAR_DECL && TREE_PUBLIC (exp)
6891
      && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
6892
    {
6893
      struct varpool_node *vnode = varpool_get_node (exp);
6894
      if (vnode && resolution_local_p (vnode->resolution))
6895
        resolved_locally = true;
6896
      if (vnode
6897
          && resolution_to_local_definition_p (vnode->resolution))
6898
        resolved_to_local_def = true;
6899
    }
6900
  else if (TREE_CODE (exp) == FUNCTION_DECL && TREE_PUBLIC (exp))
6901
    {
6902
      struct cgraph_node *node = cgraph_get_node (exp);
6903
      if (node
6904
          && resolution_local_p (node->resolution))
6905
        resolved_locally = true;
6906
      if (node
6907
          && resolution_to_local_definition_p (node->resolution))
6908
        resolved_to_local_def = true;
6909
    }
6910
 
6911
  /* A non-decl is an entry in the constant pool.  */
6912
  if (!DECL_P (exp))
6913
    local_p = true;
6914
  /* Weakrefs may not bind locally, even though the weakref itself is always
6915
     static and therefore local.  Similarly, the resolver for ifunc functions
6916
     might resolve to a non-local function.
6917
     FIXME: We can resolve the weakref case more curefuly by looking at the
6918
     weakref alias.  */
6919
  else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp))
6920
           || (TREE_CODE (exp) == FUNCTION_DECL
6921
               && lookup_attribute ("ifunc", DECL_ATTRIBUTES (exp))))
6922
    local_p = false;
6923
  /* Static variables are always local.  */
6924
  else if (! TREE_PUBLIC (exp))
6925
    local_p = true;
6926
  /* A variable is local if the user has said explicitly that it will
6927
     be.  */
6928
  else if ((DECL_VISIBILITY_SPECIFIED (exp)
6929
            || resolved_to_local_def)
6930
           && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
6931
    local_p = true;
6932
  /* Variables defined outside this object might not be local.  */
6933
  else if (DECL_EXTERNAL (exp) && !resolved_locally)
6934
    local_p = false;
6935
  /* If defined in this object and visibility is not default, must be
6936
     local.  */
6937
  else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
6938
    local_p = true;
6939
  /* Default visibility weak data can be overridden by a strong symbol
6940
     in another module and so are not local.  */
6941
  else if (DECL_WEAK (exp)
6942
           && !resolved_locally)
6943
    local_p = false;
6944
  /* If PIC, then assume that any global name can be overridden by
6945
     symbols resolved from other modules.  */
6946
  else if (shlib)
6947
    local_p = false;
6948
  /* Uninitialized COMMON variable may be unified with symbols
6949
     resolved from other modules.  */
6950
  else if (DECL_COMMON (exp)
6951
           && !resolved_locally
6952
           && (DECL_INITIAL (exp) == NULL
6953
               || DECL_INITIAL (exp) == error_mark_node))
6954
    local_p = false;
6955
  /* Otherwise we're left with initialized (or non-common) global data
6956
     which is of necessity defined locally.  */
6957
  else
6958
    local_p = true;
6959
 
6960
  return local_p;
6961
}
6962
 
6963
/* Return true when references to DECL must bind to current definition in
6964
   final executable.
6965
 
6966
   The condition is usually equivalent to whether the function binds to the
6967
   current module (shared library or executable), that is to binds_local_p.
6968
   We use this fact to avoid need for another target hook and implement
6969
   the logic using binds_local_p and just special cases where
6970
   decl_binds_to_current_def_p is stronger than binds_local_p.  In particular
6971
   the weak definitions (that can be overwritten at linktime by other
6972
   definition from different object file) and when resolution info is available
6973
   we simply use the knowledge passed to us by linker plugin.  */
6974
bool
6975
decl_binds_to_current_def_p (tree decl)
6976
{
6977
  gcc_assert (DECL_P (decl));
6978
  if (!TREE_PUBLIC (decl))
6979
    return true;
6980
  if (!targetm.binds_local_p (decl))
6981
    return false;
6982
  /* When resolution is available, just use it.  */
6983
  if (TREE_CODE (decl) == VAR_DECL
6984
      && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
6985
    {
6986
      struct varpool_node *vnode = varpool_get_node (decl);
6987
      if (vnode
6988
          && vnode->resolution != LDPR_UNKNOWN)
6989
        return resolution_to_local_definition_p (vnode->resolution);
6990
    }
6991
  else if (TREE_CODE (decl) == FUNCTION_DECL)
6992
    {
6993
      struct cgraph_node *node = cgraph_get_node (decl);
6994
      if (node
6995
          && node->resolution != LDPR_UNKNOWN)
6996
        return resolution_to_local_definition_p (node->resolution);
6997
    }
6998
  /* Otherwise we have to assume the worst for DECL_WEAK (hidden weaks
6999
     binds locally but still can be overwritten).
7000
     This rely on fact that binds_local_p behave as decl_replaceable_p
7001
     for all other declaration types.  */
7002
  return !DECL_WEAK (decl);
7003
}
7004
 
7005
/* A replaceable function or variable is one which may be replaced
7006
   at link-time with an entirely different definition, provided that the
7007
   replacement has the same type.  For example, functions declared
7008
   with __attribute__((weak)) on most systems are replaceable.
7009
 
7010
   COMDAT functions are not replaceable, since all definitions of the
7011
   function must be equivalent.  It is important that COMDAT functions
7012
   not be treated as replaceable so that use of C++ template
7013
   instantiations is not penalized.  */
7014
 
7015
bool
7016
decl_replaceable_p (tree decl)
7017
{
7018
  gcc_assert (DECL_P (decl));
7019
  if (!TREE_PUBLIC (decl) || DECL_COMDAT (decl))
7020
    return false;
7021
  return !decl_binds_to_current_def_p (decl);
7022
}
7023
 
7024
/* Default function to output code that will globalize a label.  A
7025
   target must define GLOBAL_ASM_OP or provide its own function to
7026
   globalize a label.  */
7027
#ifdef GLOBAL_ASM_OP
7028
void
7029
default_globalize_label (FILE * stream, const char *name)
7030
{
7031
  fputs (GLOBAL_ASM_OP, stream);
7032
  assemble_name (stream, name);
7033
  putc ('\n', stream);
7034
}
7035
#endif /* GLOBAL_ASM_OP */
7036
 
7037
/* Default function to output code that will globalize a declaration.  */
7038
void
7039
default_globalize_decl_name (FILE * stream, tree decl)
7040
{
7041
  const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
7042
  targetm.asm_out.globalize_label (stream, name);
7043
}
7044
 
7045
/* Default function to output a label for unwind information.  The
7046
   default is to do nothing.  A target that needs nonlocal labels for
7047
   unwind information must provide its own function to do this.  */
7048
void
7049
default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
7050
                           tree decl ATTRIBUTE_UNUSED,
7051
                           int for_eh ATTRIBUTE_UNUSED,
7052
                           int empty ATTRIBUTE_UNUSED)
7053
{
7054
}
7055
 
7056
/* Default function to output a label to divide up the exception table.
7057
   The default is to do nothing.  A target that needs/wants to divide
7058
   up the table must provide it's own function to do this.  */
7059
void
7060
default_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED)
7061
{
7062
}
7063
 
7064
/* This is how to output an internal numbered label where PREFIX is
7065
   the class of label and LABELNO is the number within the class.  */
7066
 
7067
void
7068
default_generate_internal_label (char *buf, const char *prefix,
7069
                                 unsigned long labelno)
7070
{
7071
  ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
7072
}
7073
 
7074
/* This is how to output an internal numbered label where PREFIX is
7075
   the class of label and LABELNO is the number within the class.  */
7076
 
7077
void
7078
default_internal_label (FILE *stream, const char *prefix,
7079
                        unsigned long labelno)
7080
{
7081
  char *const buf = (char *) alloca (40 + strlen (prefix));
7082
  ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
7083
  ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
7084
}
7085
 
7086
 
7087
/* The default implementation of ASM_DECLARE_CONSTANT_NAME.  */
7088
 
7089
void
7090
default_asm_declare_constant_name (FILE *file, const char *name,
7091
                                   const_tree exp ATTRIBUTE_UNUSED,
7092
                                   HOST_WIDE_INT size ATTRIBUTE_UNUSED)
7093
{
7094
  assemble_label (file, name);
7095
}
7096
 
7097
/* This is the default behavior at the beginning of a file.  It's
7098
   controlled by two other target-hook toggles.  */
7099
void
7100
default_file_start (void)
7101
{
7102
  if (targetm.asm_file_start_app_off
7103
      && !(flag_verbose_asm || flag_debug_asm || flag_dump_rtl_in_asm))
7104
    fputs (ASM_APP_OFF, asm_out_file);
7105
 
7106
  if (targetm.asm_file_start_file_directive)
7107
    output_file_directive (asm_out_file, main_input_filename);
7108
}
7109
 
7110
/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
7111
   which emits a special section directive used to indicate whether or
7112
   not this object file needs an executable stack.  This is primarily
7113
   a GNU extension to ELF but could be used on other targets.  */
7114
 
7115
int trampolines_created;
7116
 
7117
void
7118
file_end_indicate_exec_stack (void)
7119
{
7120
  unsigned int flags = SECTION_DEBUG;
7121
  if (trampolines_created)
7122
    flags |= SECTION_CODE;
7123
 
7124
  switch_to_section (get_section (".note.GNU-stack", flags, NULL));
7125
}
7126
 
7127
/* Emit a special section directive to indicate that this object file
7128
   was compiled with -fsplit-stack.  This is used to let the linker
7129
   detect calls between split-stack code and non-split-stack code, so
7130
   that it can modify the split-stack code to allocate a sufficiently
7131
   large stack.  We emit another special section if there are any
7132
   functions in this file which have the no_split_stack attribute, to
7133
   prevent the linker from warning about being unable to convert the
7134
   functions if they call non-split-stack code.  */
7135
 
7136
void
7137
file_end_indicate_split_stack (void)
7138
{
7139
  if (flag_split_stack)
7140
    {
7141
      switch_to_section (get_section (".note.GNU-split-stack", SECTION_DEBUG,
7142
                                      NULL));
7143
      if (saw_no_split_stack)
7144
        switch_to_section (get_section (".note.GNU-no-split-stack",
7145
                                        SECTION_DEBUG, NULL));
7146
    }
7147
}
7148
 
7149
/* Output DIRECTIVE (a C string) followed by a newline.  This is used as
7150
   a get_unnamed_section callback.  */
7151
 
7152
void
7153
output_section_asm_op (const void *directive)
7154
{
7155
  fprintf (asm_out_file, "%s\n", (const char *) directive);
7156
}
7157
 
7158
/* Emit assembly code to switch to section NEW_SECTION.  Do nothing if
7159
   the current section is NEW_SECTION.  */
7160
 
7161
void
7162
switch_to_section (section *new_section)
7163
{
7164
  if (in_section == new_section)
7165
    return;
7166
 
7167
  if (new_section->common.flags & SECTION_FORGET)
7168
    in_section = NULL;
7169
  else
7170
    in_section = new_section;
7171
 
7172
  switch (SECTION_STYLE (new_section))
7173
    {
7174
    case SECTION_NAMED:
7175
      targetm.asm_out.named_section (new_section->named.name,
7176
                                     new_section->named.common.flags,
7177
                                     new_section->named.decl);
7178
      break;
7179
 
7180
    case SECTION_UNNAMED:
7181
      new_section->unnamed.callback (new_section->unnamed.data);
7182
      break;
7183
 
7184
    case SECTION_NOSWITCH:
7185
      gcc_unreachable ();
7186
      break;
7187
    }
7188
 
7189
  new_section->common.flags |= SECTION_DECLARED;
7190
}
7191
 
7192
/* If block symbol SYMBOL has not yet been assigned an offset, place
7193
   it at the end of its block.  */
7194
 
7195
void
7196
place_block_symbol (rtx symbol)
7197
{
7198
  unsigned HOST_WIDE_INT size, mask, offset;
7199
  struct constant_descriptor_rtx *desc;
7200
  unsigned int alignment;
7201
  struct object_block *block;
7202
  tree decl;
7203
 
7204
  gcc_assert (SYMBOL_REF_BLOCK (symbol));
7205
  if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0)
7206
    return;
7207
 
7208
  /* Work out the symbol's size and alignment.  */
7209
  if (CONSTANT_POOL_ADDRESS_P (symbol))
7210
    {
7211
      desc = SYMBOL_REF_CONSTANT (symbol);
7212
      alignment = desc->align;
7213
      size = GET_MODE_SIZE (desc->mode);
7214
    }
7215
  else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
7216
    {
7217
      decl = SYMBOL_REF_DECL (symbol);
7218
      alignment = DECL_ALIGN (decl);
7219
      size = get_constant_size (DECL_INITIAL (decl));
7220
    }
7221
  else
7222
    {
7223
      decl = SYMBOL_REF_DECL (symbol);
7224
      alignment = DECL_ALIGN (decl);
7225
      size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
7226
    }
7227
 
7228
  /* Calculate the object's offset from the start of the block.  */
7229
  block = SYMBOL_REF_BLOCK (symbol);
7230
  mask = alignment / BITS_PER_UNIT - 1;
7231
  offset = (block->size + mask) & ~mask;
7232
  SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
7233
 
7234
  /* Record the block's new alignment and size.  */
7235
  block->alignment = MAX (block->alignment, alignment);
7236
  block->size = offset + size;
7237
 
7238
  VEC_safe_push (rtx, gc, block->objects, symbol);
7239
}
7240
 
7241
/* Return the anchor that should be used to address byte offset OFFSET
7242
   from the first object in BLOCK.  MODEL is the TLS model used
7243
   to access it.  */
7244
 
7245
rtx
7246
get_section_anchor (struct object_block *block, HOST_WIDE_INT offset,
7247
                    enum tls_model model)
7248
{
7249
  char label[100];
7250
  unsigned int begin, middle, end;
7251
  unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta;
7252
  rtx anchor;
7253
 
7254
  /* Work out the anchor's offset.  Use an offset of 0 for the first
7255
     anchor so that we don't pessimize the case where we take the address
7256
     of a variable at the beginning of the block.  This is particularly
7257
     useful when a block has only one variable assigned to it.
7258
 
7259
     We try to place anchors RANGE bytes apart, so there can then be
7260
     anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of
7261
     a ptr_mode offset.  With some target settings, the lowest such
7262
     anchor might be out of range for the lowest ptr_mode offset;
7263
     likewise the highest anchor for the highest offset.  Use anchors
7264
     at the extreme ends of the ptr_mode range in such cases.
7265
 
7266
     All arithmetic uses unsigned integers in order to avoid
7267
     signed overflow.  */
7268
  max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset;
7269
  min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset;
7270
  range = max_offset - min_offset + 1;
7271
  if (range == 0)
7272
    offset = 0;
7273
  else
7274
    {
7275
      bias = 1 << (GET_MODE_BITSIZE (ptr_mode) - 1);
7276
      if (offset < 0)
7277
        {
7278
          delta = -(unsigned HOST_WIDE_INT) offset + max_offset;
7279
          delta -= delta % range;
7280
          if (delta > bias)
7281
            delta = bias;
7282
          offset = (HOST_WIDE_INT) (-delta);
7283
        }
7284
      else
7285
        {
7286
          delta = (unsigned HOST_WIDE_INT) offset - min_offset;
7287
          delta -= delta % range;
7288
          if (delta > bias - 1)
7289
            delta = bias - 1;
7290
          offset = (HOST_WIDE_INT) delta;
7291
        }
7292
    }
7293
 
7294
  /* Do a binary search to see if there's already an anchor we can use.
7295
     Set BEGIN to the new anchor's index if not.  */
7296
  begin = 0;
7297
  end = VEC_length (rtx, block->anchors);
7298
  while (begin != end)
7299
    {
7300
      middle = (end + begin) / 2;
7301
      anchor = VEC_index (rtx, block->anchors, middle);
7302
      if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset)
7303
        end = middle;
7304
      else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset)
7305
        begin = middle + 1;
7306
      else if (SYMBOL_REF_TLS_MODEL (anchor) > model)
7307
        end = middle;
7308
      else if (SYMBOL_REF_TLS_MODEL (anchor) < model)
7309
        begin = middle + 1;
7310
      else
7311
        return anchor;
7312
    }
7313
 
7314
  /* Create a new anchor with a unique label.  */
7315
  ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++);
7316
  anchor = create_block_symbol (ggc_strdup (label), block, offset);
7317
  SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR;
7318
  SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT;
7319
 
7320
  /* Insert it at index BEGIN.  */
7321
  VEC_safe_insert (rtx, gc, block->anchors, begin, anchor);
7322
  return anchor;
7323
}
7324
 
7325
/* Output the objects in BLOCK.  */
7326
 
7327
static void
7328
output_object_block (struct object_block *block)
7329
{
7330
  struct constant_descriptor_rtx *desc;
7331
  unsigned int i;
7332
  HOST_WIDE_INT offset;
7333
  tree decl;
7334
  rtx symbol;
7335
 
7336
  if (block->objects == NULL)
7337
    return;
7338
 
7339
  /* Switch to the section and make sure that the first byte is
7340
     suitably aligned.  */
7341
  switch_to_section (block->sect);
7342
  assemble_align (block->alignment);
7343
 
7344
  /* Define the values of all anchors relative to the current section
7345
     position.  */
7346
  FOR_EACH_VEC_ELT (rtx, block->anchors, i, symbol)
7347
    targetm.asm_out.output_anchor (symbol);
7348
 
7349
  /* Output the objects themselves.  */
7350
  offset = 0;
7351
  FOR_EACH_VEC_ELT (rtx, block->objects, i, symbol)
7352
    {
7353
      /* Move to the object's offset, padding with zeros if necessary.  */
7354
      assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset);
7355
      offset = SYMBOL_REF_BLOCK_OFFSET (symbol);
7356
      if (CONSTANT_POOL_ADDRESS_P (symbol))
7357
        {
7358
          desc = SYMBOL_REF_CONSTANT (symbol);
7359
          output_constant_pool_1 (desc, 1);
7360
          offset += GET_MODE_SIZE (desc->mode);
7361
        }
7362
      else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
7363
        {
7364
          decl = SYMBOL_REF_DECL (symbol);
7365
          assemble_constant_contents (DECL_INITIAL (decl), XSTR (symbol, 0),
7366
                                      DECL_ALIGN (decl));
7367
          offset += get_constant_size (DECL_INITIAL (decl));
7368
        }
7369
      else
7370
        {
7371
          decl = SYMBOL_REF_DECL (symbol);
7372
          assemble_variable_contents (decl, XSTR (symbol, 0), false);
7373
          offset += tree_low_cst (DECL_SIZE_UNIT (decl), 1);
7374
        }
7375
    }
7376
}
7377
 
7378
/* A htab_traverse callback used to call output_object_block for
7379
   each member of object_block_htab.  */
7380
 
7381
static int
7382
output_object_block_htab (void **slot, void *data ATTRIBUTE_UNUSED)
7383
{
7384
  output_object_block ((struct object_block *) (*slot));
7385
  return 1;
7386
}
7387
 
7388
/* Output the definitions of all object_blocks.  */
7389
 
7390
void
7391
output_object_blocks (void)
7392
{
7393
  htab_traverse (object_block_htab, output_object_block_htab, NULL);
7394
}
7395
 
7396
/* This function provides a possible implementation of the
7397
   TARGET_ASM_RECORD_GCC_SWITCHES target hook for ELF targets.  When triggered
7398
   by -frecord-gcc-switches it creates a new mergeable, string section in the
7399
   assembler output file called TARGET_ASM_RECORD_GCC_SWITCHES_SECTION which
7400
   contains the switches in ASCII format.
7401
 
7402
   FIXME: This code does not correctly handle double quote characters
7403
   that appear inside strings, (it strips them rather than preserving them).
7404
   FIXME: ASM_OUTPUT_ASCII, as defined in config/elfos.h will not emit NUL
7405
   characters - instead it treats them as sub-string separators.  Since
7406
   we want to emit NUL strings terminators into the object file we have to use
7407
   ASM_OUTPUT_SKIP.  */
7408
 
7409
int
7410
elf_record_gcc_switches (print_switch_type type, const char * name)
7411
{
7412
  switch (type)
7413
    {
7414
    case SWITCH_TYPE_PASSED:
7415
      ASM_OUTPUT_ASCII (asm_out_file, name, strlen (name));
7416
      ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
7417
      break;
7418
 
7419
    case SWITCH_TYPE_DESCRIPTIVE:
7420
      if (name == NULL)
7421
        {
7422
          /* Distinguish between invocations where name is NULL.  */
7423
          static bool started = false;
7424
 
7425
          if (!started)
7426
            {
7427
              section * sec;
7428
 
7429
              sec = get_section (targetm.asm_out.record_gcc_switches_section,
7430
                                 SECTION_DEBUG
7431
                                 | SECTION_MERGE
7432
                                 | SECTION_STRINGS
7433
                                 | (SECTION_ENTSIZE & 1),
7434
                                 NULL);
7435
              switch_to_section (sec);
7436
              started = true;
7437
            }
7438
        }
7439
 
7440
    default:
7441
      break;
7442
    }
7443
 
7444
  /* The return value is currently ignored by the caller, but must be 0.
7445
     For -fverbose-asm the return value would be the number of characters
7446
     emitted into the assembler file.  */
7447
  return 0;
7448
}
7449
 
7450
/* Emit text to declare externally defined symbols. It is needed to
7451
   properly support non-default visibility.  */
7452
void
7453
default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED,
7454
                                 tree decl,
7455
                                 const char *name ATTRIBUTE_UNUSED)
7456
{
7457
  /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7458
     set in order to avoid putting out names that are never really
7459
     used. */
7460
  if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
7461
      && targetm.binds_local_p (decl))
7462
    maybe_assemble_visibility (decl);
7463
}
7464
 
7465
/* The default hook for TARGET_ASM_OUTPUT_SOURCE_FILENAME.  */
7466
 
7467
void
7468
default_asm_output_source_filename (FILE *file, const char *name)
7469
{
7470
#ifdef ASM_OUTPUT_SOURCE_FILENAME
7471
  ASM_OUTPUT_SOURCE_FILENAME (file, name);
7472
#else
7473
  fprintf (file, "\t.file\t");
7474
  output_quoted_string (file, name);
7475
  putc ('\n', file);
7476
#endif
7477
}
7478
 
7479
/* Output a file name in the form wanted by System V.  */
7480
 
7481
void
7482
output_file_directive (FILE *asm_file, const char *input_name)
7483
{
7484
  int len;
7485
  const char *na;
7486
 
7487
  if (input_name == NULL)
7488
    input_name = "<stdin>";
7489
  else
7490
    input_name = remap_debug_filename (input_name);
7491
 
7492
  len = strlen (input_name);
7493
  na = input_name + len;
7494
 
7495
  /* NA gets INPUT_NAME sans directory names.  */
7496
  while (na > input_name)
7497
    {
7498
      if (IS_DIR_SEPARATOR (na[-1]))
7499
        break;
7500
      na--;
7501
    }
7502
 
7503
  targetm.asm_out.output_source_filename (asm_file, na);
7504
}
7505
 
7506
/* Create a DEBUG_EXPR_DECL / DEBUG_EXPR pair from RTL expression
7507
   EXP.  */
7508
rtx
7509
make_debug_expr_from_rtl (const_rtx exp)
7510
{
7511
  tree ddecl = make_node (DEBUG_EXPR_DECL), type;
7512
  enum machine_mode mode = GET_MODE (exp);
7513
  rtx dval;
7514
 
7515
  DECL_ARTIFICIAL (ddecl) = 1;
7516
  if (REG_P (exp) && REG_EXPR (exp))
7517
    type = TREE_TYPE (REG_EXPR (exp));
7518
  else if (MEM_P (exp) && MEM_EXPR (exp))
7519
    type = TREE_TYPE (MEM_EXPR (exp));
7520
  else
7521
    type = NULL_TREE;
7522
  if (type && TYPE_MODE (type) == mode)
7523
    TREE_TYPE (ddecl) = type;
7524
  else
7525
    TREE_TYPE (ddecl) = lang_hooks.types.type_for_mode (mode, 1);
7526
  DECL_MODE (ddecl) = mode;
7527
  dval = gen_rtx_DEBUG_EXPR (mode);
7528
  DEBUG_EXPR_TREE_DECL (dval) = ddecl;
7529
  SET_DECL_RTL (ddecl, dval);
7530
  return dval;
7531
}
7532
 
7533
#ifdef ELF_ASCII_ESCAPES
7534
/* Default ASM_OUTPUT_LIMITED_STRING for ELF targets.  */
7535
 
7536
void
7537
default_elf_asm_output_limited_string (FILE *f, const char *s)
7538
{
7539
  int escape;
7540
  unsigned char c;
7541
 
7542
  fputs (STRING_ASM_OP, f);
7543
  putc ('"', f);
7544
  while (*s != '\0')
7545
    {
7546
      c = *s;
7547
      escape = ELF_ASCII_ESCAPES[c];
7548
      switch (escape)
7549
        {
7550
        case 0:
7551
          putc (c, f);
7552
          break;
7553
        case 1:
7554
          /* TODO: Print in hex with fast function, important for -flto. */
7555
          fprintf (f, "\\%03o", c);
7556
          break;
7557
        default:
7558
          putc ('\\', f);
7559
          putc (escape, f);
7560
          break;
7561
        }
7562
      s++;
7563
    }
7564
  putc ('\"', f);
7565
  putc ('\n', f);
7566
}
7567
 
7568
/* Default ASM_OUTPUT_ASCII for ELF targets.  */
7569
 
7570
void
7571
default_elf_asm_output_ascii (FILE *f, const char *s, unsigned int len)
7572
{
7573
  const char *limit = s + len;
7574
  const char *last_null = NULL;
7575
  unsigned bytes_in_chunk = 0;
7576
  unsigned char c;
7577
  int escape;
7578
 
7579
  for (; s < limit; s++)
7580
    {
7581
      const char *p;
7582
 
7583
      if (bytes_in_chunk >= 60)
7584
        {
7585
          putc ('\"', f);
7586
          putc ('\n', f);
7587
          bytes_in_chunk = 0;
7588
        }
7589
 
7590
      if (s > last_null)
7591
        {
7592
          for (p = s; p < limit && *p != '\0'; p++)
7593
            continue;
7594
          last_null = p;
7595
        }
7596
      else
7597
        p = last_null;
7598
 
7599
      if (p < limit && (p - s) <= (long) ELF_STRING_LIMIT)
7600
        {
7601
          if (bytes_in_chunk > 0)
7602
            {
7603
              putc ('\"', f);
7604
              putc ('\n', f);
7605
              bytes_in_chunk = 0;
7606
            }
7607
 
7608
          default_elf_asm_output_limited_string (f, s);
7609
          s = p;
7610
        }
7611
      else
7612
        {
7613
          if (bytes_in_chunk == 0)
7614
            fputs (ASCII_DATA_ASM_OP "\"", f);
7615
 
7616
          c = *s;
7617
          escape = ELF_ASCII_ESCAPES[c];
7618
          switch (escape)
7619
            {
7620
            case 0:
7621
              putc (c, f);
7622
              bytes_in_chunk++;
7623
              break;
7624
            case 1:
7625
              /* TODO: Print in hex with fast function, important for -flto. */
7626
              fprintf (f, "\\%03o", c);
7627
              bytes_in_chunk += 4;
7628
              break;
7629
            default:
7630
              putc ('\\', f);
7631
              putc (escape, f);
7632
              bytes_in_chunk += 2;
7633
              break;
7634
            }
7635
 
7636
        }
7637
    }
7638
 
7639
  if (bytes_in_chunk > 0)
7640
    {
7641
      putc ('\"', f);
7642
      putc ('\n', f);
7643
    }
7644
}
7645
#endif
7646
 
7647
static GTY(()) section *elf_init_array_section;
7648
static GTY(()) section *elf_fini_array_section;
7649
 
7650
static section *
7651
get_elf_initfini_array_priority_section (int priority,
7652
                                         bool constructor_p)
7653
{
7654
  section *sec;
7655
  if (priority != DEFAULT_INIT_PRIORITY)
7656
    {
7657
      char buf[18];
7658
      sprintf (buf, "%s.%.5u",
7659
               constructor_p ? ".init_array" : ".fini_array",
7660
               priority);
7661
      sec = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7662
    }
7663
  else
7664
    {
7665
      if (constructor_p)
7666
        {
7667
          if (elf_init_array_section == NULL)
7668
            elf_init_array_section
7669
              = get_section (".init_array",
7670
                             SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7671
          sec = elf_init_array_section;
7672
        }
7673
      else
7674
        {
7675
          if (elf_fini_array_section == NULL)
7676
            elf_fini_array_section
7677
              = get_section (".fini_array",
7678
                             SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7679
          sec = elf_fini_array_section;
7680
        }
7681
    }
7682
  return sec;
7683
}
7684
 
7685
/* Use .init_array section for constructors. */
7686
 
7687
void
7688
default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
7689
{
7690
  section *sec = get_elf_initfini_array_priority_section (priority,
7691
                                                          true);
7692
  assemble_addr_to_section (symbol, sec);
7693
}
7694
 
7695
/* Use .fini_array section for destructors. */
7696
 
7697
void
7698
default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
7699
{
7700
  section *sec = get_elf_initfini_array_priority_section (priority,
7701
                                                          false);
7702
  assemble_addr_to_section (symbol, sec);
7703
}
7704
 
7705
#include "gt-varasm.h"

powered by: WebSVN 2.1.0

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