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