]> gcc.gnu.org Git - gcc.git/blame - gcc/varasm.c
rtl.h (rtx_def): Update documentation.
[gcc.git] / gcc / varasm.c
CommitLineData
79e68feb 1/* Output variables, constants and external declarations, for GNU compiler.
47c3ed98 2 Copyright (C) 1987, 88, 89, 92-98, 1999 Free Software Foundation, Inc.
79e68feb
RS
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
e9fa0c7c
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
79e68feb
RS
20
21
22/* This file handles generation of all the assembler code
23 *except* the instructions of a function.
24 This includes declarations of variables and their initial values.
25
26 We also output the assembler code for constants stored in memory
27 and are responsible for combining constants with the same value. */
28
e9a25f70 29#include "config.h"
670ee920 30#include "system.h"
79e68feb
RS
31#include <setjmp.h>
32/* #include <stab.h> */
79e68feb
RS
33#include "rtl.h"
34#include "tree.h"
35#include "flags.h"
6adb4e3a 36#include "except.h"
57632c51 37#include "function.h"
79e68feb 38#include "expr.h"
5a13eaa4 39#include "output.h"
79e68feb
RS
40#include "hard-reg-set.h"
41#include "regs.h"
9a631e8e 42#include "defaults.h"
24b09b50 43#include "real.h"
10f0ad3d 44#include "toplev.h"
50b2596f 45#include "dbxout.h"
e016950d 46#include "sdbout.h"
79e68feb
RS
47
48#include "obstack.h"
3d6f7931 49#include "c-pragma.h"
79e68feb 50
b4ac57ab 51#ifdef XCOFF_DEBUGGING_INFO
f246a305 52#include "xcoffout.h"
b4ac57ab
RS
53#endif
54
073b0524
RK
55#ifndef TRAMPOLINE_ALIGNMENT
56#define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
57#endif
58
79e68feb
RS
59#ifndef ASM_STABS_OP
60#define ASM_STABS_OP ".stabs"
61#endif
62
7c6d4120
RK
63/* Define the prefix to use when check_memory_usage_flag is enable. */
64#ifdef NO_DOLLAR_IN_LABEL
65#ifdef NO_DOT_IN_LABEL
66#define CHKR_PREFIX "chkr_prefix_"
67#else /* !NO_DOT_IN_LABEL */
68#define CHKR_PREFIX "chkr."
69#endif
956d6950 70#else /* !NO_DOLLAR_IN_LABEL */
7c6d4120
RK
71#define CHKR_PREFIX "chkr$"
72#endif
73#define CHKR_PREFIX_SIZE (sizeof (CHKR_PREFIX) - 1)
74
561e6650
RS
75/* This macro gets just the user-specified name
76 out of the string in a SYMBOL_REF. On most machines,
77 we discard the * if any and that's all. */
78#ifndef STRIP_NAME_ENCODING
79#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
80 (VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
81#endif
82
79e68feb
RS
83/* File in which assembler code is being written. */
84
85extern FILE *asm_out_file;
86
87/* The (assembler) name of the first globally-visible object output. */
88char *first_global_object_name;
ee830309 89char *weak_global_object_name;
79e68feb
RS
90
91extern struct obstack *current_obstack;
92extern struct obstack *saveable_obstack;
75974726 93extern struct obstack *rtl_obstack;
79e68feb
RS
94extern struct obstack permanent_obstack;
95#define obstack_chunk_alloc xmalloc
79e68feb
RS
96
97/* Number for making the label on the next
98 constant that is stored in memory. */
99
100int const_labelno;
101
102/* Number for making the label on the next
103 static variable internal to a function. */
104
105int var_labelno;
106
dcc8e5e6
RS
107/* Carry information from ASM_DECLARE_OBJECT_NAME
108 to ASM_FINISH_DECLARE_OBJECT. */
109
110int size_directive_output;
111
cbed4565
RS
112/* The last decl for which assemble_variable was called,
113 if it did ASM_DECLARE_OBJECT_NAME.
114 If the last call to assemble_variable didn't do that,
115 this holds 0. */
116
117tree last_assemble_variable_decl;
118
eb0430f0
MM
119/* Nonzero if at least one function definition has been seen. */
120
121static int function_defined;
4b8af8d9 122
5a13eaa4
RK
123struct addr_const;
124struct constant_descriptor;
125struct rtx_const;
126struct pool_constant;
127
87e11268 128static const char *strip_reg_name PROTO((const char *));
5a13eaa4
RK
129static int contains_pointers_p PROTO((tree));
130static void decode_addr_const PROTO((tree, struct addr_const *));
131static int const_hash PROTO((tree));
132static int compare_constant PROTO((tree,
133 struct constant_descriptor *));
134static char *compare_constant_1 PROTO((tree, char *));
135static struct constant_descriptor *record_constant PROTO((tree));
136static void record_constant_1 PROTO((tree));
137static tree copy_constant PROTO((tree));
138static void output_constant_def_contents PROTO((tree, int, int));
139static void decode_rtx_const PROTO((enum machine_mode, rtx,
140 struct rtx_const *));
141static int const_hash_rtx PROTO((enum machine_mode, rtx));
142static int compare_constant_rtx PROTO((enum machine_mode, rtx,
143 struct constant_descriptor *));
144static struct constant_descriptor *record_constant_rtx PROTO((enum machine_mode,
145 rtx));
146static struct pool_constant *find_pool_constant PROTO((rtx));
91674c37
ILT
147static void mark_constant_pool PROTO((void));
148static void mark_constants PROTO((rtx));
5a13eaa4 149static int output_addressed_constants PROTO((tree));
8839fca4 150static void output_after_function_constants PROTO((void));
5a13eaa4 151static void output_constructor PROTO((tree, int));
0e05e8ea
JL
152#ifdef ASM_OUTPUT_BSS
153static void asm_output_bss PROTO((FILE *, tree, char *, int, int));
154#endif
cab634f2 155#ifdef BSS_SECTION_ASM_OP
0e05e8ea
JL
156#ifdef ASM_OUTPUT_ALIGNED_BSS
157static void asm_output_aligned_bss PROTO((FILE *, tree, char *, int, int));
158#endif
cab634f2 159#endif /* BSS_SECTION_ASM_OP */
79e68feb 160\f
e5887033
DE
161static enum in_section { no_section, in_text, in_data, in_named
162#ifdef BSS_SECTION_ASM_OP
163 , in_bss
164#endif
0021b564
JM
165#ifdef EH_FRAME_SECTION_ASM_OP
166 , in_eh_frame
167#endif
79e68feb 168#ifdef EXTRA_SECTIONS
e5887033 169 , EXTRA_SECTIONS
79e68feb 170#endif
e5887033 171} in_section = no_section;
79e68feb 172
8a425a05
DE
173/* Return a non-zero value if DECL has a section attribute. */
174#define IN_NAMED_SECTION(DECL) \
175 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
176 && DECL_SECTION_NAME (DECL) != NULL_TREE)
177
178/* Text of section name when in_section == in_named. */
179static char *in_named_name;
180
79e68feb
RS
181/* Define functions like text_section for any extra sections. */
182#ifdef EXTRA_SECTION_FUNCTIONS
183EXTRA_SECTION_FUNCTIONS
184#endif
185
186/* Tell assembler to switch to text section. */
187
188void
189text_section ()
190{
191 if (in_section != in_text)
192 {
b93a436e 193 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
79e68feb
RS
194 in_section = in_text;
195 }
196}
197
79e68feb
RS
198/* Tell assembler to switch to data section. */
199
200void
201data_section ()
202{
203 if (in_section != in_data)
204 {
b93a436e 205 if (flag_shared_data)
79e68feb
RS
206 {
207#ifdef SHARED_SECTION_ASM_OP
b93a436e 208 fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);
79e68feb 209#else
b93a436e 210 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
79e68feb
RS
211#endif
212 }
b93a436e
JL
213 else
214 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
79e68feb
RS
215
216 in_section = in_data;
217 }
218}
3167de5b
AM
219/* Tell assembler to ALWAYS switch to data section, in case
220 it's not sure where it it. */
221
222void
223force_data_section ()
224{
225 in_section = no_section;
226 data_section ();
227}
79e68feb 228
7c6d68c8
RS
229/* Tell assembler to switch to read-only data section. This is normally
230 the text section. */
231
232void
233readonly_data_section ()
234{
235#ifdef READONLY_DATA_SECTION
236 READONLY_DATA_SECTION (); /* Note this can call data_section. */
237#else
238 text_section ();
239#endif
240}
241
0f41302f 242/* Determine if we're in the text section. */
79e68feb
RS
243
244int
245in_text_section ()
246{
247 return in_section == in_text;
248}
8a425a05 249
0f41302f 250/* Determine if we're in the data section. */
6f2f3db7 251
274351ba
RK
252int
253in_data_section ()
254{
255 return in_section == in_data;
256}
6f2f3db7 257
2ffe831c
DE
258/* Tell assembler to change to section NAME for DECL.
259 If DECL is NULL, just switch to section NAME.
ad4ff310
JM
260 If NAME is NULL, get the name from DECL.
261 If RELOC is 1, the initializer for DECL contains relocs. */
8a425a05
DE
262
263void
ad4ff310 264named_section (decl, name, reloc)
2ffe831c 265 tree decl;
87e11268 266 const char *name;
ad4ff310 267 int reloc;
8a425a05 268{
2ffe831c 269 if (decl != NULL_TREE
6f2f3db7 270 && TREE_CODE_CLASS (TREE_CODE (decl)) != 'd')
2ffe831c
DE
271 abort ();
272 if (name == NULL)
273 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
274
8a425a05
DE
275 if (in_section != in_named || strcmp (name, in_named_name))
276 {
8a425a05 277#ifdef ASM_OUTPUT_SECTION_NAME
ad4ff310 278 ASM_OUTPUT_SECTION_NAME (asm_out_file, decl, name, reloc);
8a425a05
DE
279#else
280 /* Section attributes are not supported if this macro isn't provided -
281 some host formats don't support them at all. The front-end should
282 already have flagged this as an error. */
283 abort ();
284#endif
e9a25f70
JL
285
286 in_named_name = obstack_alloc (&permanent_obstack, strlen (name) + 1);
287 strcpy (in_named_name, name);
288 in_section = in_named;
8a425a05
DE
289 }
290}
4d1065ed 291
ad4ff310
JM
292#ifdef ASM_OUTPUT_SECTION_NAME
293#ifndef UNIQUE_SECTION
294#define UNIQUE_SECTION(DECL,RELOC) \
295do { \
296 int len; \
297 char *name, *string; \
298 \
299 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \
300 /* Strip off any encoding in name. */ \
301 STRIP_NAME_ENCODING (name, name); \
302 \
303 len = strlen (name) + 1; \
304 string = alloca (len + 1); \
305 sprintf (string, ".%s", name); \
306 \
307 DECL_SECTION_NAME (DECL) = build_string (len, string); \
308} while (0)
309#endif
310#ifndef UNIQUE_SECTION_P
311#define UNIQUE_SECTION_P(DECL) 0
312#endif
313#endif
314
e5887033
DE
315#ifdef BSS_SECTION_ASM_OP
316
317/* Tell the assembler to switch to the bss section. */
318
319void
da2c5447 320bss_section ()
e5887033
DE
321{
322 if (in_section != in_bss)
323 {
e5887033 324#ifdef SHARED_BSS_SECTION_ASM_OP
b93a436e
JL
325 if (flag_shared_data)
326 fprintf (asm_out_file, "%s\n", SHARED_BSS_SECTION_ASM_OP);
327 else
e5887033 328#endif
b93a436e 329 fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
e5887033
DE
330
331 in_section = in_bss;
332 }
333}
334
335#ifdef ASM_OUTPUT_BSS
336
337/* Utility function for ASM_OUTPUT_BSS for targets to use if
338 they don't support alignments in .bss.
339 ??? It is believed that this function will work in most cases so such
340 support is localized here. */
341
342static void
91fddd7c 343asm_output_bss (file, decl, name, size, rounded)
e5887033 344 FILE *file;
91fddd7c 345 tree decl;
e5887033
DE
346 char *name;
347 int size, rounded;
348{
349 ASM_GLOBALIZE_LABEL (file, name);
350 bss_section ();
91fddd7c
DE
351#ifdef ASM_DECLARE_OBJECT_NAME
352 last_assemble_variable_decl = decl;
353 ASM_DECLARE_OBJECT_NAME (file, name, decl);
354#else
355 /* Standard thing is just output label for the object. */
e5887033 356 ASM_OUTPUT_LABEL (file, name);
91fddd7c 357#endif /* ASM_DECLARE_OBJECT_NAME */
e5887033
DE
358 ASM_OUTPUT_SKIP (file, rounded);
359}
360
361#endif
362
363#ifdef ASM_OUTPUT_ALIGNED_BSS
364
365/* Utility function for targets to use in implementing
366 ASM_OUTPUT_ALIGNED_BSS.
367 ??? It is believed that this function will work in most cases so such
368 support is localized here. */
369
370static void
91fddd7c 371asm_output_aligned_bss (file, decl, name, size, align)
e5887033 372 FILE *file;
91fddd7c 373 tree decl;
e5887033
DE
374 char *name;
375 int size, align;
376{
377 ASM_GLOBALIZE_LABEL (file, name);
378 bss_section ();
379 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
91fddd7c
DE
380#ifdef ASM_DECLARE_OBJECT_NAME
381 last_assemble_variable_decl = decl;
382 ASM_DECLARE_OBJECT_NAME (file, name, decl);
383#else
384 /* Standard thing is just output label for the object. */
e5887033 385 ASM_OUTPUT_LABEL (file, name);
91fddd7c 386#endif /* ASM_DECLARE_OBJECT_NAME */
f8bc3367 387 ASM_OUTPUT_SKIP (file, size ? size : 1);
e5887033
DE
388}
389
390#endif
391
392#endif /* BSS_SECTION_ASM_OP */
393
0021b564
JM
394#ifdef EH_FRAME_SECTION_ASM_OP
395void
396eh_frame_section ()
397{
398 if (in_section != in_eh_frame)
399 {
400 fprintf (asm_out_file, "%s\n", EH_FRAME_SECTION_ASM_OP);
401 in_section = in_eh_frame;
402 }
403}
404#endif
405
4d1065ed
DE
406/* Switch to the section for function DECL.
407
408 If DECL is NULL_TREE, switch to the text section.
409 ??? It's not clear that we will ever be passed NULL_TREE, but it's
410 safer to handle it. */
411
412void
413function_section (decl)
414 tree decl;
415{
416 if (decl != NULL_TREE
417 && DECL_SECTION_NAME (decl) != NULL_TREE)
ad4ff310 418 named_section (decl, (char *) 0, 0);
8b43265c
JL
419 else
420 text_section ();
4d1065ed 421}
f9da1f35
DE
422
423/* Switch to section for variable DECL.
424
425 RELOC is the `reloc' argument to SELECT_SECTION. */
426
427void
428variable_section (decl, reloc)
429 tree decl;
430 int reloc;
431{
432 if (IN_NAMED_SECTION (decl))
ad4ff310 433 named_section (decl, NULL, reloc);
f9da1f35
DE
434 else
435 {
436 /* C++ can have const variables that get initialized from constructors,
437 and thus can not be in a readonly section. We prevent this by
438 verifying that the initial value is constant for objects put in a
439 readonly section.
440
441 error_mark_node is used by the C front end to indicate that the
442 initializer has not been seen yet. In this case, we assume that
e5887033
DE
443 the initializer must be constant.
444
445 C++ uses error_mark_node for variables that have complicated
446 initializers, but these variables go in BSS so we won't be called
447 for them. */
448
f9da1f35
DE
449#ifdef SELECT_SECTION
450 SELECT_SECTION (decl, reloc);
451#else
ad4ff310 452 if (DECL_READONLY_SECTION (decl, reloc))
f9da1f35
DE
453 readonly_data_section ();
454 else
455 data_section ();
456#endif
457 }
458}
6adb4e3a
MS
459
460/* Tell assembler to switch to the section for the exception handling
461 table. */
462
463void
464exception_section ()
465{
0021b564
JM
466#if defined (EXCEPTION_SECTION)
467 EXCEPTION_SECTION ();
468#else
6adb4e3a 469#ifdef ASM_OUTPUT_SECTION_NAME
ad4ff310 470 named_section (NULL_TREE, ".gcc_except_table", 0);
6adb4e3a
MS
471#else
472 if (flag_pic)
473 data_section ();
474 else
6adb4e3a
MS
475 readonly_data_section ();
476#endif
477#endif
478}
79e68feb
RS
479\f
480/* Create the rtl to represent a function, for a function definition.
481 DECL is a FUNCTION_DECL node which describes which function.
482 The rtl is stored into DECL. */
483
484void
485make_function_rtl (decl)
486 tree decl;
487{
488 char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
7c6d4120 489 char *new_name = name;
79e68feb
RS
490
491 /* Rename a nested function to avoid conflicts. */
492 if (decl_function_context (decl) != 0
493 && DECL_INITIAL (decl) != 0
494 && DECL_RTL (decl) == 0)
495 {
496 char *label;
497
498 name = IDENTIFIER_POINTER (DECL_NAME (decl));
499 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
500 name = obstack_copy0 (saveable_obstack, label, strlen (label));
501 var_labelno++;
502 }
7c6d4120
RK
503 else
504 {
505 /* When -fprefix-function-name is used, every function name is
506 prefixed. Even static functions are prefixed because they
507 could be declared latter. Note that a nested function name
508 is not prefixed. */
509 if (flag_prefix_function_name)
510 {
511 new_name = (char *) alloca (strlen (name) + CHKR_PREFIX_SIZE + 1);
512 strcpy (new_name, CHKR_PREFIX);
513 strcpy (new_name + CHKR_PREFIX_SIZE, name);
514 name = obstack_copy0 (saveable_obstack, new_name, strlen (new_name));
515 }
516 }
79e68feb
RS
517
518 if (DECL_RTL (decl) == 0)
519 {
520 DECL_RTL (decl)
38a448ca
RH
521 = gen_rtx_MEM (DECL_MODE (decl),
522 gen_rtx_SYMBOL_REF (Pmode, name));
79e68feb
RS
523
524 /* Optionally set flags or add text to the name to record information
525 such as that it is a function name. If the name is changed, the macro
8a425a05 526 ASM_OUTPUT_LABELREF will have to know how to strip this information. */
79e68feb
RS
527#ifdef ENCODE_SECTION_INFO
528 ENCODE_SECTION_INFO (decl);
d9525bec
BK
529#endif
530 }
531 else
532 {
533 /* ??? Another way to do this would be to do what halfpic.c does
534 and maintain a hashed table of such critters. */
535 /* ??? Another way to do this would be to pass a flag bit to
536 ENCODE_SECTION_INFO saying whether this is a new decl or not. */
537 /* Let the target reassign the RTL if it wants.
538 This is necessary, for example, when one machine specific
539 decl attribute overrides another. */
540#ifdef REDO_SECTION_INFO_P
541 if (REDO_SECTION_INFO_P (decl))
542 ENCODE_SECTION_INFO (decl);
79e68feb
RS
543#endif
544 }
545
546 /* Record at least one function has been defined. */
547 function_defined = 1;
548}
549
b4ac57ab
RS
550/* Given NAME, a putative register name, discard any customary prefixes. */
551
87e11268 552static const char *
b4ac57ab 553strip_reg_name (name)
87e11268 554 const char *name;
b4ac57ab
RS
555{
556#ifdef REGISTER_PREFIX
557 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
558 name += strlen (REGISTER_PREFIX);
559#endif
560 if (name[0] == '%' || name[0] == '#')
561 name++;
562 return name;
563}
dcfedcd0 564\f
79e68feb
RS
565/* Decode an `asm' spec for a declaration as a register name.
566 Return the register number, or -1 if nothing specified,
c09e6498
RS
567 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
568 or -3 if ASMSPEC is `cc' and is not recognized,
569 or -4 if ASMSPEC is `memory' and is not recognized.
dcfedcd0
RK
570 Accept an exact spelling or a decimal number.
571 Prefixes such as % are optional. */
79e68feb
RS
572
573int
574decode_reg_name (asmspec)
87e11268 575 const char *asmspec;
79e68feb
RS
576{
577 if (asmspec != 0)
578 {
579 int i;
580
b4ac57ab
RS
581 /* Get rid of confusing prefixes. */
582 asmspec = strip_reg_name (asmspec);
583
fff9e713
MT
584 /* Allow a decimal number as a "register name". */
585 for (i = strlen (asmspec) - 1; i >= 0; i--)
586 if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
587 break;
588 if (asmspec[0] != 0 && i < 0)
589 {
590 i = atoi (asmspec);
591 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
592 return i;
593 else
594 return -2;
595 }
596
79e68feb 597 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
b4ac57ab
RS
598 if (reg_names[i][0]
599 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
79e68feb
RS
600 return i;
601
79e68feb
RS
602#ifdef ADDITIONAL_REGISTER_NAMES
603 {
87e11268 604 static struct { const char *name; int number; } table[]
79e68feb
RS
605 = ADDITIONAL_REGISTER_NAMES;
606
c84e2712 607 for (i = 0; i < (int)(sizeof (table) / sizeof (table[0])); i++)
79e68feb
RS
608 if (! strcmp (asmspec, table[i].name))
609 return table[i].number;
79e68feb
RS
610 }
611#endif /* ADDITIONAL_REGISTER_NAMES */
612
c09e6498
RS
613 if (!strcmp (asmspec, "memory"))
614 return -4;
615
dcfedcd0
RK
616 if (!strcmp (asmspec, "cc"))
617 return -3;
618
79e68feb
RS
619 return -2;
620 }
621
622 return -1;
623}
624\f
625/* Create the DECL_RTL for a declaration for a static or external variable
626 or static or external function.
627 ASMSPEC, if not 0, is the string which the user specified
628 as the assembler symbol name.
629 TOP_LEVEL is nonzero if this is a file-scope variable.
630
631 This is never called for PARM_DECL nodes. */
632
633void
634make_decl_rtl (decl, asmspec, top_level)
635 tree decl;
87e11268 636 const char *asmspec;
79e68feb
RS
637 int top_level;
638{
0a5152d0 639 register char *name = 0;
ca695ac9
JB
640 int reg_number;
641
ca695ac9 642 reg_number = decode_reg_name (asmspec);
79e68feb
RS
643
644 if (DECL_ASSEMBLER_NAME (decl) != NULL_TREE)
645 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
646
647 if (reg_number == -2)
648 {
649 /* ASMSPEC is given, and not the name of a register. */
650 name = (char *) obstack_alloc (saveable_obstack,
651 strlen (asmspec) + 2);
652 name[0] = '*';
653 strcpy (&name[1], asmspec);
654 }
655
656 /* For a duplicate declaration, we can be called twice on the
ff8f4401
RS
657 same DECL node. Don't discard the RTL already made. */
658 if (DECL_RTL (decl) == 0)
79e68feb 659 {
79e68feb 660 /* First detect errors in declaring global registers. */
12266a61
RK
661 if (TREE_CODE (decl) != FUNCTION_DECL
662 && DECL_REGISTER (decl) && reg_number == -1)
79e68feb
RS
663 error_with_decl (decl,
664 "register name not specified for `%s'");
12266a61
RK
665 else if (TREE_CODE (decl) != FUNCTION_DECL
666 && DECL_REGISTER (decl) && reg_number < 0)
79e68feb
RS
667 error_with_decl (decl,
668 "invalid register name for `%s'");
12266a61
RK
669 else if ((reg_number >= 0 || reg_number == -3)
670 && (TREE_CODE (decl) == FUNCTION_DECL
671 && ! DECL_REGISTER (decl)))
79e68feb
RS
672 error_with_decl (decl,
673 "register name given for non-register variable `%s'");
12266a61
RK
674 else if (TREE_CODE (decl) != FUNCTION_DECL
675 && DECL_REGISTER (decl)
676 && TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
677 error_with_decl (decl,
678 "data type of `%s' isn't suitable for a register");
679 else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)
680 && ! HARD_REGNO_MODE_OK (reg_number,
681 TYPE_MODE (TREE_TYPE (decl))))
682 error_with_decl (decl,
683 "register number for `%s' isn't suitable for data type");
79e68feb 684 /* Now handle properly declared static register variables. */
12266a61 685 else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
79e68feb
RS
686 {
687 int nregs;
12266a61 688
79e68feb
RS
689 if (DECL_INITIAL (decl) != 0 && top_level)
690 {
691 DECL_INITIAL (decl) = 0;
692 error ("global register variable has initial value");
693 }
694 if (fixed_regs[reg_number] == 0
695 && function_defined && top_level)
696 error ("global register variable follows a function definition");
697 if (TREE_THIS_VOLATILE (decl))
698 warning ("volatile register variables don't work as you might wish");
31e4b1c0
RK
699
700 /* If the user specified one of the eliminables registers here,
701 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
702 confused with that register and be eliminated. Although this
703 usage is somewhat suspect, we nevertheless use the following
704 kludge to avoid setting DECL_RTL to frame_pointer_rtx. */
705
706 DECL_RTL (decl)
38a448ca 707 = gen_rtx_REG (DECL_MODE (decl), FIRST_PSEUDO_REGISTER);
31e4b1c0 708 REGNO (DECL_RTL (decl)) = reg_number;
79e68feb
RS
709 REG_USERVAR_P (DECL_RTL (decl)) = 1;
710
711 if (top_level)
712 {
ad800eb1
RK
713 /* Make this register global, so not usable for anything
714 else. */
79e68feb
RS
715 nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
716 while (nregs > 0)
ad800eb1 717 globalize_reg (reg_number + --nregs);
79e68feb
RS
718 }
719 }
0bcc6fc7
RK
720 /* Specifying a section attribute on a variable forces it into a
721 non-.bss section, and thus it cannot be common. */
8a425a05
DE
722 else if (TREE_CODE (decl) == VAR_DECL
723 && DECL_SECTION_NAME (decl) != NULL_TREE
4580042b 724 && DECL_INITIAL (decl) == NULL_TREE
d5160254 725 && DECL_COMMON (decl))
0bcc6fc7 726 DECL_COMMON (decl) = 0;
79e68feb
RS
727
728 /* Now handle ordinary static variables and functions (in memory).
729 Also handle vars declared register invalidly. */
730 if (DECL_RTL (decl) == 0)
731 {
732 /* Can't use just the variable's own name for a variable
733 whose scope is less than the whole file.
734 Concatenate a distinguishing number. */
61881daa 735 if (!top_level && !TREE_PUBLIC (decl) && asmspec == 0)
79e68feb
RS
736 {
737 char *label;
738
739 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
740 name = obstack_copy0 (saveable_obstack, label, strlen (label));
741 var_labelno++;
742 }
743
0a5152d0
RK
744 if (name == 0)
745 abort ();
746
7c6d4120
RK
747 /* When -fprefix-function-name is used, the functions
748 names are prefixed. Only nested function names are not
749 prefixed. */
750 if (flag_prefix_function_name && TREE_CODE (decl) == FUNCTION_DECL)
751 {
752 char *new_name;
753 new_name = (char *) alloca (strlen (name) + CHKR_PREFIX_SIZE
754 + 1);
755 strcpy (new_name, CHKR_PREFIX);
756 strcpy (new_name + CHKR_PREFIX_SIZE, name);
757 name = obstack_copy0 (saveable_obstack,
758 new_name, strlen (new_name));
759 }
760
38a448ca
RH
761 DECL_RTL (decl) = gen_rtx_MEM (DECL_MODE (decl),
762 gen_rtx_SYMBOL_REF (Pmode, name));
41472af8
MM
763 MEM_ALIAS_SET (DECL_RTL (decl)) = get_alias_set (decl);
764
3771b9b2
RK
765 /* If this variable is to be treated as volatile, show its
766 tree node has side effects. If it has side effects, either
767 because of this test or from TREE_THIS_VOLATILE also
768 being set, show the MEM is volatile. */
769 if (flag_volatile_global && TREE_CODE (decl) == VAR_DECL
770 && TREE_PUBLIC (decl))
771 TREE_SIDE_EFFECTS (decl) = 1;
772 if (TREE_SIDE_EFFECTS (decl))
79e68feb 773 MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
3771b9b2 774
79e68feb
RS
775 if (TREE_READONLY (decl))
776 RTX_UNCHANGING_P (DECL_RTL (decl)) = 1;
c6df88cb
MM
777 MEM_SET_IN_STRUCT_P (DECL_RTL (decl),
778 AGGREGATE_TYPE_P (TREE_TYPE (decl)));
79e68feb
RS
779
780 /* Optionally set flags or add text to the name to record information
781 such as that it is a function name.
782 If the name is changed, the macro ASM_OUTPUT_LABELREF
8a425a05 783 will have to know how to strip this information. */
79e68feb
RS
784#ifdef ENCODE_SECTION_INFO
785 ENCODE_SECTION_INFO (decl);
786#endif
787 }
788 }
d9525bec 789 else
ff8f4401 790 {
d9525bec
BK
791 /* If the old RTL had the wrong mode, fix the mode. */
792 if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
793 {
794 rtx rtl = DECL_RTL (decl);
795 PUT_MODE (rtl, DECL_MODE (decl));
796 }
797
798 /* ??? Another way to do this would be to do what halfpic.c does
799 and maintain a hashed table of such critters. */
800 /* ??? Another way to do this would be to pass a flag bit to
801 ENCODE_SECTION_INFO saying whether this is a new decl or not. */
802 /* Let the target reassign the RTL if it wants.
803 This is necessary, for example, when one machine specific
804 decl attribute overrides another. */
805#ifdef REDO_SECTION_INFO_P
806 if (REDO_SECTION_INFO_P (decl))
807 ENCODE_SECTION_INFO (decl);
808#endif
ff8f4401 809 }
79e68feb 810}
4724d87a
RS
811
812/* Make the rtl for variable VAR be volatile.
813 Use this only for static variables. */
814
fcbaecc6 815void
4724d87a
RS
816make_var_volatile (var)
817 tree var;
818{
819 if (GET_CODE (DECL_RTL (var)) != MEM)
820 abort ();
821
822 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
823}
79e68feb 824\f
d447ec6f
RS
825/* Output alignment directive to align for constant expression EXP. */
826
827void
828assemble_constant_align (exp)
829 tree exp;
830{
831 int align;
832
833 /* Align the location counter as required by EXP's data type. */
834 align = TYPE_ALIGN (TREE_TYPE (exp));
835#ifdef CONSTANT_ALIGNMENT
836 align = CONSTANT_ALIGNMENT (exp, align);
837#endif
838
839 if (align > BITS_PER_UNIT)
840 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
841}
842
79e68feb
RS
843/* Output a string of literal assembler code
844 for an `asm' keyword used between functions. */
845
846void
847assemble_asm (string)
848 tree string;
849{
850 app_enable ();
851
852 if (TREE_CODE (string) == ADDR_EXPR)
853 string = TREE_OPERAND (string, 0);
854
855 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
856}
857
9bb2e4fe
RS
858#if 0 /* This should no longer be needed, because
859 flag_gnu_linker should be 0 on these systems,
860 which should prevent any output
861 if ASM_OUTPUT_CONSTRUCTOR and ASM_OUTPUT_DESTRUCTOR are absent. */
79e68feb
RS
862#if !(defined(DBX_DEBUGGING_INFO) && !defined(FASCIST_ASSEMBLER))
863#ifndef ASM_OUTPUT_CONSTRUCTOR
864#define ASM_OUTPUT_CONSTRUCTOR(file, name)
865#endif
866#ifndef ASM_OUTPUT_DESTRUCTOR
867#define ASM_OUTPUT_DESTRUCTOR(file, name)
868#endif
869#endif
9bb2e4fe 870#endif /* 0 */
79e68feb
RS
871
872/* Record an element in the table of global destructors.
873 How this is done depends on what sort of assembler and linker
874 are in use.
875
876 NAME should be the name of a global function to be called
877 at exit time. This name is output using assemble_name. */
878
879void
880assemble_destructor (name)
881 char *name;
882{
883#ifdef ASM_OUTPUT_DESTRUCTOR
884 ASM_OUTPUT_DESTRUCTOR (asm_out_file, name);
885#else
886 if (flag_gnu_linker)
887 {
888 /* Now tell GNU LD that this is part of the static destructor set. */
889 /* This code works for any machine provided you use GNU as/ld. */
890 fprintf (asm_out_file, "%s \"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
891 assemble_name (asm_out_file, name);
892 fputc ('\n', asm_out_file);
893 }
894#endif
895}
896
897/* Likewise for global constructors. */
898
899void
900assemble_constructor (name)
901 char *name;
902{
903#ifdef ASM_OUTPUT_CONSTRUCTOR
904 ASM_OUTPUT_CONSTRUCTOR (asm_out_file, name);
905#else
906 if (flag_gnu_linker)
907 {
908 /* Now tell GNU LD that this is part of the static constructor set. */
909 /* This code works for any machine provided you use GNU as/ld. */
910 fprintf (asm_out_file, "%s \"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
911 assemble_name (asm_out_file, name);
912 fputc ('\n', asm_out_file);
913 }
914#endif
915}
916
917/* Likewise for entries we want to record for garbage collection.
918 Garbage collection is still under development. */
919
920void
921assemble_gc_entry (name)
922 char *name;
923{
924#ifdef ASM_OUTPUT_GC_ENTRY
925 ASM_OUTPUT_GC_ENTRY (asm_out_file, name);
926#else
927 if (flag_gnu_linker)
928 {
929 /* Now tell GNU LD that this is part of the static constructor set. */
930 fprintf (asm_out_file, "%s \"___PTR_LIST__\",22,0,0,", ASM_STABS_OP);
931 assemble_name (asm_out_file, name);
932 fputc ('\n', asm_out_file);
933 }
934#endif
935}
936\f
97adc6ed
ILT
937/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
938 a non-zero value if the constant pool should be output before the
939 start of the function, or a zero value if the pool should output
940 after the end of the function. The default is to put it before the
941 start. */
942
943#ifndef CONSTANT_POOL_BEFORE_FUNCTION
944#define CONSTANT_POOL_BEFORE_FUNCTION 1
945#endif
946
79e68feb
RS
947/* Output assembler code for the constant pool of a function and associated
948 with defining the name of the function. DECL describes the function.
949 NAME is the function's name. For the constant pool, we use the current
950 constant pool data. */
951
952void
953assemble_start_function (decl, fnname)
954 tree decl;
955 char *fnname;
956{
957 int align;
958
959 /* The following code does not need preprocessing in the assembler. */
960
961 app_disable ();
962
97adc6ed
ILT
963 if (CONSTANT_POOL_BEFORE_FUNCTION)
964 output_constant_pool (fnname, decl);
79e68feb 965
c30ac676
DE
966#ifdef ASM_OUTPUT_SECTION_NAME
967 /* If the function is to be put in its own section and it's not in a section
968 already, indicate so. */
ad4ff310
JM
969 if ((flag_function_sections
970 && DECL_SECTION_NAME (decl) == NULL_TREE)
971 || UNIQUE_SECTION_P (decl))
972 UNIQUE_SECTION (decl, 0);
c30ac676
DE
973#endif
974
4d1065ed 975 function_section (decl);
79e68feb
RS
976
977 /* Tell assembler to move to target machine's alignment for functions. */
978 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
979 if (align > 0)
b93a436e 980 ASM_OUTPUT_ALIGN (asm_out_file, align);
79e68feb
RS
981
982#ifdef ASM_OUTPUT_FUNCTION_PREFIX
983 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
984#endif
985
986#ifdef SDB_DEBUGGING_INFO
987 /* Output SDB definition of the function. */
988 if (write_symbols == SDB_DEBUG)
989 sdbout_mark_begin_function ();
990#endif
991
992#ifdef DBX_DEBUGGING_INFO
e5c90c23 993 /* Output DBX definition of the function. */
79e68feb 994 if (write_symbols == DBX_DEBUG)
e5c90c23 995 dbxout_begin_function (decl);
79e68feb
RS
996#endif
997
998 /* Make function name accessible from other files, if appropriate. */
999
1000 if (TREE_PUBLIC (decl))
1001 {
ee830309 1002 if (! first_global_object_name)
06bb02f7
RK
1003 {
1004 char *p;
ee830309
JM
1005 char **name;
1006
1007 if (! DECL_WEAK (decl) && ! DECL_ONE_ONLY (decl))
1008 name = &first_global_object_name;
1009 else
1010 name = &weak_global_object_name;
06bb02f7
RK
1011
1012 STRIP_NAME_ENCODING (p, fnname);
ee830309
JM
1013 *name = permalloc (strlen (p) + 1);
1014 strcpy (*name, p);
06bb02f7
RK
1015 }
1016
daefd78b
JM
1017#ifdef ASM_WEAKEN_LABEL
1018 if (DECL_WEAK (decl))
1019 ASM_WEAKEN_LABEL (asm_out_file, fnname);
48ad5afd 1020 else
daefd78b 1021#endif
48ad5afd 1022 ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
79e68feb
RS
1023 }
1024
1025 /* Do any machine/system dependent processing of the function name */
8bd16853 1026#ifdef ASM_DECLARE_FUNCTION_NAME
b93a436e 1027 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
8bd16853 1028#else
b93a436e
JL
1029 /* Standard thing is just output label for the function. */
1030 ASM_OUTPUT_LABEL (asm_out_file, fnname);
79e68feb
RS
1031#endif /* ASM_DECLARE_FUNCTION_NAME */
1032}
1033
1034/* Output assembler code associated with defining the size of the
1035 function. DECL describes the function. NAME is the function's name. */
1036
1037void
1038assemble_end_function (decl, fnname)
1039 tree decl;
1040 char *fnname;
1041{
1042#ifdef ASM_DECLARE_FUNCTION_SIZE
1043 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1044#endif
97adc6ed 1045 if (! CONSTANT_POOL_BEFORE_FUNCTION)
83488369
RK
1046 {
1047 output_constant_pool (fnname, decl);
1048 function_section (decl); /* need to switch back */
1049 }
8839fca4
ILT
1050
1051 /* Output any constants which should appear after the function. */
1052 output_after_function_constants ();
79e68feb
RS
1053}
1054\f
1055/* Assemble code to leave SIZE bytes of zeros. */
1056
1057void
1058assemble_zeros (size)
1059 int size;
1060{
1061#ifdef ASM_NO_SKIP_IN_TEXT
1062 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1063 so we must output 0s explicitly in the text section. */
1064 if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
1065 {
1066 int i;
1067
1068 for (i = 0; i < size - 20; i += 20)
1069 {
1070#ifdef ASM_BYTE_OP
1071 fprintf (asm_out_file,
1072 "%s 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n", ASM_BYTE_OP);
1073#else
1074 fprintf (asm_out_file,
1075 "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n");
1076#endif
1077 }
1078 if (i < size)
1079 {
1080#ifdef ASM_BYTE_OP
1081 fprintf (asm_out_file, "%s 0", ASM_BYTE_OP);
1082#else
1083 fprintf (asm_out_file, "\tbyte 0");
1084#endif
1085 i++;
1086 for (; i < size; i++)
1087 fprintf (asm_out_file, ",0");
1088 fprintf (asm_out_file, "\n");
1089 }
1090 }
1091 else
1092#endif
41fe4d9e 1093 if (size > 0)
b93a436e 1094 ASM_OUTPUT_SKIP (asm_out_file, size);
79e68feb
RS
1095}
1096
a785e67e
RS
1097/* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1098
1099void
1100assemble_align (align)
1101 int align;
1102{
1103 if (align > BITS_PER_UNIT)
1104 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1105}
1106
79e68feb
RS
1107/* Assemble a string constant with the specified C string as contents. */
1108
1109void
1110assemble_string (p, size)
fcbaecc6 1111 char *p;
79e68feb
RS
1112 int size;
1113{
79e68feb
RS
1114 int pos = 0;
1115 int maximum = 2000;
1116
1117 /* If the string is very long, split it up. */
1118
1119 while (pos < size)
1120 {
1121 int thissize = size - pos;
1122 if (thissize > maximum)
1123 thissize = maximum;
1124
b93a436e 1125 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
79e68feb
RS
1126
1127 pos += thissize;
1128 p += thissize;
1129 }
1130}
69249c1b 1131
79e68feb
RS
1132\f
1133/* Assemble everything that is needed for a variable or function declaration.
1134 Not used for automatic variables, and not used for function definitions.
1135 Should not be called for variables of incomplete structure type.
1136
1137 TOP_LEVEL is nonzero if this variable has file scope.
1138 AT_END is nonzero if this is the special handling, at end of compilation,
ff8f4401
RS
1139 to define things that have had only tentative definitions.
1140 DONT_OUTPUT_DATA if nonzero means don't actually output the
1141 initial value (that will be done by the caller). */
79e68feb
RS
1142
1143void
ff8f4401 1144assemble_variable (decl, top_level, at_end, dont_output_data)
79e68feb 1145 tree decl;
c84e2712 1146 int top_level ATTRIBUTE_UNUSED;
79e68feb 1147 int at_end;
5a13eaa4 1148 int dont_output_data;
79e68feb
RS
1149{
1150 register char *name;
f8344bea 1151 unsigned int align;
79e68feb
RS
1152 tree size_tree;
1153 int reloc = 0;
edbc355b 1154 enum in_section saved_in_section;
79e68feb 1155
cbed4565
RS
1156 last_assemble_variable_decl = 0;
1157
79e68feb
RS
1158 if (GET_CODE (DECL_RTL (decl)) == REG)
1159 {
1160 /* Do output symbol info for global register variables, but do nothing
1161 else for them. */
1162
1163 if (TREE_ASM_WRITTEN (decl))
1164 return;
1165 TREE_ASM_WRITTEN (decl) = 1;
1166
b4ac57ab 1167#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
b93a436e
JL
1168 /* File-scope global variables are output here. */
1169 if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
1170 && top_level)
1171 dbxout_symbol (decl, 0);
79e68feb
RS
1172#endif
1173#ifdef SDB_DEBUGGING_INFO
b93a436e
JL
1174 if (write_symbols == SDB_DEBUG && top_level
1175 /* Leave initialized global vars for end of compilation;
1176 see comment in compile_file. */
1177 && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1178 sdbout_symbol (decl, 0);
79e68feb
RS
1179#endif
1180
a94dbf2c
JM
1181 /* Don't output any DWARF debugging information for variables here.
1182 In the case of local variables, the information for them is output
1183 when we do our recursive traversal of the tree representation for
1184 the entire containing function. In the case of file-scope variables,
1185 we output information for all of them at the very end of compilation
1186 while we are doing our final traversal of the chain of file-scope
1187 declarations. */
79e68feb
RS
1188
1189 return;
1190 }
1191
d36d70cc 1192 /* Normally no need to say anything here for external references,
9faa82d8 1193 since assemble_external is called by the language-specific code
d36d70cc 1194 when a declaration is first seen. */
79e68feb 1195
44fe2e80 1196 if (DECL_EXTERNAL (decl))
79e68feb
RS
1197 return;
1198
1199 /* Output no assembler code for a function declaration.
1200 Only definitions of functions output anything. */
1201
1202 if (TREE_CODE (decl) == FUNCTION_DECL)
1203 return;
1204
1205 /* If type was incomplete when the variable was declared,
1206 see if it is complete now. */
1207
1208 if (DECL_SIZE (decl) == 0)
1209 layout_decl (decl, 0);
1210
1211 /* Still incomplete => don't allocate it; treat the tentative defn
1212 (which is what it must have been) as an `extern' reference. */
1213
ff8f4401 1214 if (!dont_output_data && DECL_SIZE (decl) == 0)
79e68feb
RS
1215 {
1216 error_with_file_and_line (DECL_SOURCE_FILE (decl),
1217 DECL_SOURCE_LINE (decl),
ea80ee44 1218 "storage size of `%s' isn't known",
79e68feb 1219 IDENTIFIER_POINTER (DECL_NAME (decl)));
1c1a7ba4 1220 TREE_ASM_WRITTEN (decl) = 1;
79e68feb
RS
1221 return;
1222 }
1223
1224 /* The first declaration of a variable that comes through this function
1225 decides whether it is global (in C, has external linkage)
1226 or local (in C, has internal linkage). So do nothing more
1227 if this function has already run. */
1228
1229 if (TREE_ASM_WRITTEN (decl))
1230 return;
1231
1232 TREE_ASM_WRITTEN (decl) = 1;
1233
809d6575 1234 app_disable ();
79e68feb 1235
809d6575 1236 if (! dont_output_data)
ff8f4401 1237 {
506711af
RK
1238 int size;
1239
ff8f4401
RS
1240 if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
1241 goto finish;
79e68feb 1242
ff8f4401
RS
1243 /* This is better than explicit arithmetic, since it avoids overflow. */
1244 size_tree = size_binop (CEIL_DIV_EXPR,
0189a68a 1245 DECL_SIZE (decl), size_int (BITS_PER_UNIT));
79e68feb 1246
506711af
RK
1247 size = TREE_INT_CST_LOW (size_tree);
1248 if (TREE_INT_CST_HIGH (size_tree) != 0
1249 || size != TREE_INT_CST_LOW (size_tree))
ff8f4401
RS
1250 {
1251 error_with_decl (decl, "size of variable `%s' is too large");
1252 goto finish;
1253 }
79e68feb
RS
1254 }
1255
1256 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
1257
f796d997
JM
1258 if (TREE_PUBLIC (decl) && DECL_NAME (decl)
1259 && ! first_global_object_name
1260 && ! (DECL_COMMON (decl) && (DECL_INITIAL (decl) == 0
1261 || DECL_INITIAL (decl) == error_mark_node))
1262 && ! DECL_WEAK (decl)
1263 && ! DECL_ONE_ONLY (decl))
1264 {
1265 char *p;
1266
1267 STRIP_NAME_ENCODING (p, name);
1268 first_global_object_name = permalloc (strlen (p) + 1);
1269 strcpy (first_global_object_name, p);
1270 }
1271
8a198bd2
JW
1272 /* Compute the alignment of this data. */
1273
1274 align = DECL_ALIGN (decl);
1275
1276 /* In the case for initialing an array whose length isn't specified,
1277 where we have not yet been able to do the layout,
1278 figure out the proper alignment now. */
1279 if (dont_output_data && DECL_SIZE (decl) == 0
1280 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1281 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1282
1283 /* Some object file formats have a maximum alignment which they support.
1284 In particular, a.out format supports a maximum alignment of 4. */
1285#ifndef MAX_OFILE_ALIGNMENT
1286#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
1287#endif
1288 if (align > MAX_OFILE_ALIGNMENT)
1289 {
1290 warning_with_decl (decl,
44ec7e59
CM
1291 "alignment of `%s' is greater than maximum object file alignment. Using %d.",
1292 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
8a198bd2
JW
1293 align = MAX_OFILE_ALIGNMENT;
1294 }
1295
1296 /* On some machines, it is good to increase alignment sometimes. */
1297#ifdef DATA_ALIGNMENT
1298 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1299#endif
1300#ifdef CONSTANT_ALIGNMENT
1301 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1302 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1303#endif
1304
1305 /* Reset the alignment in case we have made it tighter, so we can benefit
1306 from it in get_pointer_alignment. */
1307 DECL_ALIGN (decl) = align;
1308
79e68feb
RS
1309 /* Handle uninitialized definitions. */
1310
e5887033
DE
1311 if ((DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node)
1312 /* If the target can't output uninitialized but not common global data
1313 in .bss, then we have to use .data. */
1314#if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS)
cd98bf12 1315 && DECL_COMMON (decl)
e5887033
DE
1316#endif
1317 && ! dont_output_data)
79e68feb
RS
1318 {
1319 int size = TREE_INT_CST_LOW (size_tree);
1320 int rounded = size;
1321
79e68feb
RS
1322 /* Don't allocate zero bytes of common,
1323 since that means "undefined external" in the linker. */
1324 if (size == 0) rounded = 1;
1325 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1326 so that each uninitialized object starts on such a boundary. */
1327 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1328 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1329 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
4bcfa7a8
CM
1330
1331#if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
83de03df 1332 if ( (DECL_ALIGN (decl) / BITS_PER_UNIT) > rounded)
4bcfa7a8
CM
1333 warning_with_decl
1334 (decl, "requested alignment for %s is greater than implemented alignment of %d.",rounded);
1335#endif
1336
edbc355b
RS
1337#ifdef DBX_DEBUGGING_INFO
1338 /* File-scope global variables are output here. */
1339 if (write_symbols == DBX_DEBUG && top_level)
1340 dbxout_symbol (decl, 0);
1341#endif
1342#ifdef SDB_DEBUGGING_INFO
1343 if (write_symbols == SDB_DEBUG && top_level
1344 /* Leave initialized global vars for end of compilation;
1345 see comment in compile_file. */
1346 && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1347 sdbout_symbol (decl, 0);
1348#endif
1349
a94dbf2c
JM
1350 /* Don't output any DWARF debugging information for variables here.
1351 In the case of local variables, the information for them is output
1352 when we do our recursive traversal of the tree representation for
1353 the entire containing function. In the case of file-scope variables,
1354 we output information for all of them at the very end of compilation
1355 while we are doing our final traversal of the chain of file-scope
1356 declarations. */
edbc355b 1357
e5887033
DE
1358#if 0 /* ??? We should either delete this or add a comment describing what
1359 it was intended to do and why we shouldn't delete it. */
79e68feb
RS
1360 if (flag_shared_data)
1361 data_section ();
1362#endif
e5887033
DE
1363
1364 if (TREE_PUBLIC (decl)
1365#if defined (ASM_OUTPUT_BSS) || defined (ASM_OUTPUT_ALIGNED_BSS)
1366 && DECL_COMMON (decl)
e5887033
DE
1367#endif
1368 )
79e68feb
RS
1369 {
1370#ifdef ASM_OUTPUT_SHARED_COMMON
1371 if (flag_shared_data)
1372 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1373 else
1374#endif
ca695ac9 1375 {
e9a25f70
JL
1376#ifdef ASM_OUTPUT_ALIGNED_DECL_COMMON
1377 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size,
1378 DECL_ALIGN (decl));
1379#else
79e68feb 1380#ifdef ASM_OUTPUT_ALIGNED_COMMON
ca695ac9
JB
1381 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
1382 DECL_ALIGN (decl));
79e68feb 1383#else
ca695ac9 1384 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
e9a25f70 1385#endif
79e68feb 1386#endif
ca695ac9 1387 }
79e68feb 1388 }
e5887033
DE
1389#if defined (ASM_OUTPUT_BSS) || defined (ASM_OUTPUT_ALIGNED_BSS)
1390 else if (TREE_PUBLIC (decl))
1391 {
1392#ifdef ASM_OUTPUT_SHARED_BSS
1393 if (flag_shared_data)
91fddd7c 1394 ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
e5887033
DE
1395 else
1396#endif
e5887033
DE
1397 {
1398#ifdef ASM_OUTPUT_ALIGNED_BSS
91fddd7c 1399 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size,
e5887033
DE
1400 DECL_ALIGN (decl));
1401#else
91fddd7c 1402 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded);
e5887033
DE
1403#endif
1404 }
1405 }
1406#endif /* ASM_OUTPUT_BSS || ASM_OUTPUT_ALIGNED_BSS */
79e68feb
RS
1407 else
1408 {
1409#ifdef ASM_OUTPUT_SHARED_LOCAL
1410 if (flag_shared_data)
1411 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1412 else
1413#endif
ca695ac9 1414 {
e9a25f70
JL
1415#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1416 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size,
1417 DECL_ALIGN (decl));
1418#else
79e68feb 1419#ifdef ASM_OUTPUT_ALIGNED_LOCAL
ca695ac9
JB
1420 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size,
1421 DECL_ALIGN (decl));
79e68feb 1422#else
ca695ac9 1423 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
e9a25f70 1424#endif
79e68feb 1425#endif
ca695ac9 1426 }
79e68feb 1427 }
b4ac57ab 1428 goto finish;
79e68feb
RS
1429 }
1430
e5887033
DE
1431 /* Handle initialized definitions.
1432 Also handle uninitialized global definitions if -fno-common and the
1433 target doesn't support ASM_OUTPUT_BSS. */
79e68feb
RS
1434
1435 /* First make the assembler name(s) global if appropriate. */
1436 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1437 {
daefd78b
JM
1438#ifdef ASM_WEAKEN_LABEL
1439 if (DECL_WEAK (decl))
1440 ASM_WEAKEN_LABEL (asm_out_file, name);
48ad5afd 1441 else
daefd78b 1442#endif
48ad5afd 1443 ASM_GLOBALIZE_LABEL (asm_out_file, name);
79e68feb
RS
1444 }
1445#if 0
1446 for (d = equivalents; d; d = TREE_CHAIN (d))
1447 {
1448 tree e = TREE_VALUE (d);
1449 if (TREE_PUBLIC (e) && DECL_NAME (e))
1450 ASM_GLOBALIZE_LABEL (asm_out_file,
1451 XSTR (XEXP (DECL_RTL (e), 0), 0));
1452 }
1453#endif
1454
1455 /* Output any data that we will need to use the address of. */
2e9effae
RS
1456 if (DECL_INITIAL (decl) == error_mark_node)
1457 reloc = contains_pointers_p (TREE_TYPE (decl));
1458 else if (DECL_INITIAL (decl))
79e68feb
RS
1459 reloc = output_addressed_constants (DECL_INITIAL (decl));
1460
ad4ff310 1461#ifdef ASM_OUTPUT_SECTION_NAME
7d0756fb
CM
1462 if ((flag_data_sections != 0
1463 && DECL_SECTION_NAME (decl) == NULL_TREE)
1464 || UNIQUE_SECTION_P (decl))
ad4ff310
JM
1465 UNIQUE_SECTION (decl, reloc);
1466#endif
1467
f9da1f35
DE
1468 /* Switch to the appropriate section. */
1469 variable_section (decl, reloc);
79e68feb 1470
a8e2f179
RS
1471 /* dbxout.c needs to know this. */
1472 if (in_text_section ())
1473 DECL_IN_TEXT_SECTION (decl) = 1;
1474
edbc355b
RS
1475 /* Record current section so we can restore it if dbxout.c clobbers it. */
1476 saved_in_section = in_section;
1477
1478 /* Output the dbx info now that we have chosen the section. */
1479
1480#ifdef DBX_DEBUGGING_INFO
1481 /* File-scope global variables are output here. */
1482 if (write_symbols == DBX_DEBUG && top_level)
1483 dbxout_symbol (decl, 0);
1484#endif
1485#ifdef SDB_DEBUGGING_INFO
1486 if (write_symbols == SDB_DEBUG && top_level
1487 /* Leave initialized global vars for end of compilation;
1488 see comment in compile_file. */
1489 && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1490 sdbout_symbol (decl, 0);
1491#endif
1492
1493 /* Don't output any DWARF debugging information for variables here.
1494 In the case of local variables, the information for them is output
1495 when we do our recursive traversal of the tree representation for
1496 the entire containing function. In the case of file-scope variables,
1497 we output information for all of them at the very end of compilation
1498 while we are doing our final traversal of the chain of file-scope
1499 declarations. */
1500
a8e2f179
RS
1501 /* If the debugging output changed sections, reselect the section
1502 that's supposed to be selected. */
edbc355b 1503 if (in_section != saved_in_section)
f9da1f35 1504 variable_section (decl, reloc);
edbc355b 1505
8a198bd2 1506 /* Output the alignment of this data. */
79e68feb 1507 if (align > BITS_PER_UNIT)
8a198bd2
JW
1508 ASM_OUTPUT_ALIGN (asm_out_file,
1509 floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT));
79e68feb
RS
1510
1511 /* Do any machine/system dependent processing of the object. */
8bd16853 1512#ifdef ASM_DECLARE_OBJECT_NAME
b93a436e
JL
1513 last_assemble_variable_decl = decl;
1514 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
8bd16853 1515#else
b93a436e
JL
1516 /* Standard thing is just output label for the object. */
1517 ASM_OUTPUT_LABEL (asm_out_file, name);
79e68feb
RS
1518#endif /* ASM_DECLARE_OBJECT_NAME */
1519
ff8f4401 1520 if (!dont_output_data)
79e68feb 1521 {
ff8f4401
RS
1522 if (DECL_INITIAL (decl))
1523 /* Output the actual data. */
809d6575 1524 output_constant (DECL_INITIAL (decl), TREE_INT_CST_LOW (size_tree));
ff8f4401
RS
1525 else
1526 /* Leave space for it. */
809d6575 1527 assemble_zeros (TREE_INT_CST_LOW (size_tree));
79e68feb 1528 }
b4ac57ab
RS
1529
1530 finish:
1531#ifdef XCOFF_DEBUGGING_INFO
1532 /* Unfortunately, the IBM assembler cannot handle stabx before the actual
1533 declaration. When something like ".stabx "aa:S-2",aa,133,0" is emitted
1534 and `aa' hasn't been output yet, the assembler generates a stab entry with
1535 a value of zero, in addition to creating an unnecessary external entry
6dc42e49 1536 for `aa'. Hence, we must postpone dbxout_symbol to here at the end. */
b4ac57ab
RS
1537
1538 /* File-scope global variables are output here. */
1539 if (write_symbols == XCOFF_DEBUG && top_level)
05be4cea
JW
1540 {
1541 saved_in_section = in_section;
1542
1543 dbxout_symbol (decl, 0);
1544
1545 if (in_section != saved_in_section)
f9da1f35 1546 variable_section (decl, reloc);
05be4cea 1547 }
b4ac57ab
RS
1548#else
1549 /* There must be a statement after a label. */
1550 ;
1551#endif
79e68feb
RS
1552}
1553
2e9effae
RS
1554/* Return 1 if type TYPE contains any pointers. */
1555
1556static int
1557contains_pointers_p (type)
1558 tree type;
1559{
1560 switch (TREE_CODE (type))
1561 {
1562 case POINTER_TYPE:
1563 case REFERENCE_TYPE:
1564 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1565 so I'll play safe and return 1. */
1566 case OFFSET_TYPE:
1567 return 1;
1568
1569 case RECORD_TYPE:
1570 case UNION_TYPE:
1571 case QUAL_UNION_TYPE:
1572 {
1573 tree fields;
1574 /* For a type that has fields, see if the fields have pointers. */
1575 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
ce49ea8a
JM
1576 if (TREE_CODE (fields) == FIELD_DECL
1577 && contains_pointers_p (TREE_TYPE (fields)))
2e9effae
RS
1578 return 1;
1579 return 0;
1580 }
1581
1582 case ARRAY_TYPE:
1583 /* An array type contains pointers if its element type does. */
1584 return contains_pointers_p (TREE_TYPE (type));
1585
1586 default:
1587 return 0;
1588 }
1589}
1590
79e68feb 1591/* Output something to declare an external symbol to the assembler.
fff9e713
MT
1592 (Most assemblers don't need this, so we normally output nothing.)
1593 Do nothing if DECL is not external. */
79e68feb
RS
1594
1595void
1596assemble_external (decl)
1597 tree decl;
1598{
79e68feb 1599#ifdef ASM_OUTPUT_EXTERNAL
fff9e713 1600 if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
44fe2e80 1601 && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
79e68feb 1602 {
fff9e713
MT
1603 rtx rtl = DECL_RTL (decl);
1604
1605 if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1606 && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
1607 {
1608 /* Some systems do require some output. */
1609 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1610 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1611 }
79e68feb
RS
1612 }
1613#endif
1614}
1615
1616/* Similar, for calling a library function FUN. */
1617
1618void
1619assemble_external_libcall (fun)
c84e2712 1620 rtx fun ATTRIBUTE_UNUSED;
79e68feb
RS
1621{
1622#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
b93a436e
JL
1623 /* Declare library function name external when first used, if nec. */
1624 if (! SYMBOL_REF_USED (fun))
79e68feb 1625 {
b93a436e
JL
1626 SYMBOL_REF_USED (fun) = 1;
1627 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
79e68feb
RS
1628 }
1629#endif
1630}
1631
1632/* Declare the label NAME global. */
1633
1634void
1635assemble_global (name)
1636 char *name;
1637{
1638 ASM_GLOBALIZE_LABEL (asm_out_file, name);
1639}
1640
1641/* Assemble a label named NAME. */
1642
1643void
1644assemble_label (name)
1645 char *name;
1646{
b93a436e 1647 ASM_OUTPUT_LABEL (asm_out_file, name);
79e68feb
RS
1648}
1649
1650/* Output to FILE a reference to the assembler name of a C-level name NAME.
1651 If NAME starts with a *, the rest of NAME is output verbatim.
1652 Otherwise NAME is transformed in an implementation-defined way
1653 (usually by the addition of an underscore).
1654 Many macros in the tm file are defined to call this function. */
1655
1656void
1657assemble_name (file, name)
1658 FILE *file;
1659 char *name;
1660{
648fb7cf 1661 char *real_name;
a94dbf2c 1662 tree id;
648fb7cf
RK
1663
1664 STRIP_NAME_ENCODING (real_name, name);
7c6d4120
RK
1665 if (flag_prefix_function_name
1666 && ! bcmp (real_name, CHKR_PREFIX, CHKR_PREFIX_SIZE))
1667 real_name = real_name + CHKR_PREFIX_SIZE;
87907387 1668
a94dbf2c
JM
1669 id = maybe_get_identifier (real_name);
1670 if (id)
1671 TREE_SYMBOL_REFERENCED (id) = 1;
03e42132 1672
79e68feb 1673 if (name[0] == '*')
b93a436e 1674 fputs (&name[1], file);
79e68feb 1675 else
b93a436e 1676 ASM_OUTPUT_LABELREF (file, name);
79e68feb
RS
1677}
1678
1679/* Allocate SIZE bytes writable static space with a gensym name
1680 and return an RTX to refer to its address. */
1681
1682rtx
1683assemble_static_space (size)
1684 int size;
1685{
1686 char name[12];
1687 char *namestring;
1688 rtx x;
79e68feb
RS
1689
1690#if 0
1691 if (flag_shared_data)
1692 data_section ();
1693#endif
1694
1695 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1696 ++const_labelno;
1697
1698 namestring = (char *) obstack_alloc (saveable_obstack,
1699 strlen (name) + 2);
1700 strcpy (namestring, name);
1701
b93a436e 1702 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
ca695ac9 1703
e9a25f70 1704#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
b93a436e
JL
1705 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1706 BIGGEST_ALIGNMENT);
e9a25f70 1707#else
79e68feb 1708#ifdef ASM_OUTPUT_ALIGNED_LOCAL
b93a436e 1709 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
79e68feb 1710#else
e016950d
KG
1711 {
1712 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1713 so that each uninitialized object starts on such a boundary. */
47c3ed98
KG
1714 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
1715 int rounded ATTRIBUTE_UNUSED
1716 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1717 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1718 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
e016950d
KG
1719 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1720 }
e9a25f70 1721#endif
79e68feb
RS
1722#endif
1723 return x;
1724}
1725
1726/* Assemble the static constant template for function entry trampolines.
1727 This is done at most once per compilation.
1728 Returns an RTX for the address of the template. */
1729
f0e969bd 1730#ifdef TRAMPOLINE_TEMPLATE
79e68feb
RS
1731rtx
1732assemble_trampoline_template ()
1733{
1734 char label[256];
1735 char *name;
1736 int align;
1737
37552631 1738 /* By default, put trampoline templates in read-only data section. */
f49acdb4 1739
37552631
RS
1740#ifdef TRAMPOLINE_SECTION
1741 TRAMPOLINE_SECTION ();
1742#else
c8c29f85 1743 readonly_data_section ();
37552631 1744#endif
f49acdb4 1745
79e68feb 1746 /* Write the assembler code to define one. */
073b0524 1747 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
79e68feb
RS
1748 if (align > 0)
1749 ASM_OUTPUT_ALIGN (asm_out_file, align);
1750
1751 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1752 TRAMPOLINE_TEMPLATE (asm_out_file);
1753
1754 /* Record the rtl to refer to it. */
1755 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1756 name
1757 = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
38a448ca 1758 return gen_rtx_SYMBOL_REF (Pmode, name);
79e68feb 1759}
f0e969bd 1760#endif
79e68feb
RS
1761\f
1762/* Assemble the integer constant X into an object of SIZE bytes.
1763 X must be either a CONST_INT or CONST_DOUBLE.
1764
1765 Return 1 if we were able to output the constant, otherwise 0. If FORCE is
1766 non-zero, abort if we can't output the constant. */
1767
1768int
1769assemble_integer (x, size, force)
1770 rtx x;
1771 int size;
1772 int force;
1773{
1774 /* First try to use the standard 1, 2, 4, 8, and 16 byte
0f41302f 1775 ASM_OUTPUT... macros. */
79e68feb
RS
1776
1777 switch (size)
1778 {
1779#ifdef ASM_OUTPUT_CHAR
1780 case 1:
1781 ASM_OUTPUT_CHAR (asm_out_file, x);
1782 return 1;
1783#endif
1784
1785#ifdef ASM_OUTPUT_SHORT
1786 case 2:
1787 ASM_OUTPUT_SHORT (asm_out_file, x);
1788 return 1;
1789#endif
1790
1791#ifdef ASM_OUTPUT_INT
1792 case 4:
1793 ASM_OUTPUT_INT (asm_out_file, x);
1794 return 1;
1795#endif
1796
1797#ifdef ASM_OUTPUT_DOUBLE_INT
1798 case 8:
1799 ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1800 return 1;
1801#endif
1802
1803#ifdef ASM_OUTPUT_QUADRUPLE_INT
1804 case 16:
1805 ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1806 return 1;
1807#endif
1808 }
1809
1810 /* If we couldn't do it that way, there are two other possibilities: First,
1811 if the machine can output an explicit byte and this is a 1 byte constant,
1812 we can use ASM_OUTPUT_BYTE. */
1813
1814#ifdef ASM_OUTPUT_BYTE
1815 if (size == 1 && GET_CODE (x) == CONST_INT)
1816 {
1817 ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1818 return 1;
1819 }
1820#endif
1821
1822 /* Finally, if SIZE is larger than a single word, try to output the constant
1823 one word at a time. */
1824
1825 if (size > UNITS_PER_WORD)
1826 {
1827 int i;
1828 enum machine_mode mode
1829 = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1830 rtx word;
1831
1832 for (i = 0; i < size / UNITS_PER_WORD; i++)
1833 {
1834 word = operand_subword (x, i, 0, mode);
1835
1836 if (word == 0)
1837 break;
1838
fff9e713
MT
1839 if (! assemble_integer (word, UNITS_PER_WORD, 0))
1840 break;
79e68feb
RS
1841 }
1842
1843 if (i == size / UNITS_PER_WORD)
1844 return 1;
fff9e713
MT
1845 /* If we output at least one word and then could not finish,
1846 there is no valid way to continue. */
1847 if (i > 0)
1848 abort ();
79e68feb
RS
1849 }
1850
1851 if (force)
1852 abort ();
1853
1854 return 0;
1855}
1856\f
1857/* Assemble the floating-point constant D into an object of size MODE. */
1858
1859void
1860assemble_real (d, mode)
1861 REAL_VALUE_TYPE d;
1862 enum machine_mode mode;
1863{
1864 jmp_buf output_constant_handler;
1865
1866 if (setjmp (output_constant_handler))
1867 {
1868 error ("floating point trap outputting a constant");
1869#ifdef REAL_IS_NOT_DOUBLE
4c9a05bc 1870 bzero ((char *) &d, sizeof d);
79e68feb
RS
1871 d = dconst0;
1872#else
1873 d = 0;
1874#endif
1875 }
1876
1877 set_float_handler (output_constant_handler);
1878
1879 switch (mode)
1880 {
b7526ea5
RS
1881#ifdef ASM_OUTPUT_BYTE_FLOAT
1882 case QFmode:
1883 ASM_OUTPUT_BYTE_FLOAT (asm_out_file, d);
1884 break;
1885#endif
1886#ifdef ASM_OUTPUT_SHORT_FLOAT
1887 case HFmode:
1888 ASM_OUTPUT_SHORT_FLOAT (asm_out_file, d);
1889 break;
1890#endif
32c03bfb
RK
1891#ifdef ASM_OUTPUT_THREE_QUARTER_FLOAT
1892 case TQFmode:
1893 ASM_OUTPUT_THREE_QUARTER_FLOAT (asm_out_file, d);
1894 break;
1895#endif
79e68feb
RS
1896#ifdef ASM_OUTPUT_FLOAT
1897 case SFmode:
1898 ASM_OUTPUT_FLOAT (asm_out_file, d);
1899 break;
1900#endif
1901
1902#ifdef ASM_OUTPUT_DOUBLE
1903 case DFmode:
1904 ASM_OUTPUT_DOUBLE (asm_out_file, d);
1905 break;
1906#endif
1907
1908#ifdef ASM_OUTPUT_LONG_DOUBLE
2c7ff63c 1909 case XFmode:
79e68feb
RS
1910 case TFmode:
1911 ASM_OUTPUT_LONG_DOUBLE (asm_out_file, d);
1912 break;
1913#endif
1914
1915 default:
1916 abort ();
1917 }
1918
37366632 1919 set_float_handler (NULL_PTR);
79e68feb
RS
1920}
1921\f
1922/* Here we combine duplicate floating constants to make
1923 CONST_DOUBLE rtx's, and force those out to memory when necessary. */
1924
1925/* Chain of all CONST_DOUBLE rtx's constructed for the current function.
1926 They are chained through the CONST_DOUBLE_CHAIN.
1927 A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
1928 In that case, CONST_DOUBLE_MEM is either a MEM,
57632c51
RS
1929 or const0_rtx if no MEM has been made for this CONST_DOUBLE yet.
1930
1931 (CONST_DOUBLE_MEM is used only for top-level functions.
1932 See force_const_mem for explanation.) */
79e68feb
RS
1933
1934static rtx const_double_chain;
1935
4db92e9a 1936/* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair of ints.
79e68feb
RS
1937 For an integer, I0 is the low-order word and I1 is the high-order word.
1938 For a real number, I0 is the word with the low address
1939 and I1 is the word with the high address. */
1940
1941rtx
1942immed_double_const (i0, i1, mode)
37366632 1943 HOST_WIDE_INT i0, i1;
79e68feb
RS
1944 enum machine_mode mode;
1945{
1946 register rtx r;
79e68feb 1947
ab8ab9d0
SC
1948 if (GET_MODE_CLASS (mode) == MODE_INT
1949 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
79e68feb
RS
1950 {
1951 /* We clear out all bits that don't belong in MODE, unless they and our
1952 sign bit are all one. So we get either a reasonable negative value
1953 or a reasonable unsigned value for this mode. */
1954 int width = GET_MODE_BITSIZE (mode);
37366632
RK
1955 if (width < HOST_BITS_PER_WIDE_INT
1956 && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
1957 != ((HOST_WIDE_INT) (-1) << (width - 1))))
1958 i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
1959 else if (width == HOST_BITS_PER_WIDE_INT
79e68feb
RS
1960 && ! (i1 == ~0 && i0 < 0))
1961 i1 = 0;
37366632 1962 else if (width > 2 * HOST_BITS_PER_WIDE_INT)
79e68feb
RS
1963 /* We cannot represent this value as a constant. */
1964 abort ();
1965
2ba3a0ec
JW
1966 /* If this would be an entire word for the target, but is not for
1967 the host, then sign-extend on the host so that the number will look
1968 the same way on the host that it would on the target.
1969
1970 For example, when building a 64 bit alpha hosted 32 bit sparc
1971 targeted compiler, then we want the 32 bit unsigned value -1 to be
1972 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
1973 The later confuses the sparc backend. */
1974
1975 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width
1976 && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
1977 i0 |= ((HOST_WIDE_INT) (-1) << width);
1978
37366632 1979 /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
79e68feb
RS
1980
1981 ??? Strictly speaking, this is wrong if we create a CONST_INT
1982 for a large unsigned constant with the size of MODE being
37366632
RK
1983 HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
1984 wider mode. In that case we will mis-interpret it as a negative
1985 number.
79e68feb
RS
1986
1987 Unfortunately, the only alternative is to make a CONST_DOUBLE
1988 for any constant in any mode if it is an unsigned constant larger
1989 than the maximum signed integer in an int on the host. However,
1990 doing this will break everyone that always expects to see a CONST_INT
1991 for SImode and smaller.
1992
1993 We have always been making CONST_INTs in this case, so nothing new
1994 is being broken. */
1995
37366632 1996 if (width <= HOST_BITS_PER_WIDE_INT)
7bcac048 1997 i1 = (i0 < 0) ? ~(HOST_WIDE_INT) 0 : 0;
79e68feb
RS
1998
1999 /* If this integer fits in one word, return a CONST_INT. */
2000 if ((i1 == 0 && i0 >= 0)
2001 || (i1 == ~0 && i0 < 0))
37366632 2002 return GEN_INT (i0);
79e68feb
RS
2003
2004 /* We use VOIDmode for integers. */
2005 mode = VOIDmode;
2006 }
2007
2008 /* Search the chain for an existing CONST_DOUBLE with the right value.
2009 If one is found, return it. */
2010
2011 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
2012 if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
2013 && GET_MODE (r) == mode)
2014 return r;
2015
2016 /* No; make a new one and add it to the chain.
2017
2018 We may be called by an optimizer which may be discarding any memory
2019 allocated during its processing (such as combine and loop). However,
2020 we will be leaving this constant on the chain, so we cannot tolerate
2021 freed memory. So switch to saveable_obstack for this allocation
2022 and then switch back if we were in current_obstack. */
2023
2260924f
JW
2024 push_obstacks_nochange ();
2025 rtl_in_saveable_obstack ();
38a448ca 2026 r = gen_rtx_CONST_DOUBLE (mode, NULL_RTX, i0, i1);
2260924f 2027 pop_obstacks ();
79e68feb 2028
179bb78c
JW
2029 /* Don't touch const_double_chain in nested function; see force_const_mem.
2030 Also, don't touch it if not inside any function. */
2031 if (outer_function_chain == 0 && current_function_decl != 0)
5145eda8
RS
2032 {
2033 CONST_DOUBLE_CHAIN (r) = const_double_chain;
2034 const_double_chain = r;
2035 }
79e68feb
RS
2036
2037 /* Store const0_rtx in mem-slot since this CONST_DOUBLE is on the chain.
2038 Actual use of mem-slot is only through force_const_mem. */
2039
2040 CONST_DOUBLE_MEM (r) = const0_rtx;
2041
2042 return r;
2043}
2044
2045/* Return a CONST_DOUBLE for a specified `double' value
2046 and machine mode. */
2047
2048rtx
2049immed_real_const_1 (d, mode)
2050 REAL_VALUE_TYPE d;
2051 enum machine_mode mode;
2052{
2053 union real_extract u;
2054 register rtx r;
79e68feb
RS
2055
2056 /* Get the desired `double' value as a sequence of ints
2057 since that is how they are stored in a CONST_DOUBLE. */
2058
2059 u.d = d;
2060
2061 /* Detect special cases. */
2062
41c9120b 2063 if (REAL_VALUES_IDENTICAL (dconst0, d))
79e68feb 2064 return CONST0_RTX (mode);
12194c38
RS
2065 /* Check for NaN first, because some ports (specifically the i386) do not
2066 emit correct ieee-fp code by default, and thus will generate a core
2067 dump here if we pass a NaN to REAL_VALUES_EQUAL and if REAL_VALUES_EQUAL
2068 does a floating point comparison. */
2069 else if (! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d))
79e68feb
RS
2070 return CONST1_RTX (mode);
2071
800d5c9e
RH
2072 if (sizeof u == sizeof (HOST_WIDE_INT))
2073 return immed_double_const (u.i[0], 0, mode);
37366632 2074 if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
79e68feb
RS
2075 return immed_double_const (u.i[0], u.i[1], mode);
2076
2077 /* The rest of this function handles the case where
2078 a float value requires more than 2 ints of space.
2079 It will be deleted as dead code on machines that don't need it. */
2080
2081 /* Search the chain for an existing CONST_DOUBLE with the right value.
2082 If one is found, return it. */
2083
2084 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
4c9a05bc 2085 if (! bcmp ((char *) &CONST_DOUBLE_LOW (r), (char *) &u, sizeof u)
79e68feb
RS
2086 && GET_MODE (r) == mode)
2087 return r;
2088
2089 /* No; make a new one and add it to the chain.
2090
2091 We may be called by an optimizer which may be discarding any memory
2092 allocated during its processing (such as combine and loop). However,
2093 we will be leaving this constant on the chain, so we cannot tolerate
2094 freed memory. So switch to saveable_obstack for this allocation
2095 and then switch back if we were in current_obstack. */
2096
2260924f
JW
2097 push_obstacks_nochange ();
2098 rtl_in_saveable_obstack ();
79e68feb
RS
2099 r = rtx_alloc (CONST_DOUBLE);
2100 PUT_MODE (r, mode);
4c9a05bc 2101 bcopy ((char *) &u, (char *) &CONST_DOUBLE_LOW (r), sizeof u);
2260924f 2102 pop_obstacks ();
79e68feb 2103
179bb78c
JW
2104 /* Don't touch const_double_chain in nested function; see force_const_mem.
2105 Also, don't touch it if not inside any function. */
2106 if (outer_function_chain == 0 && current_function_decl != 0)
5145eda8
RS
2107 {
2108 CONST_DOUBLE_CHAIN (r) = const_double_chain;
2109 const_double_chain = r;
2110 }
79e68feb
RS
2111
2112 /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
2113 chain, but has not been allocated memory. Actual use of CONST_DOUBLE_MEM
2114 is only through force_const_mem. */
2115
2116 CONST_DOUBLE_MEM (r) = const0_rtx;
2117
2118 return r;
2119}
2120
2121/* Return a CONST_DOUBLE rtx for a value specified by EXP,
2122 which must be a REAL_CST tree node. */
2123
2124rtx
2125immed_real_const (exp)
2126 tree exp;
2127{
2128 return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
2129}
2130
2131/* At the end of a function, forget the memory-constants
2132 previously made for CONST_DOUBLEs. Mark them as not on real_constant_chain.
2133 Also clear out real_constant_chain and clear out all the chain-pointers. */
2134
2135void
2136clear_const_double_mem ()
2137{
2138 register rtx r, next;
2139
57632c51
RS
2140 /* Don't touch CONST_DOUBLE_MEM for nested functions.
2141 See force_const_mem for explanation. */
2142 if (outer_function_chain != 0)
2143 return;
2144
79e68feb
RS
2145 for (r = const_double_chain; r; r = next)
2146 {
2147 next = CONST_DOUBLE_CHAIN (r);
2148 CONST_DOUBLE_CHAIN (r) = 0;
2149 CONST_DOUBLE_MEM (r) = cc0_rtx;
2150 }
2151 const_double_chain = 0;
2152}
2153\f
2154/* Given an expression EXP with a constant value,
2155 reduce it to the sum of an assembler symbol and an integer.
2156 Store them both in the structure *VALUE.
2157 Abort if EXP does not reduce. */
2158
2159struct addr_const
2160{
2161 rtx base;
fb351073 2162 HOST_WIDE_INT offset;
79e68feb
RS
2163};
2164
2165static void
2166decode_addr_const (exp, value)
2167 tree exp;
2168 struct addr_const *value;
2169{
2170 register tree target = TREE_OPERAND (exp, 0);
2171 register int offset = 0;
2172 register rtx x;
2173
2174 while (1)
2175 {
2176 if (TREE_CODE (target) == COMPONENT_REF
2177 && (TREE_CODE (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1)))
2178 == INTEGER_CST))
2179 {
2180 offset += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1))) / BITS_PER_UNIT;
2181 target = TREE_OPERAND (target, 0);
2182 }
2183 else if (TREE_CODE (target) == ARRAY_REF)
2184 {
2185 if (TREE_CODE (TREE_OPERAND (target, 1)) != INTEGER_CST
2186 || TREE_CODE (TYPE_SIZE (TREE_TYPE (target))) != INTEGER_CST)
2187 abort ();
2188 offset += ((TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (target)))
2189 * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)))
2190 / BITS_PER_UNIT);
2191 target = TREE_OPERAND (target, 0);
2192 }
2193 else
2194 break;
2195 }
2196
2197 switch (TREE_CODE (target))
2198 {
2199 case VAR_DECL:
2200 case FUNCTION_DECL:
2201 x = DECL_RTL (target);
2202 break;
2203
2204 case LABEL_DECL:
b93a436e
JL
2205 x = gen_rtx_MEM (FUNCTION_MODE,
2206 gen_rtx_LABEL_REF (VOIDmode,
2207 label_rtx (TREE_OPERAND (exp, 0))));
79e68feb
RS
2208 break;
2209
2210 case REAL_CST:
2211 case STRING_CST:
2212 case COMPLEX_CST:
2213 case CONSTRUCTOR:
2cf55b55 2214 case INTEGER_CST:
79e68feb
RS
2215 x = TREE_CST_RTL (target);
2216 break;
2217
2218 default:
2219 abort ();
2220 }
2221
b93a436e
JL
2222 if (GET_CODE (x) != MEM)
2223 abort ();
2224 x = XEXP (x, 0);
79e68feb
RS
2225
2226 value->base = x;
2227 value->offset = offset;
2228}
2229\f
2230/* Uniquize all constants that appear in memory.
2231 Each constant in memory thus far output is recorded
2232 in `const_hash_table' with a `struct constant_descriptor'
2233 that contains a polish representation of the value of
2234 the constant.
2235
2236 We cannot store the trees in the hash table
2237 because the trees may be temporary. */
2238
2239struct constant_descriptor
2240{
2241 struct constant_descriptor *next;
2242 char *label;
2243 char contents[1];
2244};
2245
2246#define HASHBITS 30
2247#define MAX_HASH_TABLE 1009
2248static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
2249
2250/* Compute a hash code for a constant expression. */
2251
5a13eaa4 2252static int
79e68feb
RS
2253const_hash (exp)
2254 tree exp;
2255{
2256 register char *p;
2257 register int len, hi, i;
2258 register enum tree_code code = TREE_CODE (exp);
2259
a9d07d6e
RK
2260 /* Either set P and LEN to the address and len of something to hash and
2261 exit the switch or return a value. */
2262
2263 switch (code)
79e68feb 2264 {
a9d07d6e 2265 case INTEGER_CST:
79e68feb
RS
2266 p = (char *) &TREE_INT_CST_LOW (exp);
2267 len = 2 * sizeof TREE_INT_CST_LOW (exp);
a9d07d6e
RK
2268 break;
2269
2270 case REAL_CST:
79e68feb
RS
2271 p = (char *) &TREE_REAL_CST (exp);
2272 len = sizeof TREE_REAL_CST (exp);
a9d07d6e 2273 break;
79e68feb 2274
a9d07d6e
RK
2275 case STRING_CST:
2276 p = TREE_STRING_POINTER (exp);
2277 len = TREE_STRING_LENGTH (exp);
2278 break;
79e68feb 2279
a9d07d6e
RK
2280 case COMPLEX_CST:
2281 return (const_hash (TREE_REALPART (exp)) * 5
2282 + const_hash (TREE_IMAGPART (exp)));
2283
2284 case CONSTRUCTOR:
2285 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
79e68feb 2286 {
a9d07d6e
RK
2287 len = int_size_in_bytes (TREE_TYPE (exp));
2288 p = (char *) alloca (len);
2289 get_set_constructor_bytes (exp, (unsigned char *) p, len);
2290 break;
2291 }
2292 else
2293 {
2294 register tree link;
2295
2296 /* For record type, include the type in the hashing.
2297 We do not do so for array types
2298 because (1) the sizes of the elements are sufficient
2299 and (2) distinct array types can have the same constructor.
2300 Instead, we include the array size because the constructor could
2301 be shorter. */
2302 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
7bcac048 2303 hi = ((unsigned long) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
a9d07d6e
RK
2304 % MAX_HASH_TABLE;
2305 else
2306 hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
2307 & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
2308
2309 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2310 if (TREE_VALUE (link))
2311 hi
2312 = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
2313
2314 return hi;
79e68feb 2315 }
79e68feb 2316
a9d07d6e
RK
2317 case ADDR_EXPR:
2318 {
2319 struct addr_const value;
2320
2321 decode_addr_const (exp, &value);
2322 if (GET_CODE (value.base) == SYMBOL_REF)
2323 {
2324 /* Don't hash the address of the SYMBOL_REF;
2325 only use the offset and the symbol name. */
2326 hi = value.offset;
2327 p = XSTR (value.base, 0);
2328 for (i = 0; p[i] != 0; i++)
2329 hi = ((hi * 613) + (unsigned) (p[i]));
2330 }
2331 else if (GET_CODE (value.base) == LABEL_REF)
2332 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2333
2334 hi &= (1 << HASHBITS) - 1;
2335 hi %= MAX_HASH_TABLE;
2336 }
79e68feb 2337 return hi;
a9d07d6e
RK
2338
2339 case PLUS_EXPR:
2340 case MINUS_EXPR:
2341 return (const_hash (TREE_OPERAND (exp, 0)) * 9
2342 + const_hash (TREE_OPERAND (exp, 1)));
2343
2344 case NOP_EXPR:
2345 case CONVERT_EXPR:
2346 case NON_LVALUE_EXPR:
2347 return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
e9a25f70
JL
2348
2349 default:
2350 abort ();
79e68feb 2351 }
79e68feb
RS
2352
2353 /* Compute hashing function */
2354 hi = len;
2355 for (i = 0; i < len; i++)
0f41302f 2356 hi = ((hi * 613) + (unsigned) (p[i]));
79e68feb
RS
2357
2358 hi &= (1 << HASHBITS) - 1;
2359 hi %= MAX_HASH_TABLE;
2360 return hi;
2361}
2362\f
2363/* Compare a constant expression EXP with a constant-descriptor DESC.
2364 Return 1 if DESC describes a constant with the same value as EXP. */
2365
2366static int
2367compare_constant (exp, desc)
2368 tree exp;
2369 struct constant_descriptor *desc;
2370{
2371 return 0 != compare_constant_1 (exp, desc->contents);
2372}
2373
2374/* Compare constant expression EXP with a substring P of a constant descriptor.
2375 If they match, return a pointer to the end of the substring matched.
2376 If they do not match, return 0.
2377
2378 Since descriptors are written in polish prefix notation,
2379 this function can be used recursively to test one operand of EXP
2380 against a subdescriptor, and if it succeeds it returns the
2381 address of the subdescriptor for the next operand. */
2382
2383static char *
2384compare_constant_1 (exp, p)
2385 tree exp;
2386 char *p;
2387{
2388 register char *strp;
2389 register int len;
2390 register enum tree_code code = TREE_CODE (exp);
2391
2392 if (code != (enum tree_code) *p++)
2393 return 0;
2394
a9d07d6e
RK
2395 /* Either set STRP, P and LEN to pointers and length to compare and exit the
2396 switch, or return the result of the comparison. */
2397
2398 switch (code)
79e68feb 2399 {
a9d07d6e 2400 case INTEGER_CST:
79e68feb
RS
2401 /* Integer constants are the same only if the same width of type. */
2402 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2403 return 0;
a9d07d6e 2404
79e68feb
RS
2405 strp = (char *) &TREE_INT_CST_LOW (exp);
2406 len = 2 * sizeof TREE_INT_CST_LOW (exp);
a9d07d6e
RK
2407 break;
2408
2409 case REAL_CST:
79e68feb
RS
2410 /* Real constants are the same only if the same width of type. */
2411 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2412 return 0;
a9d07d6e 2413
79e68feb
RS
2414 strp = (char *) &TREE_REAL_CST (exp);
2415 len = sizeof TREE_REAL_CST (exp);
a9d07d6e
RK
2416 break;
2417
2418 case STRING_CST:
79e68feb
RS
2419 if (flag_writable_strings)
2420 return 0;
a9d07d6e 2421
f163668c
RK
2422 if (*p++ != TYPE_MODE (TREE_TYPE (exp)))
2423 return 0;
2424
79e68feb
RS
2425 strp = TREE_STRING_POINTER (exp);
2426 len = TREE_STRING_LENGTH (exp);
4c9a05bc 2427 if (bcmp ((char *) &TREE_STRING_LENGTH (exp), p,
79e68feb
RS
2428 sizeof TREE_STRING_LENGTH (exp)))
2429 return 0;
a9d07d6e 2430
79e68feb 2431 p += sizeof TREE_STRING_LENGTH (exp);
a9d07d6e 2432 break;
79e68feb 2433
a9d07d6e
RK
2434 case COMPLEX_CST:
2435 p = compare_constant_1 (TREE_REALPART (exp), p);
2436 if (p == 0)
79e68feb 2437 return 0;
79e68feb 2438
a9d07d6e 2439 return compare_constant_1 (TREE_IMAGPART (exp), p);
79e68feb 2440
a9d07d6e
RK
2441 case CONSTRUCTOR:
2442 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
eb528802 2443 {
a9d07d6e
RK
2444 int xlen = len = int_size_in_bytes (TREE_TYPE (exp));
2445
2446 strp = (char *) alloca (len);
2447 get_set_constructor_bytes (exp, (unsigned char *) strp, len);
2448 if (bcmp ((char *) &xlen, p, sizeof xlen))
eb528802 2449 return 0;
eb528802 2450
a9d07d6e
RK
2451 p += sizeof xlen;
2452 break;
2453 }
2454 else
77fa0940 2455 {
a9d07d6e
RK
2456 register tree link;
2457 int length = list_length (CONSTRUCTOR_ELTS (exp));
2458 tree type;
e5e809f4
JL
2459 int have_purpose = 0;
2460
2461 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2462 if (TREE_PURPOSE (link))
2463 have_purpose = 1;
a9d07d6e
RK
2464
2465 if (bcmp ((char *) &length, p, sizeof length))
2466 return 0;
2467
2468 p += sizeof length;
2469
2470 /* For record constructors, insist that the types match.
e5e809f4
JL
2471 For arrays, just verify both constructors are for arrays.
2472 Then insist that either both or none have any TREE_PURPOSE
2473 values. */
a9d07d6e
RK
2474 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2475 type = TREE_TYPE (exp);
2476 else
2477 type = 0;
2478
2479 if (bcmp ((char *) &type, p, sizeof type))
2480 return 0;
2481
2482 p += sizeof type;
2483
e5e809f4
JL
2484 if (bcmp ((char *) &have_purpose, p, sizeof have_purpose))
2485 return 0;
2486
2487 p += sizeof have_purpose;
2488
a9d07d6e
RK
2489 /* For arrays, insist that the size in bytes match. */
2490 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
77fa0940 2491 {
e5e809f4
JL
2492 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
2493
a9d07d6e 2494 if (bcmp ((char *) &size, p, sizeof size))
77fa0940 2495 return 0;
a9d07d6e
RK
2496
2497 p += sizeof size;
77fa0940 2498 }
a9d07d6e
RK
2499
2500 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
77fa0940 2501 {
a9d07d6e
RK
2502 if (TREE_VALUE (link))
2503 {
2504 if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
2505 return 0;
2506 }
2507 else
2508 {
2509 tree zero = 0;
77fa0940 2510
e5e809f4
JL
2511 if (bcmp ((char *) &zero, p, sizeof zero))
2512 return 0;
2513
2514 p += sizeof zero;
2515 }
2516
2517 if (TREE_PURPOSE (link)
2518 && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
2519 {
2520 if (bcmp ((char *) &TREE_PURPOSE (link), p,
2521 sizeof TREE_PURPOSE (link)))
2522 return 0;
2523
2524 p += sizeof TREE_PURPOSE (link);
2525 }
2526 else if (TREE_PURPOSE (link))
2527 {
2528 if ((p = compare_constant_1 (TREE_PURPOSE (link), p)) == 0)
2529 return 0;
2530 }
2531 else if (have_purpose)
2532 {
2533 int zero = 0;
2534
a9d07d6e
RK
2535 if (bcmp ((char *) &zero, p, sizeof zero))
2536 return 0;
2537
2538 p += sizeof zero;
2539 }
77fa0940 2540 }
a9d07d6e
RK
2541
2542 return p;
77fa0940
RK
2543 }
2544
a9d07d6e
RK
2545 case ADDR_EXPR:
2546 {
2547 struct addr_const value;
2548
2549 decode_addr_const (exp, &value);
2550 strp = (char *) &value.offset;
2551 len = sizeof value.offset;
2552 /* Compare the offset. */
2553 while (--len >= 0)
2554 if (*p++ != *strp++)
2555 return 0;
2556
2557 /* Compare symbol name. */
2558 strp = XSTR (value.base, 0);
2559 len = strlen (strp) + 1;
2560 }
2561 break;
2562
2563 case PLUS_EXPR:
2564 case MINUS_EXPR:
fa212801 2565 case RANGE_EXPR:
79e68feb 2566 p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
a9d07d6e
RK
2567 if (p == 0)
2568 return 0;
2569
2570 return compare_constant_1 (TREE_OPERAND (exp, 1), p);
2571
2572 case NOP_EXPR:
2573 case CONVERT_EXPR:
2574 case NON_LVALUE_EXPR:
2575 return compare_constant_1 (TREE_OPERAND (exp, 0), p);
e9a25f70
JL
2576
2577 default:
2578 abort ();
79e68feb
RS
2579 }
2580
2581 /* Compare constant contents. */
2582 while (--len >= 0)
2583 if (*p++ != *strp++)
2584 return 0;
2585
2586 return p;
2587}
2588\f
2589/* Construct a constant descriptor for the expression EXP.
2590 It is up to the caller to enter the descriptor in the hash table. */
2591
2592static struct constant_descriptor *
2593record_constant (exp)
2594 tree exp;
2595{
387e854a
RK
2596 struct constant_descriptor *next = 0;
2597 char *label = 0;
79e68feb 2598
387e854a
RK
2599 /* Make a struct constant_descriptor. The first two pointers will
2600 be filled in later. Here we just leave space for them. */
2601
2602 obstack_grow (&permanent_obstack, (char *) &next, sizeof next);
2603 obstack_grow (&permanent_obstack, (char *) &label, sizeof label);
79e68feb
RS
2604 record_constant_1 (exp);
2605 return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
2606}
2607
2608/* Add a description of constant expression EXP
2609 to the object growing in `permanent_obstack'.
2610 No need to return its address; the caller will get that
2611 from the obstack when the object is complete. */
2612
2613static void
2614record_constant_1 (exp)
2615 tree exp;
2616{
2617 register char *strp;
2618 register int len;
2619 register enum tree_code code = TREE_CODE (exp);
2620
2621 obstack_1grow (&permanent_obstack, (unsigned int) code);
2622
2871d24f 2623 switch (code)
79e68feb 2624 {
2871d24f 2625 case INTEGER_CST:
79e68feb
RS
2626 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2627 strp = (char *) &TREE_INT_CST_LOW (exp);
2628 len = 2 * sizeof TREE_INT_CST_LOW (exp);
2871d24f
RK
2629 break;
2630
2631 case REAL_CST:
79e68feb
RS
2632 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2633 strp = (char *) &TREE_REAL_CST (exp);
2634 len = sizeof TREE_REAL_CST (exp);
2871d24f
RK
2635 break;
2636
2637 case STRING_CST:
79e68feb
RS
2638 if (flag_writable_strings)
2639 return;
2871d24f 2640
f163668c 2641 obstack_1grow (&permanent_obstack, TYPE_MODE (TREE_TYPE (exp)));
79e68feb
RS
2642 strp = TREE_STRING_POINTER (exp);
2643 len = TREE_STRING_LENGTH (exp);
2644 obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
2645 sizeof TREE_STRING_LENGTH (exp));
2871d24f
RK
2646 break;
2647
2648 case COMPLEX_CST:
79e68feb
RS
2649 record_constant_1 (TREE_REALPART (exp));
2650 record_constant_1 (TREE_IMAGPART (exp));
2651 return;
79e68feb 2652
2871d24f
RK
2653 case CONSTRUCTOR:
2654 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
eb528802 2655 {
2871d24f
RK
2656 int nbytes = int_size_in_bytes (TREE_TYPE (exp));
2657 obstack_grow (&permanent_obstack, &nbytes, sizeof (nbytes));
2658 obstack_blank (&permanent_obstack, nbytes);
2659 get_set_constructor_bytes
2491d239
PB
2660 (exp, (unsigned char *) permanent_obstack.next_free-nbytes,
2661 nbytes);
2871d24f 2662 return;
eb528802 2663 }
2871d24f 2664 else
77fa0940 2665 {
2871d24f
RK
2666 register tree link;
2667 int length = list_length (CONSTRUCTOR_ELTS (exp));
2668 tree type;
e5e809f4
JL
2669 int have_purpose = 0;
2670
2671 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2672 if (TREE_PURPOSE (link))
2673 have_purpose = 1;
2871d24f
RK
2674
2675 obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
2676
2677 /* For record constructors, insist that the types match.
e5e809f4
JL
2678 For arrays, just verify both constructors are for arrays.
2679 Then insist that either both or none have any TREE_PURPOSE
2680 values. */
2871d24f
RK
2681 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2682 type = TREE_TYPE (exp);
77fa0940 2683 else
2871d24f
RK
2684 type = 0;
2685 obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
e5e809f4
JL
2686 obstack_grow (&permanent_obstack, (char *) &have_purpose,
2687 sizeof have_purpose);
2871d24f
RK
2688
2689 /* For arrays, insist that the size in bytes match. */
2690 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
77fa0940 2691 {
e5e809f4 2692 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
2871d24f
RK
2693 obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
2694 }
77fa0940 2695
2871d24f
RK
2696 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2697 {
2698 if (TREE_VALUE (link))
2699 record_constant_1 (TREE_VALUE (link));
2700 else
2701 {
2702 tree zero = 0;
2703
e5e809f4
JL
2704 obstack_grow (&permanent_obstack,
2705 (char *) &zero, sizeof zero);
2706 }
2707
2708 if (TREE_PURPOSE (link)
2709 && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
2710 obstack_grow (&permanent_obstack,
2711 (char *) &TREE_PURPOSE (link),
2712 sizeof TREE_PURPOSE (link));
2713 else if (TREE_PURPOSE (link))
2714 record_constant_1 (TREE_PURPOSE (link));
2715 else if (have_purpose)
2716 {
2717 int zero = 0;
2718
2871d24f
RK
2719 obstack_grow (&permanent_obstack,
2720 (char *) &zero, sizeof zero);
2721 }
77fa0940
RK
2722 }
2723 }
79e68feb 2724 return;
2871d24f
RK
2725
2726 case ADDR_EXPR:
2727 {
2728 struct addr_const value;
2729
2730 decode_addr_const (exp, &value);
2731 /* Record the offset. */
2732 obstack_grow (&permanent_obstack,
2733 (char *) &value.offset, sizeof value.offset);
2734 /* Record the symbol name. */
2735 obstack_grow (&permanent_obstack, XSTR (value.base, 0),
2736 strlen (XSTR (value.base, 0)) + 1);
2737 }
79e68feb 2738 return;
2871d24f
RK
2739
2740 case PLUS_EXPR:
2741 case MINUS_EXPR:
fa212801 2742 case RANGE_EXPR:
79e68feb
RS
2743 record_constant_1 (TREE_OPERAND (exp, 0));
2744 record_constant_1 (TREE_OPERAND (exp, 1));
2745 return;
2871d24f
RK
2746
2747 case NOP_EXPR:
2748 case CONVERT_EXPR:
2749 case NON_LVALUE_EXPR:
79e68feb
RS
2750 record_constant_1 (TREE_OPERAND (exp, 0));
2751 return;
2871d24f
RK
2752
2753 default:
2754 abort ();
79e68feb
RS
2755 }
2756
2757 /* Record constant contents. */
2758 obstack_grow (&permanent_obstack, strp, len);
2759}
2760\f
ff8f4401
RS
2761/* Record a list of constant expressions that were passed to
2762 output_constant_def but that could not be output right away. */
2763
2764struct deferred_constant
2765{
2766 struct deferred_constant *next;
2767 tree exp;
2768 int reloc;
2769 int labelno;
2770};
2771
2772static struct deferred_constant *deferred_constants;
2773
8839fca4
ILT
2774/* Another list of constants which should be output after the
2775 function. */
2776static struct deferred_constant *after_function_constants;
2777
ff8f4401
RS
2778/* Nonzero means defer output of addressed subconstants
2779 (i.e., those for which output_constant_def is called.) */
2780static int defer_addressed_constants_flag;
2781
2782/* Start deferring output of subconstants. */
2783
2784void
2785defer_addressed_constants ()
2786{
2787 defer_addressed_constants_flag++;
2788}
2789
2790/* Stop deferring output of subconstants,
2791 and output now all those that have been deferred. */
2792
2793void
2794output_deferred_addressed_constants ()
2795{
2796 struct deferred_constant *p, *next;
2797
2798 defer_addressed_constants_flag--;
2799
2800 if (defer_addressed_constants_flag > 0)
2801 return;
2802
2803 for (p = deferred_constants; p; p = next)
2804 {
2805 output_constant_def_contents (p->exp, p->reloc, p->labelno);
2806 next = p->next;
2807 free (p);
2808 }
2809
2810 deferred_constants = 0;
2811}
d12516f1 2812
8839fca4
ILT
2813/* Output any constants which should appear after a function. */
2814
2815static void
2816output_after_function_constants ()
2817{
2818 struct deferred_constant *p, *next;
2819
2820 for (p = after_function_constants; p; p = next)
2821 {
2822 output_constant_def_contents (p->exp, p->reloc, p->labelno);
2823 next = p->next;
2824 free (p);
2825 }
2826
2827 after_function_constants = 0;
2828}
2829
d12516f1
RS
2830/* Make a copy of the whole tree structure for a constant.
2831 This handles the same types of nodes that compare_constant
2832 and record_constant handle. */
2833
2834static tree
2835copy_constant (exp)
2836 tree exp;
2837{
2838 switch (TREE_CODE (exp))
2839 {
310bbbf4
JW
2840 case ADDR_EXPR:
2841 /* For ADDR_EXPR, we do not want to copy the decl whose address
2842 is requested. We do want to copy constants though. */
2843 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
2844 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2845 copy_constant (TREE_OPERAND (exp, 0)));
2846 else
2847 return copy_node (exp);
2848
d12516f1
RS
2849 case INTEGER_CST:
2850 case REAL_CST:
2851 case STRING_CST:
d12516f1
RS
2852 return copy_node (exp);
2853
2854 case COMPLEX_CST:
28eb1cb8
RK
2855 return build_complex (TREE_TYPE (exp),
2856 copy_constant (TREE_REALPART (exp)),
d12516f1
RS
2857 copy_constant (TREE_IMAGPART (exp)));
2858
2859 case PLUS_EXPR:
2860 case MINUS_EXPR:
2861 return build (TREE_CODE (exp), TREE_TYPE (exp),
2862 copy_constant (TREE_OPERAND (exp, 0)),
2863 copy_constant (TREE_OPERAND (exp, 1)));
2864
2865 case NOP_EXPR:
2866 case CONVERT_EXPR:
a9d07d6e 2867 case NON_LVALUE_EXPR:
d12516f1
RS
2868 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2869 copy_constant (TREE_OPERAND (exp, 0)));
2870
2871 case CONSTRUCTOR:
2872 {
2873 tree copy = copy_node (exp);
2874 tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2875 tree tail;
2876
bb31ce0a 2877 CONSTRUCTOR_ELTS (copy) = list;
d12516f1
RS
2878 for (tail = list; tail; tail = TREE_CHAIN (tail))
2879 TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
474bda6c
PB
2880 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2881 for (tail = list; tail; tail = TREE_CHAIN (tail))
2882 TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
d12516f1
RS
2883
2884 return copy;
2885 }
2886
2887 default:
2888 abort ();
2889 }
2890}
ff8f4401 2891\f
79e68feb
RS
2892/* Return an rtx representing a reference to constant data in memory
2893 for the constant expression EXP.
ff8f4401 2894
79e68feb
RS
2895 If assembler code for such a constant has already been output,
2896 return an rtx to refer to it.
ff8f4401
RS
2897 Otherwise, output such a constant in memory (or defer it for later)
2898 and generate an rtx for it.
2899
2900 The TREE_CST_RTL of EXP is set up to point to that rtx.
79e68feb
RS
2901 The const_hash_table records which constants already have label strings. */
2902
2903rtx
2904output_constant_def (exp)
2905 tree exp;
2906{
ff8f4401 2907 register int hash;
79e68feb
RS
2908 register struct constant_descriptor *desc;
2909 char label[256];
2910 char *found = 0;
2911 int reloc;
2912 register rtx def;
2913
79e68feb
RS
2914 if (TREE_CST_RTL (exp))
2915 return TREE_CST_RTL (exp);
2916
2917 /* Make sure any other constants whose addresses appear in EXP
2918 are assigned label numbers. */
2919
2920 reloc = output_addressed_constants (exp);
2921
2922 /* Compute hash code of EXP. Search the descriptors for that hash code
2923 to see if any of them describes EXP. If yes, the descriptor records
2924 the label number already assigned. */
2925
00f07fb9 2926 hash = const_hash (exp) % MAX_HASH_TABLE;
ca695ac9 2927
00f07fb9
RK
2928 for (desc = const_hash_table[hash]; desc; desc = desc->next)
2929 if (compare_constant (exp, desc))
2930 {
2931 found = desc->label;
2932 break;
2933 }
ca695ac9 2934
00f07fb9
RK
2935 if (found == 0)
2936 {
2937 /* No constant equal to EXP is known to have been output.
2938 Make a constant descriptor to enter EXP in the hash table.
2939 Assign the label number and record it in the descriptor for
2940 future calls to this function to find. */
ca695ac9 2941
00f07fb9
RK
2942 /* Create a string containing the label name, in LABEL. */
2943 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2944
2945 desc = record_constant (exp);
2946 desc->next = const_hash_table[hash];
2947 desc->label
2948 = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
2949 const_hash_table[hash] = desc;
2950 }
2951 else
2952 {
2953 /* Create a string containing the label name, in LABEL. */
2954 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
79e68feb 2955 }
ca695ac9 2956
79e68feb
RS
2957 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2958
2959 push_obstacks_nochange ();
2960 if (TREE_PERMANENT (exp))
2961 end_temporary_allocation ();
2962
38a448ca 2963 def = gen_rtx_SYMBOL_REF (Pmode, desc->label);
ca695ac9 2964
00f07fb9 2965 TREE_CST_RTL (exp)
38a448ca 2966 = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), def);
00f07fb9 2967 RTX_UNCHANGING_P (TREE_CST_RTL (exp)) = 1;
05e3bdb9 2968 if (AGGREGATE_TYPE_P (TREE_TYPE (exp)))
c6df88cb 2969 MEM_SET_IN_STRUCT_P (TREE_CST_RTL (exp), 1);
00f07fb9 2970
79e68feb
RS
2971 pop_obstacks ();
2972
2973 /* Optionally set flags or add text to the name to record information
2974 such as that it is a function name. If the name is changed, the macro
8a425a05 2975 ASM_OUTPUT_LABELREF will have to know how to strip this information. */
79e68feb
RS
2976#ifdef ENCODE_SECTION_INFO
2977 ENCODE_SECTION_INFO (exp);
2978#endif
2979
ff8f4401
RS
2980 /* If this is the first time we've seen this particular constant,
2981 output it (or defer its output for later). */
79e68feb
RS
2982 if (found == 0)
2983 {
8839fca4
ILT
2984 int after_function = 0;
2985
2986#ifdef CONSTANT_AFTER_FUNCTION_P
2987 if (current_function_decl != 0
2988 && CONSTANT_AFTER_FUNCTION_P (exp))
2989 after_function = 1;
2990#endif
2991
2992 if (defer_addressed_constants_flag || after_function)
ff8f4401
RS
2993 {
2994 struct deferred_constant *p;
2995 p = (struct deferred_constant *) xmalloc (sizeof (struct deferred_constant));
2996
ff8f4401
RS
2997 push_obstacks_nochange ();
2998 suspend_momentary ();
d12516f1 2999 p->exp = copy_constant (exp);
ff8f4401
RS
3000 pop_obstacks ();
3001 p->reloc = reloc;
3002 p->labelno = const_labelno++;
8839fca4
ILT
3003 if (after_function)
3004 {
3005 p->next = after_function_constants;
3006 after_function_constants = p;
3007 }
3008 else
3009 {
3010 p->next = deferred_constants;
3011 deferred_constants = p;
3012 }
ff8f4401
RS
3013 }
3014 else
3015 output_constant_def_contents (exp, reloc, const_labelno++);
3016 }
3017
3018 return TREE_CST_RTL (exp);
3019}
3020
3021/* Now output assembler code to define the label for EXP,
3022 and follow it with the data of EXP. */
79e68feb 3023
ff8f4401
RS
3024static void
3025output_constant_def_contents (exp, reloc, labelno)
3026 tree exp;
3027 int reloc;
3028 int labelno;
3029{
3030 int align;
3031
8a425a05 3032 if (IN_NAMED_SECTION (exp))
ad4ff310 3033 named_section (exp, NULL, reloc);
8a425a05
DE
3034 else
3035 {
3036 /* First switch to text section, except for writable strings. */
79e68feb 3037#ifdef SELECT_SECTION
8a425a05 3038 SELECT_SECTION (exp, reloc);
79e68feb 3039#else
8a425a05
DE
3040 if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
3041 || (flag_pic && reloc))
3042 data_section ();
3043 else
3044 readonly_data_section ();
79e68feb 3045#endif
8a425a05 3046 }
79e68feb 3047
ff8f4401
RS
3048 /* Align the location counter as required by EXP's data type. */
3049 align = TYPE_ALIGN (TREE_TYPE (exp));
79e68feb 3050#ifdef CONSTANT_ALIGNMENT
ff8f4401 3051 align = CONSTANT_ALIGNMENT (exp, align);
79e68feb
RS
3052#endif
3053
ff8f4401 3054 if (align > BITS_PER_UNIT)
b93a436e 3055 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
79e68feb 3056
ff8f4401
RS
3057 /* Output the label itself. */
3058 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", labelno);
79e68feb 3059
ff8f4401
RS
3060 /* Output the value of EXP. */
3061 output_constant (exp,
3062 (TREE_CODE (exp) == STRING_CST
3063 ? TREE_STRING_LENGTH (exp)
3064 : int_size_in_bytes (TREE_TYPE (exp))));
79e68feb 3065
79e68feb
RS
3066}
3067\f
3068/* Similar hash facility for making memory-constants
3069 from constant rtl-expressions. It is used on RISC machines
3070 where immediate integer arguments and constant addresses are restricted
3071 so that such constants must be stored in memory.
3072
3073 This pool of constants is reinitialized for each function
3074 so each function gets its own constants-pool that comes right before it.
3075
3076 All structures allocated here are discarded when functions are saved for
3077 inlining, so they do not need to be allocated permanently. */
3078
3079#define MAX_RTX_HASH_TABLE 61
57632c51 3080static struct constant_descriptor **const_rtx_hash_table;
79e68feb
RS
3081
3082/* Structure to represent sufficient information about a constant so that
3083 it can be output when the constant pool is output, so that function
3084 integration can be done, and to simplify handling on machines that reference
3085 constant pool as base+displacement. */
3086
3087struct pool_constant
3088{
3089 struct constant_descriptor *desc;
3090 struct pool_constant *next;
3091 enum machine_mode mode;
3092 rtx constant;
3093 int labelno;
3094 int align;
3095 int offset;
91674c37 3096 int mark;
79e68feb
RS
3097};
3098
3099/* Pointers to first and last constant in pool. */
3100
3101static struct pool_constant *first_pool, *last_pool;
3102
3103/* Current offset in constant pool (does not include any machine-specific
3104 header. */
3105
3106static int pool_offset;
3107
3108/* Structure used to maintain hash table mapping symbols used to their
3109 corresponding constants. */
3110
3111struct pool_sym
3112{
3113 char *label;
3114 struct pool_constant *pool;
3115 struct pool_sym *next;
3116};
3117
57632c51 3118static struct pool_sym **const_rtx_sym_hash_table;
79e68feb
RS
3119
3120/* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
3121 The argument is XSTR (... , 0) */
3122
3123#define SYMHASH(LABEL) \
7bcac048 3124 ((((unsigned long) (LABEL)) & ((1 << HASHBITS) - 1)) % MAX_RTX_HASH_TABLE)
79e68feb
RS
3125\f
3126/* Initialize constant pool hashing for next function. */
3127
3128void
3129init_const_rtx_hash_table ()
3130{
57632c51
RS
3131 const_rtx_hash_table
3132 = ((struct constant_descriptor **)
3133 oballoc (MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *)));
3134 const_rtx_sym_hash_table
3135 = ((struct pool_sym **)
3136 oballoc (MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *)));
4c9a05bc 3137 bzero ((char *) const_rtx_hash_table,
57632c51 3138 MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *));
4c9a05bc 3139 bzero ((char *) const_rtx_sym_hash_table,
57632c51 3140 MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *));
79e68feb
RS
3141
3142 first_pool = last_pool = 0;
3143 pool_offset = 0;
3144}
3145
5a13eaa4 3146/* Save and restore status for a nested function. */
57632c51
RS
3147
3148void
e9a25f70 3149save_varasm_status (p, context)
57632c51 3150 struct function *p;
e9a25f70 3151 tree context;
57632c51
RS
3152{
3153 p->const_rtx_hash_table = const_rtx_hash_table;
3154 p->const_rtx_sym_hash_table = const_rtx_sym_hash_table;
3155 p->first_pool = first_pool;
3156 p->last_pool = last_pool;
3157 p->pool_offset = pool_offset;
e9a25f70
JL
3158 p->const_double_chain = const_double_chain;
3159
3160 /* If we are pushing to toplevel, we can't reuse const_double_chain. */
3161 if (context == NULL_TREE)
3162 const_double_chain = 0;
57632c51
RS
3163}
3164
3165void
3166restore_varasm_status (p)
3167 struct function *p;
3168{
3169 const_rtx_hash_table = p->const_rtx_hash_table;
3170 const_rtx_sym_hash_table = p->const_rtx_sym_hash_table;
3171 first_pool = p->first_pool;
3172 last_pool = p->last_pool;
3173 pool_offset = p->pool_offset;
e9a25f70 3174 const_double_chain = p->const_double_chain;
57632c51
RS
3175}
3176\f
79e68feb
RS
3177enum kind { RTX_DOUBLE, RTX_INT };
3178
3179struct rtx_const
3180{
3181#ifdef ONLY_INT_FIELDS
3182 unsigned int kind : 16;
3183 unsigned int mode : 16;
3184#else
3185 enum kind kind : 16;
3186 enum machine_mode mode : 16;
3187#endif
3188 union {
3189 union real_extract du;
3190 struct addr_const addr;
0b19a5b9 3191 struct {HOST_WIDE_INT high, low;} di;
79e68feb
RS
3192 } un;
3193};
3194
3195/* Express an rtx for a constant integer (perhaps symbolic)
3196 as the sum of a symbol or label plus an explicit integer.
3197 They are stored into VALUE. */
3198
3199static void
3200decode_rtx_const (mode, x, value)
3201 enum machine_mode mode;
3202 rtx x;
3203 struct rtx_const *value;
3204{
3205 /* Clear the whole structure, including any gaps. */
3206
3207 {
3208 int *p = (int *) value;
3209 int *end = (int *) (value + 1);
3210 while (p < end)
3211 *p++ = 0;
3212 }
3213
0f41302f 3214 value->kind = RTX_INT; /* Most usual kind. */
79e68feb
RS
3215 value->mode = mode;
3216
3217 switch (GET_CODE (x))
3218 {
3219 case CONST_DOUBLE:
3220 value->kind = RTX_DOUBLE;
56e2d435 3221 if (GET_MODE (x) != VOIDmode)
0b19a5b9
RK
3222 {
3223 value->mode = GET_MODE (x);
3224 bcopy ((char *) &CONST_DOUBLE_LOW (x),
3225 (char *) &value->un.du, sizeof value->un.du);
3226 }
3227 else
3228 {
3229 value->un.di.low = CONST_DOUBLE_LOW (x);
3230 value->un.di.high = CONST_DOUBLE_HIGH (x);
3231 }
79e68feb
RS
3232 break;
3233
3234 case CONST_INT:
3235 value->un.addr.offset = INTVAL (x);
3236 break;
3237
3238 case SYMBOL_REF:
3239 case LABEL_REF:
3d037392 3240 case PC:
79e68feb
RS
3241 value->un.addr.base = x;
3242 break;
3243
3244 case CONST:
3245 x = XEXP (x, 0);
3246 if (GET_CODE (x) == PLUS)
3247 {
3248 value->un.addr.base = XEXP (x, 0);
3249 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3250 abort ();
3251 value->un.addr.offset = INTVAL (XEXP (x, 1));
3252 }
3253 else if (GET_CODE (x) == MINUS)
3254 {
3255 value->un.addr.base = XEXP (x, 0);
3256 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3257 abort ();
3258 value->un.addr.offset = - INTVAL (XEXP (x, 1));
3259 }
3260 else
3261 abort ();
3262 break;
3263
3264 default:
3265 abort ();
3266 }
3267
3268 if (value->kind == RTX_INT && value->un.addr.base != 0)
3269 switch (GET_CODE (value->un.addr.base))
3270 {
3271 case SYMBOL_REF:
3272 case LABEL_REF:
3273 /* Use the string's address, not the SYMBOL_REF's address,
3274 for the sake of addresses of library routines.
3275 For a LABEL_REF, compare labels. */
3276 value->un.addr.base = XEXP (value->un.addr.base, 0);
e9a25f70
JL
3277
3278 default:
3279 break;
79e68feb
RS
3280 }
3281}
3282
57632c51
RS
3283/* Given a MINUS expression, simplify it if both sides
3284 include the same symbol. */
3285
3286rtx
3287simplify_subtraction (x)
3288 rtx x;
3289{
3290 struct rtx_const val0, val1;
3291
3292 decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
3293 decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
3294
3295 if (val0.un.addr.base == val1.un.addr.base)
3296 return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
3297 return x;
3298}
3299
79e68feb
RS
3300/* Compute a hash code for a constant RTL expression. */
3301
5a13eaa4 3302static int
79e68feb
RS
3303const_hash_rtx (mode, x)
3304 enum machine_mode mode;
3305 rtx x;
3306{
f8344bea
MH
3307 register int hi;
3308 register size_t i;
79e68feb
RS
3309
3310 struct rtx_const value;
3311 decode_rtx_const (mode, x, &value);
3312
3313 /* Compute hashing function */
3314 hi = 0;
3315 for (i = 0; i < sizeof value / sizeof (int); i++)
3316 hi += ((int *) &value)[i];
3317
3318 hi &= (1 << HASHBITS) - 1;
3319 hi %= MAX_RTX_HASH_TABLE;
3320 return hi;
3321}
3322
3323/* Compare a constant rtl object X with a constant-descriptor DESC.
3324 Return 1 if DESC describes a constant with the same value as X. */
3325
3326static int
3327compare_constant_rtx (mode, x, desc)
3328 enum machine_mode mode;
3329 rtx x;
3330 struct constant_descriptor *desc;
3331{
3332 register int *p = (int *) desc->contents;
3333 register int *strp;
3334 register int len;
3335 struct rtx_const value;
3336
3337 decode_rtx_const (mode, x, &value);
3338 strp = (int *) &value;
3339 len = sizeof value / sizeof (int);
3340
3341 /* Compare constant contents. */
3342 while (--len >= 0)
3343 if (*p++ != *strp++)
3344 return 0;
3345
3346 return 1;
3347}
3348
3349/* Construct a constant descriptor for the rtl-expression X.
3350 It is up to the caller to enter the descriptor in the hash table. */
3351
3352static struct constant_descriptor *
3353record_constant_rtx (mode, x)
3354 enum machine_mode mode;
3355 rtx x;
3356{
3357 struct constant_descriptor *ptr;
3358 char *label;
3359 struct rtx_const value;
3360
3361 decode_rtx_const (mode, x, &value);
3362
75974726
RK
3363 /* Put these things in the saveable obstack so we can ensure it won't
3364 be freed if we are called from combine or some other phase that discards
3365 memory allocated from function_obstack (current_obstack). */
3366 obstack_grow (saveable_obstack, &ptr, sizeof ptr);
3367 obstack_grow (saveable_obstack, &label, sizeof label);
79e68feb
RS
3368
3369 /* Record constant contents. */
75974726 3370 obstack_grow (saveable_obstack, &value, sizeof value);
79e68feb 3371
75974726 3372 return (struct constant_descriptor *) obstack_finish (saveable_obstack);
79e68feb
RS
3373}
3374\f
3375/* Given a constant rtx X, make (or find) a memory constant for its value
3376 and return a MEM rtx to refer to it in memory. */
3377
3378rtx
3379force_const_mem (mode, x)
3380 enum machine_mode mode;
3381 rtx x;
3382{
3383 register int hash;
3384 register struct constant_descriptor *desc;
3385 char label[256];
3386 char *found = 0;
3387 rtx def;
3388
3389 /* If we want this CONST_DOUBLE in the same mode as it is in memory
3390 (this will always be true for floating CONST_DOUBLEs that have been
3391 placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
3392 use the previous copy. Otherwise, make a new one. Note that in
3393 the unlikely event that this same CONST_DOUBLE is used in two different
3394 modes in an alternating fashion, we will allocate a lot of different
3395 memory locations, but this should be extremely rare. */
3396
57632c51
RS
3397 /* Don't use CONST_DOUBLE_MEM in a nested function.
3398 Nested functions have their own constant pools,
3399 so they can't share the same values in CONST_DOUBLE_MEM
3400 with the containing function. */
3401 if (outer_function_chain == 0)
3402 if (GET_CODE (x) == CONST_DOUBLE
3403 && GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
3404 && GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
3405 return CONST_DOUBLE_MEM (x);
79e68feb
RS
3406
3407 /* Compute hash code of X. Search the descriptors for that hash code
3408 to see if any of them describes X. If yes, the descriptor records
3409 the label number already assigned. */
3410
3411 hash = const_hash_rtx (mode, x);
3412
3413 for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
3414 if (compare_constant_rtx (mode, x, desc))
3415 {
3416 found = desc->label;
3417 break;
3418 }
3419
3420 if (found == 0)
3421 {
3422 register struct pool_constant *pool;
3423 register struct pool_sym *sym;
3424 int align;
3425
3426 /* No constant equal to X is known to have been output.
3427 Make a constant descriptor to enter X in the hash table.
3428 Assign the label number and record it in the descriptor for
3429 future calls to this function to find. */
3430
3431 desc = record_constant_rtx (mode, x);
3432 desc->next = const_rtx_hash_table[hash];
3433 const_rtx_hash_table[hash] = desc;
3434
3435 /* Align the location counter as required by EXP's data type. */
3436 align = (mode == VOIDmode) ? UNITS_PER_WORD : GET_MODE_SIZE (mode);
3437 if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
3438 align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
e5e8a8bf
JW
3439#ifdef CONSTANT_ALIGNMENT
3440 align = CONSTANT_ALIGNMENT (make_tree (type_for_mode (mode, 0), x),
3441 align * BITS_PER_UNIT) / BITS_PER_UNIT;
3442#endif
79e68feb
RS
3443
3444 pool_offset += align - 1;
3445 pool_offset &= ~ (align - 1);
3446
75974726 3447 /* If RTL is not being placed into the saveable obstack, make a
c0560887
ILT
3448 copy of X that is in the saveable obstack in case we are
3449 being called from combine or some other phase that discards
3450 memory it allocates. We used to only do this if it is a
3451 CONST; however, reload can allocate a CONST_INT when
3452 eliminating registers. */
75974726 3453 if (rtl_obstack != saveable_obstack
c0560887 3454 && (GET_CODE (x) == CONST || GET_CODE (x) == CONST_INT))
75974726
RK
3455 {
3456 push_obstacks_nochange ();
3457 rtl_in_saveable_obstack ();
3458
c0560887 3459 if (GET_CODE (x) == CONST)
38a448ca
RH
3460 x = gen_rtx_CONST (GET_MODE (x),
3461 gen_rtx_PLUS (GET_MODE (x),
3462 XEXP (XEXP (x, 0), 0),
3463 XEXP (XEXP (x, 0), 1)));
c0560887
ILT
3464 else
3465 x = GEN_INT (INTVAL (x));
3466
75974726
RK
3467 pop_obstacks ();
3468 }
3469
79e68feb
RS
3470 /* Allocate a pool constant descriptor, fill it in, and chain it in. */
3471
75974726 3472 pool = (struct pool_constant *) savealloc (sizeof (struct pool_constant));
79e68feb
RS
3473 pool->desc = desc;
3474 pool->constant = x;
3475 pool->mode = mode;
3476 pool->labelno = const_labelno;
3477 pool->align = align;
3478 pool->offset = pool_offset;
d2ce9169 3479 pool->mark = 1;
79e68feb
RS
3480 pool->next = 0;
3481
3482 if (last_pool == 0)
3483 first_pool = pool;
3484 else
3485 last_pool->next = pool;
3486
3487 last_pool = pool;
3488 pool_offset += GET_MODE_SIZE (mode);
3489
3490 /* Create a string containing the label name, in LABEL. */
3491 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3492
3493 ++const_labelno;
3494
3495 desc->label = found
3496 = (char *) obstack_copy0 (saveable_obstack, label, strlen (label));
3497
3498 /* Add label to symbol hash table. */
3499 hash = SYMHASH (found);
75974726 3500 sym = (struct pool_sym *) savealloc (sizeof (struct pool_sym));
79e68feb
RS
3501 sym->label = found;
3502 sym->pool = pool;
3503 sym->next = const_rtx_sym_hash_table[hash];
3504 const_rtx_sym_hash_table[hash] = sym;
3505 }
3506
3507 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
3508
38a448ca 3509 def = gen_rtx_MEM (mode, gen_rtx_SYMBOL_REF (Pmode, found));
79e68feb
RS
3510
3511 RTX_UNCHANGING_P (def) = 1;
3512 /* Mark the symbol_ref as belonging to this constants pool. */
3513 CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
3514 current_function_uses_const_pool = 1;
3515
57632c51
RS
3516 if (outer_function_chain == 0)
3517 if (GET_CODE (x) == CONST_DOUBLE)
3518 {
3519 if (CONST_DOUBLE_MEM (x) == cc0_rtx)
3520 {
3521 CONST_DOUBLE_CHAIN (x) = const_double_chain;
3522 const_double_chain = x;
3523 }
3524 CONST_DOUBLE_MEM (x) = def;
3525 }
79e68feb
RS
3526
3527 return def;
3528}
3529\f
3530/* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3531 the corresponding pool_constant structure. */
3532
3533static struct pool_constant *
3534find_pool_constant (addr)
3535 rtx addr;
3536{
3537 struct pool_sym *sym;
3538 char *label = XSTR (addr, 0);
3539
3540 for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; sym = sym->next)
3541 if (sym->label == label)
3542 return sym->pool;
3543
3544 abort ();
3545}
3546
3547/* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3548
3549rtx
3550get_pool_constant (addr)
3551 rtx addr;
3552{
3553 return (find_pool_constant (addr))->constant;
3554}
3555
3556/* Similar, return the mode. */
3557
3558enum machine_mode
3559get_pool_mode (addr)
3560 rtx addr;
3561{
3562 return (find_pool_constant (addr))->mode;
3563}
3564
3565/* Similar, return the offset in the constant pool. */
3566
3567int
3568get_pool_offset (addr)
3569 rtx addr;
3570{
3571 return (find_pool_constant (addr))->offset;
3572}
3573
3574/* Return the size of the constant pool. */
3575
3576int
3577get_pool_size ()
3578{
3579 return pool_offset;
3580}
3581\f
3582/* Write all the constants in the constant pool. */
3583
3584void
3585output_constant_pool (fnname, fndecl)
c84e2712
KG
3586 char *fnname ATTRIBUTE_UNUSED;
3587 tree fndecl ATTRIBUTE_UNUSED;
79e68feb
RS
3588{
3589 struct pool_constant *pool;
3590 rtx x;
3591 union real_extract u;
3592
91674c37
ILT
3593 /* It is possible for gcc to call force_const_mem and then to later
3594 discard the instructions which refer to the constant. In such a
3595 case we do not need to output the constant. */
d2ce9169 3596 if (optimize >= 0 && flag_expensive_optimizations)
91674c37
ILT
3597 mark_constant_pool ();
3598
79e68feb
RS
3599#ifdef ASM_OUTPUT_POOL_PROLOGUE
3600 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
3601#endif
3602
3603 for (pool = first_pool; pool; pool = pool->next)
3604 {
3605 x = pool->constant;
3606
d2ce9169 3607 if (! pool->mark)
91674c37
ILT
3608 continue;
3609
79e68feb
RS
3610 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3611 whose CODE_LABEL has been deleted. This can occur if a jump table
3612 is eliminated by optimization. If so, write a constant of zero
7b2b3f1f
RK
3613 instead. Note that this can also happen by turning the
3614 CODE_LABEL into a NOTE. */
3615 if (((GET_CODE (x) == LABEL_REF
3616 && (INSN_DELETED_P (XEXP (x, 0))
3617 || GET_CODE (XEXP (x, 0)) == NOTE)))
79e68feb
RS
3618 || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3619 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
7b2b3f1f
RK
3620 && (INSN_DELETED_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
3621 || GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == NOTE)))
79e68feb
RS
3622 x = const0_rtx;
3623
3624 /* First switch to correct section. */
3625#ifdef SELECT_RTX_SECTION
3626 SELECT_RTX_SECTION (pool->mode, x);
3627#else
3628 readonly_data_section ();
3629#endif
3630
3631#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3632 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
3633 pool->align, pool->labelno, done);
3634#endif
3635
3636 if (pool->align > 1)
3637 ASM_OUTPUT_ALIGN (asm_out_file, exact_log2 (pool->align));
3638
3639 /* Output the label. */
3640 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
3641
3642 /* Output the value of the constant itself. */
3643 switch (GET_MODE_CLASS (pool->mode))
3644 {
3645 case MODE_FLOAT:
3646 if (GET_CODE (x) != CONST_DOUBLE)
3647 abort ();
3648
4c9a05bc 3649 bcopy ((char *) &CONST_DOUBLE_LOW (x), (char *) &u, sizeof u);
79e68feb
RS
3650 assemble_real (u.d, pool->mode);
3651 break;
3652
3653 case MODE_INT:
ab8ab9d0 3654 case MODE_PARTIAL_INT:
79e68feb
RS
3655 assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
3656 break;
3657
3658 default:
3659 abort ();
3660 }
3661
29a82058
JL
3662#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3663 done: ;
3664#endif
3665
7f83c0e7
JL
3666 }
3667
5c8c0abd
ILT
3668#ifdef ASM_OUTPUT_POOL_EPILOGUE
3669 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool_offset);
3670#endif
3671
79e68feb
RS
3672 /* Done with this pool. */
3673 first_pool = last_pool = 0;
3674}
91674c37
ILT
3675
3676/* Look through the instructions for this function, and mark all the
3677 entries in the constant pool which are actually being used. */
3678
3679static void
3680mark_constant_pool ()
3681{
3682 register rtx insn;
d2ce9169 3683 struct pool_constant *pool;
91674c37
ILT
3684
3685 if (first_pool == 0)
3686 return;
3687
d2ce9169
RK
3688 for (pool = first_pool; pool; pool = pool->next)
3689 pool->mark = 0;
3690
91674c37
ILT
3691 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3692 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3693 mark_constants (PATTERN (insn));
3694
3695 for (insn = current_function_epilogue_delay_list;
3696 insn;
3697 insn = XEXP (insn, 1))
3698 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3699 mark_constants (PATTERN (insn));
3700}
3701
3702static void
3703mark_constants (x)
3704 register rtx x;
3705{
3706 register int i;
3707 register char *format_ptr;
3708
3709 if (x == 0)
3710 return;
3711
3712 if (GET_CODE (x) == SYMBOL_REF)
3713 {
3714 if (CONSTANT_POOL_ADDRESS_P (x))
3715 find_pool_constant (x)->mark = 1;
3716 return;
3717 }
eb7b11fd
JW
3718 /* Never search inside a CONST_DOUBLE, because CONST_DOUBLE_MEM may be
3719 a MEM, but does not constitute a use of that MEM. This is particularly
3720 important inside a nested function, because CONST_DOUBLE_MEM may be
3721 a reference to a MEM in the parent's constant pool. See the comment
3722 in force_const_mem. */
3723 else if (GET_CODE (x) == CONST_DOUBLE)
3724 return;
91674c37
ILT
3725
3726 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3727 insns, not any notes that may be attached. We don't want to mark
3728 a constant just because it happens to appear in a REG_EQUIV note. */
3729 if (GET_RTX_CLASS (GET_CODE (x)) == 'i')
3730 {
3731 mark_constants (PATTERN (x));
3732 return;
3733 }
3734
3735 format_ptr = GET_RTX_FORMAT (GET_CODE (x));
3736
3737 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
3738 {
3739 switch (*format_ptr++)
3740 {
3741 case 'e':
3742 mark_constants (XEXP (x, i));
3743 break;
3744
3745 case 'E':
3746 if (XVEC (x, i) != 0)
3747 {
3748 register int j;
3749
3750 for (j = 0; j < XVECLEN (x, i); j++)
3751 mark_constants (XVECEXP (x, i, j));
3752 }
3753 break;
3754
3755 case 'S':
3756 case 's':
3757 case '0':
3758 case 'i':
3759 case 'w':
3760 case 'n':
3761 case 'u':
3762 break;
3763
3764 default:
3765 abort ();
3766 }
3767 }
3768}
79e68feb
RS
3769\f
3770/* Find all the constants whose addresses are referenced inside of EXP,
3771 and make sure assembler code with a label has been output for each one.
3772 Indicate whether an ADDR_EXPR has been encountered. */
3773
5a13eaa4 3774static int
79e68feb
RS
3775output_addressed_constants (exp)
3776 tree exp;
3777{
3778 int reloc = 0;
3779
3780 switch (TREE_CODE (exp))
3781 {
3782 case ADDR_EXPR:
3783 {
3784 register tree constant = TREE_OPERAND (exp, 0);
3785
3786 while (TREE_CODE (constant) == COMPONENT_REF)
3787 {
3788 constant = TREE_OPERAND (constant, 0);
3789 }
3790
3791 if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
3792 || TREE_CODE (constant) == CONSTRUCTOR)
3793 /* No need to do anything here
3794 for addresses of variables or functions. */
3795 output_constant_def (constant);
3796 }
3797 reloc = 1;
3798 break;
3799
3800 case PLUS_EXPR:
3801 case MINUS_EXPR:
3802 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3803 reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
3804 break;
3805
3806 case NOP_EXPR:
3807 case CONVERT_EXPR:
37a52112 3808 case NON_LVALUE_EXPR:
79e68feb
RS
3809 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3810 break;
3811
3812 case CONSTRUCTOR:
3813 {
3814 register tree link;
3815 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
3816 if (TREE_VALUE (link) != 0)
3817 reloc |= output_addressed_constants (TREE_VALUE (link));
3818 }
3819 break;
3820
e9a25f70 3821 default:
79e68feb
RS
3822 break;
3823 }
3824 return reloc;
3825}
3826\f
3827/* Output assembler code for constant EXP to FILE, with no label.
3828 This includes the pseudo-op such as ".int" or ".byte", and a newline.
3829 Assumes output_addressed_constants has been done on EXP already.
3830
3831 Generate exactly SIZE bytes of assembler data, padding at the end
3832 with zeros if necessary. SIZE must always be specified.
3833
3834 SIZE is important for structure constructors,
3835 since trailing members may have been omitted from the constructor.
3836 It is also important for initialization of arrays from string constants
3837 since the full length of the string constant might not be wanted.
3838 It is also needed for initialization of unions, where the initializer's
3839 type is just one member, and that may not be as long as the union.
3840
3841 There a case in which we would fail to output exactly SIZE bytes:
3842 for a structure constructor that wants to produce more than SIZE bytes.
3843 But such constructors will never be generated for any possible input. */
3844
3845void
3846output_constant (exp, size)
3847 register tree exp;
3848 register int size;
3849{
3850 register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
79e68feb
RS
3851
3852 if (size == 0)
3853 return;
3854
be1ad04c 3855 /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
b81cdf54 3856 That way we get the constant (we hope) inside it. Also, strip off any
4e1bf5f5 3857 NOP_EXPR that converts between two record, union, array, or set types. */
be1ad04c
RK
3858 while ((TREE_CODE (exp) == NOP_EXPR
3859 && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
4e1bf5f5 3860 || AGGREGATE_TYPE_P (TREE_TYPE (exp))))
be1ad04c
RK
3861 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3862 exp = TREE_OPERAND (exp, 0);
3863
fff9e713
MT
3864 /* Allow a constructor with no elements for any data type.
3865 This means to fill the space with zeros. */
77fa0940 3866 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
fff9e713 3867 {
b93a436e 3868 assemble_zeros (size);
fff9e713
MT
3869 return;
3870 }
3871
79e68feb
RS
3872 switch (code)
3873 {
644ea577
RS
3874 case CHAR_TYPE:
3875 case BOOLEAN_TYPE:
79e68feb
RS
3876 case INTEGER_TYPE:
3877 case ENUMERAL_TYPE:
3878 case POINTER_TYPE:
3879 case REFERENCE_TYPE:
3880 /* ??? What about (int)((float)(int)&foo + 4) */
3881 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3882 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3883 exp = TREE_OPERAND (exp, 0);
3884
37366632 3885 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
79e68feb
RS
3886 EXPAND_INITIALIZER),
3887 size, 0))
3888 error ("initializer for integer value is too complicated");
3889 size = 0;
3890 break;
3891
3892 case REAL_TYPE:
3893 if (TREE_CODE (exp) != REAL_CST)
3894 error ("initializer for floating value is not a floating constant");
3895
3896 assemble_real (TREE_REAL_CST (exp),
3897 mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
3898 size = 0;
3899 break;
3900
3901 case COMPLEX_TYPE:
3902 output_constant (TREE_REALPART (exp), size / 2);
3903 output_constant (TREE_IMAGPART (exp), size / 2);
3904 size -= (size / 2) * 2;
3905 break;
3906
3907 case ARRAY_TYPE:
3908 if (TREE_CODE (exp) == CONSTRUCTOR)
3909 {
3910 output_constructor (exp, size);
3911 return;
3912 }
3913 else if (TREE_CODE (exp) == STRING_CST)
3914 {
3915 int excess = 0;
3916
3917 if (size > TREE_STRING_LENGTH (exp))
3918 {
3919 excess = size - TREE_STRING_LENGTH (exp);
3920 size = TREE_STRING_LENGTH (exp);
3921 }
3922
3923 assemble_string (TREE_STRING_POINTER (exp), size);
3924 size = excess;
3925 }
3926 else
3927 abort ();
3928 break;
3929
3930 case RECORD_TYPE:
3931 case UNION_TYPE:
3932 if (TREE_CODE (exp) == CONSTRUCTOR)
3933 output_constructor (exp, size);
3934 else
3935 abort ();
3936 return;
474bda6c
PB
3937
3938 case SET_TYPE:
3939 if (TREE_CODE (exp) == INTEGER_CST)
3940 assemble_integer (expand_expr (exp, NULL_RTX,
3941 VOIDmode, EXPAND_INITIALIZER),
af13b0fb 3942 size, 1);
474bda6c
PB
3943 else if (TREE_CODE (exp) == CONSTRUCTOR)
3944 {
af13b0fb
DE
3945 unsigned char *buffer = (unsigned char *) alloca (size);
3946 if (get_set_constructor_bytes (exp, buffer, size))
474bda6c 3947 abort ();
b029f99a 3948 assemble_string ((char *) buffer, size);
474bda6c
PB
3949 }
3950 else
3951 error ("unknown set constructor type");
3952 return;
e9a25f70
JL
3953
3954 default:
3955 break; /* ??? */
79e68feb
RS
3956 }
3957
3958 if (size > 0)
3959 assemble_zeros (size);
3960}
ca695ac9 3961
79e68feb
RS
3962\f
3963/* Subroutine of output_constant, used for CONSTRUCTORs
3964 (aggregate constants).
3965 Generate at least SIZE bytes, padding if necessary. */
3966
5a13eaa4 3967static void
79e68feb
RS
3968output_constructor (exp, size)
3969 tree exp;
3970 int size;
3971{
3972 register tree link, field = 0;
13b457e7 3973 HOST_WIDE_INT min_index = 0;
79e68feb
RS
3974 /* Number of bytes output or skipped so far.
3975 In other words, current position within the constructor. */
3976 int total_bytes = 0;
3977 /* Non-zero means BYTE contains part of a byte, to be output. */
3978 int byte_buffer_in_use = 0;
3979 register int byte;
3980
37366632 3981 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
79e68feb
RS
3982 abort ();
3983
3984 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
3985 field = TYPE_FIELDS (TREE_TYPE (exp));
3986
d12516f1
RS
3987 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
3988 && TYPE_DOMAIN (TREE_TYPE (exp)) != 0)
13b457e7
RK
3989 min_index
3990 = TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (exp))));
3991
79e68feb
RS
3992 /* As LINK goes through the elements of the constant,
3993 FIELD goes through the structure fields, if the constant is a structure.
3994 if the constant is a union, then we override this,
3995 by getting the field from the TREE_LIST element.
3996 But the constant could also be an array. Then FIELD is zero. */
3997 for (link = CONSTRUCTOR_ELTS (exp);
3998 link;
3999 link = TREE_CHAIN (link),
4000 field = field ? TREE_CHAIN (field) : 0)
4001 {
4002 tree val = TREE_VALUE (link);
3181cbfd
RS
4003 tree index = 0;
4004
79e68feb 4005 /* the element in a union constructor specifies the proper field. */
3181cbfd
RS
4006
4007 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
4008 || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE)
1108dc3d
KKT
4009 {
4010 /* if available, use the type given by link */
4011 if (TREE_PURPOSE (link) != 0)
4012 field = TREE_PURPOSE (link);
4013 }
79e68feb 4014
3181cbfd
RS
4015 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
4016 index = TREE_PURPOSE (link);
4017
79e68feb 4018 /* Eliminate the marker that makes a cast not be an lvalue. */
d964285c
CH
4019 if (val != 0)
4020 STRIP_NOPS (val);
79e68feb 4021
8311a11f
PB
4022 if (index && TREE_CODE (index) == RANGE_EXPR)
4023 {
4024 register int fieldsize
4025 = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
4026 HOST_WIDE_INT lo_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 0));
4027 HOST_WIDE_INT hi_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 1));
4028 HOST_WIDE_INT index;
4029 for (index = lo_index; index <= hi_index; index++)
4030 {
4031 /* Output the element's initial value. */
4032 if (val == 0)
4033 assemble_zeros (fieldsize);
4034 else
4035 output_constant (val, fieldsize);
4036
4037 /* Count its size. */
4038 total_bytes += fieldsize;
4039 }
4040 }
4041 else if (field == 0 || !DECL_BIT_FIELD (field))
79e68feb 4042 {
3181cbfd
RS
4043 /* An element that is not a bit-field. */
4044
79e68feb
RS
4045 register int fieldsize;
4046 /* Since this structure is static,
4047 we know the positions are constant. */
4048 int bitpos = (field ? (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
4049 / BITS_PER_UNIT)
4050 : 0);
3181cbfd
RS
4051 if (index != 0)
4052 bitpos = (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (val)))
4053 / BITS_PER_UNIT
13b457e7 4054 * (TREE_INT_CST_LOW (index) - min_index));
79e68feb 4055
3181cbfd 4056 /* Output any buffered-up bit-fields preceding this element. */
79e68feb
RS
4057 if (byte_buffer_in_use)
4058 {
4059 ASM_OUTPUT_BYTE (asm_out_file, byte);
4060 total_bytes++;
4061 byte_buffer_in_use = 0;
4062 }
4063
4064 /* Advance to offset of this element.
4065 Note no alignment needed in an array, since that is guaranteed
4066 if each element has the proper size. */
3181cbfd 4067 if ((field != 0 || index != 0) && bitpos != total_bytes)
79e68feb 4068 {
b93a436e 4069 assemble_zeros (bitpos - total_bytes);
79e68feb
RS
4070 total_bytes = bitpos;
4071 }
4072
4073 /* Determine size this element should occupy. */
4074 if (field)
4075 {
4076 if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
4077 abort ();
4078 if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
4079 {
4080 /* This avoids overflow trouble. */
4081 tree size_tree = size_binop (CEIL_DIV_EXPR,
4082 DECL_SIZE (field),
4083 size_int (BITS_PER_UNIT));
4084 fieldsize = TREE_INT_CST_LOW (size_tree);
4085 }
4086 else
4087 {
4088 fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
4089 fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
4090 }
4091 }
4092 else
4093 fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
4094
4095 /* Output the element's initial value. */
4096 if (val == 0)
4097 assemble_zeros (fieldsize);
4098 else
4099 output_constant (val, fieldsize);
4100
4101 /* Count its size. */
4102 total_bytes += fieldsize;
4103 }
4104 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4105 error ("invalid initial value for member `%s'",
4106 IDENTIFIER_POINTER (DECL_NAME (field)));
4107 else
4108 {
4109 /* Element that is a bit-field. */
4110
4111 int next_offset = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
4112 int end_offset
4113 = (next_offset + TREE_INT_CST_LOW (DECL_SIZE (field)));
4114
4115 if (val == 0)
4116 val = integer_zero_node;
4117
4118 /* If this field does not start in this (or, next) byte,
4119 skip some bytes. */
4120 if (next_offset / BITS_PER_UNIT != total_bytes)
4121 {
4122 /* Output remnant of any bit field in previous bytes. */
4123 if (byte_buffer_in_use)
4124 {
4125 ASM_OUTPUT_BYTE (asm_out_file, byte);
4126 total_bytes++;
4127 byte_buffer_in_use = 0;
4128 }
4129
4130 /* If still not at proper byte, advance to there. */
4131 if (next_offset / BITS_PER_UNIT != total_bytes)
4132 {
4133 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4134 total_bytes = next_offset / BITS_PER_UNIT;
4135 }
4136 }
4137
4138 if (! byte_buffer_in_use)
4139 byte = 0;
4140
4141 /* We must split the element into pieces that fall within
4142 separate bytes, and combine each byte with previous or
4143 following bit-fields. */
4144
b4ac57ab 4145 /* next_offset is the offset n fbits from the beginning of
79e68feb
RS
4146 the structure to the next bit of this element to be processed.
4147 end_offset is the offset of the first bit past the end of
4148 this element. */
4149 while (next_offset < end_offset)
4150 {
4151 int this_time;
e7105755
JW
4152 int shift;
4153 HOST_WIDE_INT value;
79e68feb
RS
4154 int next_byte = next_offset / BITS_PER_UNIT;
4155 int next_bit = next_offset % BITS_PER_UNIT;
4156
4157 /* Advance from byte to byte
4158 within this element when necessary. */
4159 while (next_byte != total_bytes)
4160 {
4161 ASM_OUTPUT_BYTE (asm_out_file, byte);
4162 total_bytes++;
4163 byte = 0;
4164 }
4165
4166 /* Number of bits we can process at once
4167 (all part of the same byte). */
4168 this_time = MIN (end_offset - next_offset,
4169 BITS_PER_UNIT - next_bit);
f76b9db2 4170 if (BYTES_BIG_ENDIAN)
79e68feb 4171 {
f76b9db2
ILT
4172 /* On big-endian machine, take the most significant bits
4173 first (of the bits that are significant)
4174 and put them into bytes from the most significant end. */
4175 shift = end_offset - next_offset - this_time;
4176 /* Don't try to take a bunch of bits that cross
4177 the word boundary in the INTEGER_CST. */
4178 if (shift < HOST_BITS_PER_WIDE_INT
4179 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4180 {
4181 this_time -= (HOST_BITS_PER_WIDE_INT - shift);
4182 shift = HOST_BITS_PER_WIDE_INT;
4183 }
4184
4185 /* Now get the bits from the appropriate constant word. */
4186 if (shift < HOST_BITS_PER_WIDE_INT)
4187 {
4188 value = TREE_INT_CST_LOW (val);
4189 }
4190 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4191 {
4192 value = TREE_INT_CST_HIGH (val);
4193 shift -= HOST_BITS_PER_WIDE_INT;
4194 }
4195 else
4196 abort ();
4197 byte |= (((value >> shift)
4198 & (((HOST_WIDE_INT) 1 << this_time) - 1))
4199 << (BITS_PER_UNIT - this_time - next_bit));
79e68feb
RS
4200 }
4201 else
79e68feb 4202 {
f76b9db2
ILT
4203 /* On little-endian machines,
4204 take first the least significant bits of the value
4205 and pack them starting at the least significant
4206 bits of the bytes. */
4207 shift = (next_offset
4208 - TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
4209 /* Don't try to take a bunch of bits that cross
4210 the word boundary in the INTEGER_CST. */
4211 if (shift < HOST_BITS_PER_WIDE_INT
4212 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4213 {
4214 this_time -= (HOST_BITS_PER_WIDE_INT - shift);
4215 shift = HOST_BITS_PER_WIDE_INT;
4216 }
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 ();
4228 byte |= (((value >> shift)
4229 & (((HOST_WIDE_INT) 1 << this_time) - 1))
4230 << next_bit);
79e68feb 4231 }
79e68feb
RS
4232 next_offset += this_time;
4233 byte_buffer_in_use = 1;
4234 }
4235 }
4236 }
4237 if (byte_buffer_in_use)
4238 {
4239 ASM_OUTPUT_BYTE (asm_out_file, byte);
4240 total_bytes++;
4241 }
4242 if (total_bytes < size)
4243 assemble_zeros (size - total_bytes);
4244}
ca695ac9 4245
4b8af8d9
JM
4246/* Declare DECL to be a weak symbol. */
4247
4248void
4249declare_weak (decl)
4250 tree decl;
4251{
4252 if (! TREE_PUBLIC (decl))
4253 error_with_decl (decl, "weak declaration of `%s' must be public");
daefd78b
JM
4254 else if (TREE_ASM_WRITTEN (decl))
4255 error_with_decl (decl, "weak declaration of `%s' must precede definition");
4256 else if (SUPPORTS_WEAK)
4257 DECL_WEAK (decl) = 1;
4b8af8d9
JM
4258}
4259
4260/* Emit any pending weak declarations. */
4261
e2af664c
NC
4262#ifdef HANDLE_PRAGMA_WEAK
4263struct weak_syms * weak_decls;
4264#endif
4265
4b8af8d9
JM
4266void
4267weak_finish ()
4268{
4269#ifdef HANDLE_PRAGMA_WEAK
4270 if (HANDLE_PRAGMA_WEAK)
4271 {
eb0430f0
MM
4272 struct weak_syms *t;
4273 for (t = weak_decls; t; t = t->next)
4b8af8d9 4274 {
daefd78b 4275 ASM_WEAKEN_LABEL (asm_out_file, t->name);
eb0430f0
MM
4276 if (t->value)
4277 ASM_OUTPUT_DEF (asm_out_file, t->name, t->value);
4b8af8d9
JM
4278 }
4279 }
4280#endif
4281}
4282
4283void
4284assemble_alias (decl, target)
4285 tree decl, target;
4286{
4b8af8d9
JM
4287 char *name;
4288
0f41302f 4289 make_decl_rtl (decl, (char *) 0, 1);
4b8af8d9
JM
4290 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4291
4927276d 4292#ifdef ASM_OUTPUT_DEF
4b8af8d9
JM
4293 /* Make name accessible from other files, if appropriate. */
4294
4295 if (TREE_PUBLIC (decl))
4296 {
daefd78b
JM
4297#ifdef ASM_WEAKEN_LABEL
4298 if (DECL_WEAK (decl))
4299 ASM_WEAKEN_LABEL (asm_out_file, name);
48ad5afd 4300 else
daefd78b 4301#endif
48ad5afd 4302 ASM_GLOBALIZE_LABEL (asm_out_file, name);
4b8af8d9
JM
4303 }
4304
4305 ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
daefd78b 4306 TREE_ASM_WRITTEN (decl) = 1;
4b8af8d9 4307#else
4927276d
JM
4308#ifdef ASM_OUTPUT_WEAK_ALIAS
4309 if (! DECL_WEAK (decl))
4310 warning ("only weak aliases are supported in this configuration");
4311
4312 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4313 TREE_ASM_WRITTEN (decl) = 1;
4314#else
4315 warning ("alias definitions not supported in this configuration; ignored");
4316#endif
4b8af8d9
JM
4317#endif
4318}
f796d997
JM
4319
4320/* This determines whether or not we support link-once semantics. */
4321#ifndef SUPPORTS_ONE_ONLY
4322#ifdef MAKE_DECL_ONE_ONLY
4323#define SUPPORTS_ONE_ONLY 1
4324#else
4325#define SUPPORTS_ONE_ONLY 0
4326#endif
4327#endif
4328
4329/* Returns 1 if the target configuration supports defining public symbols
4330 so that one of them will be chosen at link time instead of generating a
4331 multiply-defined symbol error, whether through the use of weak symbols or
4332 a target-specific mechanism for having duplicates discarded. */
4333
4334int
4335supports_one_only ()
4336{
4337 if (SUPPORTS_ONE_ONLY)
4338 return 1;
4339 return SUPPORTS_WEAK;
4340}
4341
4342/* Set up DECL as a public symbol that can be defined in multiple
4343 translation units without generating a linker error. */
4344
4345void
4346make_decl_one_only (decl)
4347 tree decl;
4348{
4349 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4350 abort ();
4351
4352 TREE_PUBLIC (decl) = 1;
4353
4354 if (TREE_CODE (decl) == VAR_DECL
4355 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4356 DECL_COMMON (decl) = 1;
4357 else if (SUPPORTS_ONE_ONLY)
4358 {
4359#ifdef MAKE_DECL_ONE_ONLY
4360 MAKE_DECL_ONE_ONLY (decl);
4361#endif
4362 DECL_ONE_ONLY (decl) = 1;
4363 }
4364 else if (SUPPORTS_WEAK)
4365 DECL_WEAK (decl) = 1;
4366 else
4367 abort ();
4368}
This page took 1.367464 seconds and 5 git commands to generate.