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