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