]> gcc.gnu.org Git - gcc.git/blame - gcc/varasm.c
*** empty log message ***
[gcc.git] / gcc / varasm.c
CommitLineData
79e68feb
RS
1/* Output variables, constants and external declarations, for GNU compiler.
2 Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
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
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21/* This file handles generation of all the assembler code
22 *except* the instructions of a function.
23 This includes declarations of variables and their initial values.
24
25 We also output the assembler code for constants stored in memory
26 and are responsible for combining constants with the same value. */
27
28#include <stdio.h>
29#include <setjmp.h>
30/* #include <stab.h> */
31#include "config.h"
32#include "rtl.h"
33#include "tree.h"
34#include "flags.h"
35#include "expr.h"
36#include "hard-reg-set.h"
37#include "regs.h"
9a631e8e 38#include "defaults.h"
79e68feb
RS
39
40#include "obstack.h"
41
b4ac57ab 42#ifdef XCOFF_DEBUGGING_INFO
f246a305 43#include "xcoffout.h"
b4ac57ab
RS
44#endif
45
79e68feb
RS
46#ifndef ASM_STABS_OP
47#define ASM_STABS_OP ".stabs"
48#endif
49
50/* File in which assembler code is being written. */
51
52extern FILE *asm_out_file;
53
54/* The (assembler) name of the first globally-visible object output. */
55char *first_global_object_name;
56
57extern struct obstack *current_obstack;
58extern struct obstack *saveable_obstack;
59extern struct obstack permanent_obstack;
60#define obstack_chunk_alloc xmalloc
79e68feb
RS
61
62/* Number for making the label on the next
63 constant that is stored in memory. */
64
65int const_labelno;
66
67/* Number for making the label on the next
68 static variable internal to a function. */
69
70int var_labelno;
71
72/* Nonzero if at least one function definition has been seen. */
73static int function_defined;
74
75extern FILE *asm_out_file;
76
77static char *compare_constant_1 ();
78static void record_constant_1 ();
79void output_constant_pool ();
80void assemble_name ();
81int output_addressed_constants ();
82void output_constant ();
83void output_constructor ();
11435a40
TW
84void text_section ();
85void readonly_data_section ();
f246a305 86void data_section ();
79e68feb
RS
87\f
88#ifdef EXTRA_SECTIONS
89static enum in_section {no_section, in_text, in_data, EXTRA_SECTIONS} in_section
90 = no_section;
91#else
92static enum in_section {no_section, in_text, in_data} in_section
93 = no_section;
94#endif
95
96/* Define functions like text_section for any extra sections. */
97#ifdef EXTRA_SECTION_FUNCTIONS
98EXTRA_SECTION_FUNCTIONS
99#endif
100
101/* Tell assembler to switch to text section. */
102
103void
104text_section ()
105{
106 if (in_section != in_text)
107 {
108 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
109 in_section = in_text;
110 }
111}
112
79e68feb
RS
113/* Tell assembler to switch to data section. */
114
115void
116data_section ()
117{
118 if (in_section != in_data)
119 {
120 if (flag_shared_data)
121 {
122#ifdef SHARED_SECTION_ASM_OP
123 fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);
124#else
125 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
126#endif
127 }
128 else
129 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
130
131 in_section = in_data;
132 }
133}
134
7c6d68c8
RS
135/* Tell assembler to switch to read-only data section. This is normally
136 the text section. */
137
138void
139readonly_data_section ()
140{
141#ifdef READONLY_DATA_SECTION
142 READONLY_DATA_SECTION (); /* Note this can call data_section. */
143#else
144 text_section ();
145#endif
146}
147
79e68feb
RS
148/* Determine if we're in the text section. */
149
150int
151in_text_section ()
152{
153 return in_section == in_text;
154}
155\f
156/* Create the rtl to represent a function, for a function definition.
157 DECL is a FUNCTION_DECL node which describes which function.
158 The rtl is stored into DECL. */
159
160void
161make_function_rtl (decl)
162 tree decl;
163{
164 char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
165
166 /* Rename a nested function to avoid conflicts. */
167 if (decl_function_context (decl) != 0
168 && DECL_INITIAL (decl) != 0
169 && DECL_RTL (decl) == 0)
170 {
171 char *label;
172
173 name = IDENTIFIER_POINTER (DECL_NAME (decl));
174 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
175 name = obstack_copy0 (saveable_obstack, label, strlen (label));
176 var_labelno++;
177 }
178
179 if (DECL_RTL (decl) == 0)
180 {
181 DECL_RTL (decl)
182 = gen_rtx (MEM, DECL_MODE (decl),
183 gen_rtx (SYMBOL_REF, Pmode, name));
184
185 /* Optionally set flags or add text to the name to record information
186 such as that it is a function name. If the name is changed, the macro
187 ASM_OUTPUT_LABELREF will have to know how to strip this information.
188 And if it finds a * at the beginning after doing so, it must handle
189 that too. */
190#ifdef ENCODE_SECTION_INFO
191 ENCODE_SECTION_INFO (decl);
192#endif
193 }
194
195 /* Record at least one function has been defined. */
196 function_defined = 1;
197}
198
b4ac57ab
RS
199/* Given NAME, a putative register name, discard any customary prefixes. */
200
201static char *
202strip_reg_name (name)
203 char *name;
204{
205#ifdef REGISTER_PREFIX
206 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
207 name += strlen (REGISTER_PREFIX);
208#endif
209 if (name[0] == '%' || name[0] == '#')
210 name++;
211 return name;
212}
dcfedcd0 213\f
79e68feb
RS
214/* Decode an `asm' spec for a declaration as a register name.
215 Return the register number, or -1 if nothing specified,
c09e6498
RS
216 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
217 or -3 if ASMSPEC is `cc' and is not recognized,
218 or -4 if ASMSPEC is `memory' and is not recognized.
dcfedcd0
RK
219 Accept an exact spelling or a decimal number.
220 Prefixes such as % are optional. */
79e68feb
RS
221
222int
223decode_reg_name (asmspec)
224 char *asmspec;
225{
226 if (asmspec != 0)
227 {
228 int i;
229
b4ac57ab
RS
230 /* Get rid of confusing prefixes. */
231 asmspec = strip_reg_name (asmspec);
232
fff9e713
MT
233 /* Allow a decimal number as a "register name". */
234 for (i = strlen (asmspec) - 1; i >= 0; i--)
235 if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
236 break;
237 if (asmspec[0] != 0 && i < 0)
238 {
239 i = atoi (asmspec);
240 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
241 return i;
242 else
243 return -2;
244 }
245
79e68feb 246 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
b4ac57ab
RS
247 if (reg_names[i][0]
248 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
79e68feb
RS
249 return i;
250
79e68feb
RS
251#ifdef ADDITIONAL_REGISTER_NAMES
252 {
253 static struct { char *name; int number; } table[]
254 = ADDITIONAL_REGISTER_NAMES;
255
256 for (i = 0; i < sizeof (table) / sizeof (table[0]); i++)
257 if (! strcmp (asmspec, table[i].name))
258 return table[i].number;
79e68feb
RS
259 }
260#endif /* ADDITIONAL_REGISTER_NAMES */
261
c09e6498
RS
262 if (!strcmp (asmspec, "memory"))
263 return -4;
264
dcfedcd0
RK
265 if (!strcmp (asmspec, "cc"))
266 return -3;
267
79e68feb
RS
268 return -2;
269 }
270
271 return -1;
272}
273\f
274/* Create the DECL_RTL for a declaration for a static or external variable
275 or static or external function.
276 ASMSPEC, if not 0, is the string which the user specified
277 as the assembler symbol name.
278 TOP_LEVEL is nonzero if this is a file-scope variable.
279
280 This is never called for PARM_DECL nodes. */
281
282void
283make_decl_rtl (decl, asmspec, top_level)
284 tree decl;
285 char *asmspec;
286 int top_level;
287{
288 register char *name;
289 int reg_number = decode_reg_name (asmspec);
290
291 if (DECL_ASSEMBLER_NAME (decl) != NULL_TREE)
292 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
293
294 if (reg_number == -2)
295 {
296 /* ASMSPEC is given, and not the name of a register. */
297 name = (char *) obstack_alloc (saveable_obstack,
298 strlen (asmspec) + 2);
299 name[0] = '*';
300 strcpy (&name[1], asmspec);
301 }
302
303 /* For a duplicate declaration, we can be called twice on the
304 same DECL node. Don't alter the RTL already made
305 unless the old mode is wrong (which can happen when
306 the previous rtl was made when the type was incomplete). */
307 if (DECL_RTL (decl) == 0
308 || GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
309 {
310 DECL_RTL (decl) = 0;
311
312 /* First detect errors in declaring global registers. */
313 if (TREE_REGDECL (decl) && reg_number == -1)
314 error_with_decl (decl,
315 "register name not specified for `%s'");
dcfedcd0 316 else if (TREE_REGDECL (decl) && reg_number < 0)
79e68feb
RS
317 error_with_decl (decl,
318 "invalid register name for `%s'");
dcfedcd0 319 else if ((reg_number >= 0 || reg_number == -3) && ! TREE_REGDECL (decl))
79e68feb
RS
320 error_with_decl (decl,
321 "register name given for non-register variable `%s'");
322 else if (TREE_REGDECL (decl) && TREE_CODE (decl) == FUNCTION_DECL)
323 error ("function declared `register'");
324 else if (TREE_REGDECL (decl) && TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
325 error_with_decl (decl, "data type of `%s' isn't suitable for a register");
326 /* Now handle properly declared static register variables. */
327 else if (TREE_REGDECL (decl))
328 {
329 int nregs;
330#if 0 /* yylex should print the warning for this */
331 if (pedantic)
332 pedwarn ("ANSI C forbids global register variables");
333#endif
334 if (DECL_INITIAL (decl) != 0 && top_level)
335 {
336 DECL_INITIAL (decl) = 0;
337 error ("global register variable has initial value");
338 }
339 if (fixed_regs[reg_number] == 0
340 && function_defined && top_level)
341 error ("global register variable follows a function definition");
342 if (TREE_THIS_VOLATILE (decl))
343 warning ("volatile register variables don't work as you might wish");
344 DECL_RTL (decl) = gen_rtx (REG, DECL_MODE (decl), reg_number);
345 REG_USERVAR_P (DECL_RTL (decl)) = 1;
346
347 if (top_level)
348 {
349 /* Make this register fixed, so not usable for anything else. */
350 nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
351 while (nregs > 0)
352 global_regs[reg_number + --nregs] = 1;
353 init_reg_sets_1 ();
354 }
355 }
356
357 /* Now handle ordinary static variables and functions (in memory).
358 Also handle vars declared register invalidly. */
359 if (DECL_RTL (decl) == 0)
360 {
361 /* Can't use just the variable's own name for a variable
362 whose scope is less than the whole file.
363 Concatenate a distinguishing number. */
364 if (!top_level && !TREE_EXTERNAL (decl) && asmspec == 0)
365 {
366 char *label;
367
368 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
369 name = obstack_copy0 (saveable_obstack, label, strlen (label));
370 var_labelno++;
371 }
372
373 DECL_RTL (decl) = gen_rtx (MEM, DECL_MODE (decl),
374 gen_rtx (SYMBOL_REF, Pmode, name));
375 if (TREE_THIS_VOLATILE (decl))
376 MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
377 if (TREE_READONLY (decl))
378 RTX_UNCHANGING_P (DECL_RTL (decl)) = 1;
379 MEM_IN_STRUCT_P (DECL_RTL (decl))
380 = (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
381 || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
382 || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE);
383
384 /* Optionally set flags or add text to the name to record information
385 such as that it is a function name.
386 If the name is changed, the macro ASM_OUTPUT_LABELREF
387 will have to know how to strip this information.
388 And if it finds a * at the beginning after doing so,
389 it must handle that too. */
390#ifdef ENCODE_SECTION_INFO
391 ENCODE_SECTION_INFO (decl);
392#endif
393 }
394 }
395}
4724d87a
RS
396
397/* Make the rtl for variable VAR be volatile.
398 Use this only for static variables. */
399
400make_var_volatile (var)
401 tree var;
402{
403 if (GET_CODE (DECL_RTL (var)) != MEM)
404 abort ();
405
406 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
407}
79e68feb
RS
408\f
409/* Output a string of literal assembler code
410 for an `asm' keyword used between functions. */
411
412void
413assemble_asm (string)
414 tree string;
415{
416 app_enable ();
417
418 if (TREE_CODE (string) == ADDR_EXPR)
419 string = TREE_OPERAND (string, 0);
420
421 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
422}
423
424/* Tiemann: please get rid of this conditional and put appropriate
425 definitions in each of the files that should have them.
426 The type of debugging format is not the right parameter to
427 control how some other aspect of assembler output is done. */
428
429#if !(defined(DBX_DEBUGGING_INFO) && !defined(FASCIST_ASSEMBLER))
430#ifndef ASM_OUTPUT_CONSTRUCTOR
431#define ASM_OUTPUT_CONSTRUCTOR(file, name)
432#endif
433#ifndef ASM_OUTPUT_DESTRUCTOR
434#define ASM_OUTPUT_DESTRUCTOR(file, name)
435#endif
436#endif
437
438/* Record an element in the table of global destructors.
439 How this is done depends on what sort of assembler and linker
440 are in use.
441
442 NAME should be the name of a global function to be called
443 at exit time. This name is output using assemble_name. */
444
445void
446assemble_destructor (name)
447 char *name;
448{
449#ifdef ASM_OUTPUT_DESTRUCTOR
450 ASM_OUTPUT_DESTRUCTOR (asm_out_file, name);
451#else
452 if (flag_gnu_linker)
453 {
454 /* Now tell GNU LD that this is part of the static destructor set. */
455 /* This code works for any machine provided you use GNU as/ld. */
456 fprintf (asm_out_file, "%s \"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
457 assemble_name (asm_out_file, name);
458 fputc ('\n', asm_out_file);
459 }
460#endif
461}
462
463/* Likewise for global constructors. */
464
465void
466assemble_constructor (name)
467 char *name;
468{
469#ifdef ASM_OUTPUT_CONSTRUCTOR
470 ASM_OUTPUT_CONSTRUCTOR (asm_out_file, name);
471#else
472 if (flag_gnu_linker)
473 {
474 /* Now tell GNU LD that this is part of the static constructor set. */
475 /* This code works for any machine provided you use GNU as/ld. */
476 fprintf (asm_out_file, "%s \"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
477 assemble_name (asm_out_file, name);
478 fputc ('\n', asm_out_file);
479 }
480#endif
481}
482
483/* Likewise for entries we want to record for garbage collection.
484 Garbage collection is still under development. */
485
486void
487assemble_gc_entry (name)
488 char *name;
489{
490#ifdef ASM_OUTPUT_GC_ENTRY
491 ASM_OUTPUT_GC_ENTRY (asm_out_file, name);
492#else
493 if (flag_gnu_linker)
494 {
495 /* Now tell GNU LD that this is part of the static constructor set. */
496 fprintf (asm_out_file, "%s \"___PTR_LIST__\",22,0,0,", ASM_STABS_OP);
497 assemble_name (asm_out_file, name);
498 fputc ('\n', asm_out_file);
499 }
500#endif
501}
502\f
503/* Output assembler code for the constant pool of a function and associated
504 with defining the name of the function. DECL describes the function.
505 NAME is the function's name. For the constant pool, we use the current
506 constant pool data. */
507
508void
509assemble_start_function (decl, fnname)
510 tree decl;
511 char *fnname;
512{
513 int align;
514
515 /* The following code does not need preprocessing in the assembler. */
516
517 app_disable ();
518
519 output_constant_pool (fnname, decl);
520
521 text_section ();
522
523
524 /* Tell assembler to move to target machine's alignment for functions. */
525 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
526 if (align > 0)
527 ASM_OUTPUT_ALIGN (asm_out_file, align);
528
529#ifdef ASM_OUTPUT_FUNCTION_PREFIX
530 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
531#endif
532
533#ifdef SDB_DEBUGGING_INFO
534 /* Output SDB definition of the function. */
535 if (write_symbols == SDB_DEBUG)
536 sdbout_mark_begin_function ();
537#endif
538
539#ifdef DBX_DEBUGGING_INFO
e5c90c23 540 /* Output DBX definition of the function. */
79e68feb 541 if (write_symbols == DBX_DEBUG)
e5c90c23 542 dbxout_begin_function (decl);
79e68feb
RS
543#endif
544
545 /* Make function name accessible from other files, if appropriate. */
546
547 if (TREE_PUBLIC (decl))
548 {
549 if (!first_global_object_name)
550 first_global_object_name = fnname + (fnname[0] == '*');
551 ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
552 }
553
554 /* Do any machine/system dependent processing of the function name */
555#ifdef ASM_DECLARE_FUNCTION_NAME
556 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
557#else
558 /* Standard thing is just output label for the function. */
559 ASM_OUTPUT_LABEL (asm_out_file, fnname);
560#endif /* ASM_DECLARE_FUNCTION_NAME */
561}
562
563/* Output assembler code associated with defining the size of the
564 function. DECL describes the function. NAME is the function's name. */
565
566void
567assemble_end_function (decl, fnname)
568 tree decl;
569 char *fnname;
570{
571#ifdef ASM_DECLARE_FUNCTION_SIZE
572 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
573#endif
574}
575\f
576/* Assemble code to leave SIZE bytes of zeros. */
577
578void
579assemble_zeros (size)
580 int size;
581{
582#ifdef ASM_NO_SKIP_IN_TEXT
583 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
584 so we must output 0s explicitly in the text section. */
585 if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
586 {
587 int i;
588
589 for (i = 0; i < size - 20; i += 20)
590 {
591#ifdef ASM_BYTE_OP
592 fprintf (asm_out_file,
593 "%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);
594#else
595 fprintf (asm_out_file,
596 "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n");
597#endif
598 }
599 if (i < size)
600 {
601#ifdef ASM_BYTE_OP
602 fprintf (asm_out_file, "%s 0", ASM_BYTE_OP);
603#else
604 fprintf (asm_out_file, "\tbyte 0");
605#endif
606 i++;
607 for (; i < size; i++)
608 fprintf (asm_out_file, ",0");
609 fprintf (asm_out_file, "\n");
610 }
611 }
612 else
613#endif
614 ASM_OUTPUT_SKIP (asm_out_file, size);
615}
616
617/* Assemble a string constant with the specified C string as contents. */
618
619void
620assemble_string (p, size)
621 unsigned char *p;
622 int size;
623{
624 register int i;
625 int pos = 0;
626 int maximum = 2000;
627
628 /* If the string is very long, split it up. */
629
630 while (pos < size)
631 {
632 int thissize = size - pos;
633 if (thissize > maximum)
634 thissize = maximum;
635
79e68feb 636 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
79e68feb
RS
637
638 pos += thissize;
639 p += thissize;
640 }
641}
642\f
643/* Assemble everything that is needed for a variable or function declaration.
644 Not used for automatic variables, and not used for function definitions.
645 Should not be called for variables of incomplete structure type.
646
647 TOP_LEVEL is nonzero if this variable has file scope.
648 AT_END is nonzero if this is the special handling, at end of compilation,
649 to define things that have had only tentative definitions. */
650
651void
652assemble_variable (decl, top_level, at_end)
653 tree decl;
654 int top_level;
655 int at_end;
656{
657 register char *name;
658 int align;
659 tree size_tree;
660 int reloc = 0;
661
662 if (GET_CODE (DECL_RTL (decl)) == REG)
663 {
664 /* Do output symbol info for global register variables, but do nothing
665 else for them. */
666
667 if (TREE_ASM_WRITTEN (decl))
668 return;
669 TREE_ASM_WRITTEN (decl) = 1;
670
b4ac57ab 671#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
79e68feb 672 /* File-scope global variables are output here. */
b4ac57ab
RS
673 if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
674 && top_level)
79e68feb
RS
675 dbxout_symbol (decl, 0);
676#endif
677#ifdef SDB_DEBUGGING_INFO
678 if (write_symbols == SDB_DEBUG && top_level
679 /* Leave initialized global vars for end of compilation;
680 see comment in compile_file. */
681 && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
682 sdbout_symbol (decl, 0);
683#endif
684
685 /* Don't output any DWARF debugging information for variables here.
686 In the case of local variables, the information for them is output
687 when we do our recursive traversal of the tree representation for
688 the entire containing function. In the case of file-scope variables,
689 we output information for all of them at the very end of compilation
690 while we are doing our final traversal of the chain of file-scope
691 declarations. */
692
693 return;
694 }
695
696 /* Normally no need to say anything for external references,
697 since assembler considers all undefined symbols external. */
698
699 if (TREE_EXTERNAL (decl))
700 return;
701
702 /* Output no assembler code for a function declaration.
703 Only definitions of functions output anything. */
704
705 if (TREE_CODE (decl) == FUNCTION_DECL)
706 return;
707
708 /* If type was incomplete when the variable was declared,
709 see if it is complete now. */
710
711 if (DECL_SIZE (decl) == 0)
712 layout_decl (decl, 0);
713
714 /* Still incomplete => don't allocate it; treat the tentative defn
715 (which is what it must have been) as an `extern' reference. */
716
717 if (DECL_SIZE (decl) == 0)
718 {
719 error_with_file_and_line (DECL_SOURCE_FILE (decl),
720 DECL_SOURCE_LINE (decl),
721 "storage size of static var `%s' isn't known",
722 IDENTIFIER_POINTER (DECL_NAME (decl)));
723 return;
724 }
725
726 /* The first declaration of a variable that comes through this function
727 decides whether it is global (in C, has external linkage)
728 or local (in C, has internal linkage). So do nothing more
729 if this function has already run. */
730
731 if (TREE_ASM_WRITTEN (decl))
732 return;
733
734 TREE_ASM_WRITTEN (decl) = 1;
735
736#ifdef DBX_DEBUGGING_INFO
737 /* File-scope global variables are output here. */
738 if (write_symbols == DBX_DEBUG && top_level)
739 dbxout_symbol (decl, 0);
740#endif
741#ifdef SDB_DEBUGGING_INFO
742 if (write_symbols == SDB_DEBUG && top_level
743 /* Leave initialized global vars for end of compilation;
744 see comment in compile_file. */
745 && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
746 sdbout_symbol (decl, 0);
747#endif
748
749 /* Don't output any DWARF debugging information for variables here.
750 In the case of local variables, the information for them is output
751 when we do our recursive traversal of the tree representation for
752 the entire containing function. In the case of file-scope variables,
753 we output information for all of them at the very end of compilation
754 while we are doing our final traversal of the chain of file-scope
755 declarations. */
756
757 /* If storage size is erroneously variable, just continue.
758 Error message was already made. */
759
760 if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
b4ac57ab 761 goto finish;
79e68feb
RS
762
763 app_disable ();
764
765 /* This is better than explicit arithmetic, since it avoids overflow. */
766 size_tree = size_binop (CEIL_DIV_EXPR,
767 DECL_SIZE (decl), size_int (BITS_PER_UNIT));
768
769 if (TREE_INT_CST_HIGH (size_tree) != 0)
770 {
771 error_with_decl (decl, "size of variable `%s' is too large");
b4ac57ab 772 goto finish;
79e68feb
RS
773 }
774
775 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
776
777 /* Handle uninitialized definitions. */
778
779 /* ANSI specifies that a tentative definition which is not merged with
780 a non-tentative definition behaves exactly like a definition with an
781 initializer equal to zero. (Section 3.7.2)
782 -fno-common gives strict ANSI behavior. Usually you don't want it. */
783 if (! flag_no_common
784 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
785 {
786 int size = TREE_INT_CST_LOW (size_tree);
787 int rounded = size;
788
789 if (TREE_INT_CST_HIGH (size_tree) != 0)
790 error_with_decl (decl, "size of variable `%s' is too large");
791 /* Don't allocate zero bytes of common,
792 since that means "undefined external" in the linker. */
793 if (size == 0) rounded = 1;
794 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
795 so that each uninitialized object starts on such a boundary. */
796 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
797 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
798 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
799#if 0
800 if (flag_shared_data)
801 data_section ();
802#endif
803 if (TREE_PUBLIC (decl))
804 {
805#ifdef ASM_OUTPUT_SHARED_COMMON
806 if (flag_shared_data)
807 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
808 else
809#endif
810#ifdef ASM_OUTPUT_ALIGNED_COMMON
811 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
812 DECL_ALIGN (decl));
813#else
814 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
815#endif
816 }
817 else
818 {
819#ifdef ASM_OUTPUT_SHARED_LOCAL
820 if (flag_shared_data)
821 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
822 else
823#endif
824#ifdef ASM_OUTPUT_ALIGNED_LOCAL
825 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size,
826 DECL_ALIGN (decl));
827#else
828 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
829#endif
830 }
b4ac57ab 831 goto finish;
79e68feb
RS
832 }
833
834 /* Handle initialized definitions. */
835
836 /* First make the assembler name(s) global if appropriate. */
837 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
838 {
839 if (!first_global_object_name)
840 first_global_object_name = name + (name[0] == '*');
841 ASM_GLOBALIZE_LABEL (asm_out_file, name);
842 }
843#if 0
844 for (d = equivalents; d; d = TREE_CHAIN (d))
845 {
846 tree e = TREE_VALUE (d);
847 if (TREE_PUBLIC (e) && DECL_NAME (e))
848 ASM_GLOBALIZE_LABEL (asm_out_file,
849 XSTR (XEXP (DECL_RTL (e), 0), 0));
850 }
851#endif
852
853 /* Output any data that we will need to use the address of. */
854 if (DECL_INITIAL (decl))
855 reloc = output_addressed_constants (DECL_INITIAL (decl));
856
857 /* Switch to the proper section for this data. */
858#ifdef SELECT_SECTION
859 SELECT_SECTION (decl, reloc);
860#else
861 if (TREE_READONLY (decl)
862 && ! TREE_THIS_VOLATILE (decl)
863 && ! (flag_pic && reloc))
864 readonly_data_section ();
865 else
866 data_section ();
867#endif
868
869 /* Compute and output the alignment of this data. */
870
871 align = DECL_ALIGN (decl);
872 /* Some object file formats have a maximum alignment which they support.
873 In particular, a.out format supports a maximum alignment of 4. */
874#ifndef MAX_OFILE_ALIGNMENT
875#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
876#endif
877 if (align > MAX_OFILE_ALIGNMENT)
878 {
879 warning_with_decl (decl,
880 "alignment of `%s' is greater than maximum object file alignment");
881 align = MAX_OFILE_ALIGNMENT;
882 }
883#ifdef DATA_ALIGNMENT
884 /* On some machines, it is good to increase alignment sometimes. */
885 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
886#endif
887#ifdef CONSTANT_ALIGNMENT
888 if (DECL_INITIAL (decl))
889 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
890#endif
891
892 /* Reset the alignment in case we have made it tighter, so we can benefit
893 from it in get_pointer_alignment. */
894 DECL_ALIGN (decl) = align;
895
896 if (align > BITS_PER_UNIT)
897 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
898
899 /* Do any machine/system dependent processing of the object. */
900#ifdef ASM_DECLARE_OBJECT_NAME
901 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
902#else
903 /* Standard thing is just output label for the object. */
904 ASM_OUTPUT_LABEL (asm_out_file, name);
905#endif /* ASM_DECLARE_OBJECT_NAME */
906
907#if 0
908 for (d = equivalents; d; d = TREE_CHAIN (d))
909 {
910 tree e = TREE_VALUE (d);
911 ASM_OUTPUT_LABEL (asm_out_file, XSTR (XEXP (DECL_RTL (e), 0), 0));
912 }
913#endif
914
915 if (DECL_INITIAL (decl))
916 /* Output the actual data. */
917 output_constant (DECL_INITIAL (decl),
918 int_size_in_bytes (TREE_TYPE (decl)));
919 else
920 /* Leave space for it. */
921 assemble_zeros (int_size_in_bytes (TREE_TYPE (decl)));
b4ac57ab
RS
922
923 finish:
924#ifdef XCOFF_DEBUGGING_INFO
925 /* Unfortunately, the IBM assembler cannot handle stabx before the actual
926 declaration. When something like ".stabx "aa:S-2",aa,133,0" is emitted
927 and `aa' hasn't been output yet, the assembler generates a stab entry with
928 a value of zero, in addition to creating an unnecessary external entry
6dc42e49 929 for `aa'. Hence, we must postpone dbxout_symbol to here at the end. */
b4ac57ab
RS
930
931 /* File-scope global variables are output here. */
932 if (write_symbols == XCOFF_DEBUG && top_level)
933 dbxout_symbol (decl, 0);
934#else
935 /* There must be a statement after a label. */
936 ;
937#endif
79e68feb
RS
938}
939
940/* Output something to declare an external symbol to the assembler.
fff9e713
MT
941 (Most assemblers don't need this, so we normally output nothing.)
942 Do nothing if DECL is not external. */
79e68feb
RS
943
944void
945assemble_external (decl)
946 tree decl;
947{
79e68feb 948#ifdef ASM_OUTPUT_EXTERNAL
fff9e713
MT
949 if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
950 && TREE_EXTERNAL (decl) && TREE_PUBLIC (decl))
79e68feb 951 {
fff9e713
MT
952 rtx rtl = DECL_RTL (decl);
953
954 if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
955 && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
956 {
957 /* Some systems do require some output. */
958 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
959 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
960 }
79e68feb
RS
961 }
962#endif
963}
964
965/* Similar, for calling a library function FUN. */
966
967void
968assemble_external_libcall (fun)
969 rtx fun;
970{
971#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
972 /* Declare library function name external when first used, if nec. */
973 if (! SYMBOL_REF_USED (fun))
974 {
975 SYMBOL_REF_USED (fun) = 1;
976 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
977 }
978#endif
979}
980
981/* Declare the label NAME global. */
982
983void
984assemble_global (name)
985 char *name;
986{
987 ASM_GLOBALIZE_LABEL (asm_out_file, name);
988}
989
990/* Assemble a label named NAME. */
991
992void
993assemble_label (name)
994 char *name;
995{
996 ASM_OUTPUT_LABEL (asm_out_file, name);
997}
998
999/* Output to FILE a reference to the assembler name of a C-level name NAME.
1000 If NAME starts with a *, the rest of NAME is output verbatim.
1001 Otherwise NAME is transformed in an implementation-defined way
1002 (usually by the addition of an underscore).
1003 Many macros in the tm file are defined to call this function. */
1004
1005void
1006assemble_name (file, name)
1007 FILE *file;
1008 char *name;
1009{
1010 if (name[0] == '*')
1011 fputs (&name[1], file);
1012 else
1013 ASM_OUTPUT_LABELREF (file, name);
1014}
1015
1016/* Allocate SIZE bytes writable static space with a gensym name
1017 and return an RTX to refer to its address. */
1018
1019rtx
1020assemble_static_space (size)
1021 int size;
1022{
1023 char name[12];
1024 char *namestring;
1025 rtx x;
1026 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1027 so that each uninitialized object starts on such a boundary. */
1028 int rounded = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1029 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1030 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1031
1032#if 0
1033 if (flag_shared_data)
1034 data_section ();
1035#endif
1036
1037 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1038 ++const_labelno;
1039
1040 namestring = (char *) obstack_alloc (saveable_obstack,
1041 strlen (name) + 2);
1042 strcpy (namestring, name);
1043
1044 x = gen_rtx (SYMBOL_REF, Pmode, namestring);
1045#ifdef ASM_OUTPUT_ALIGNED_LOCAL
1046 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1047#else
1048 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1049#endif
1050 return x;
1051}
1052
1053/* Assemble the static constant template for function entry trampolines.
1054 This is done at most once per compilation.
1055 Returns an RTX for the address of the template. */
1056
1057rtx
1058assemble_trampoline_template ()
1059{
1060 char label[256];
1061 char *name;
1062 int align;
1063
1064 /* Write the assembler code to define one. */
1065 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1066 if (align > 0)
1067 ASM_OUTPUT_ALIGN (asm_out_file, align);
1068
1069 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1070 TRAMPOLINE_TEMPLATE (asm_out_file);
1071
1072 /* Record the rtl to refer to it. */
1073 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1074 name
1075 = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1076 return gen_rtx (SYMBOL_REF, Pmode, name);
1077}
1078\f
1079/* Assemble the integer constant X into an object of SIZE bytes.
1080 X must be either a CONST_INT or CONST_DOUBLE.
1081
1082 Return 1 if we were able to output the constant, otherwise 0. If FORCE is
1083 non-zero, abort if we can't output the constant. */
1084
1085int
1086assemble_integer (x, size, force)
1087 rtx x;
1088 int size;
1089 int force;
1090{
1091 /* First try to use the standard 1, 2, 4, 8, and 16 byte
1092 ASM_OUTPUT... macros. */
1093
1094 switch (size)
1095 {
1096#ifdef ASM_OUTPUT_CHAR
1097 case 1:
1098 ASM_OUTPUT_CHAR (asm_out_file, x);
1099 return 1;
1100#endif
1101
1102#ifdef ASM_OUTPUT_SHORT
1103 case 2:
1104 ASM_OUTPUT_SHORT (asm_out_file, x);
1105 return 1;
1106#endif
1107
1108#ifdef ASM_OUTPUT_INT
1109 case 4:
1110 ASM_OUTPUT_INT (asm_out_file, x);
1111 return 1;
1112#endif
1113
1114#ifdef ASM_OUTPUT_DOUBLE_INT
1115 case 8:
1116 ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1117 return 1;
1118#endif
1119
1120#ifdef ASM_OUTPUT_QUADRUPLE_INT
1121 case 16:
1122 ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1123 return 1;
1124#endif
1125 }
1126
1127 /* If we couldn't do it that way, there are two other possibilities: First,
1128 if the machine can output an explicit byte and this is a 1 byte constant,
1129 we can use ASM_OUTPUT_BYTE. */
1130
1131#ifdef ASM_OUTPUT_BYTE
1132 if (size == 1 && GET_CODE (x) == CONST_INT)
1133 {
1134 ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1135 return 1;
1136 }
1137#endif
1138
1139 /* Finally, if SIZE is larger than a single word, try to output the constant
1140 one word at a time. */
1141
1142 if (size > UNITS_PER_WORD)
1143 {
1144 int i;
1145 enum machine_mode mode
1146 = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1147 rtx word;
1148
1149 for (i = 0; i < size / UNITS_PER_WORD; i++)
1150 {
1151 word = operand_subword (x, i, 0, mode);
1152
1153 if (word == 0)
1154 break;
1155
fff9e713
MT
1156 if (! assemble_integer (word, UNITS_PER_WORD, 0))
1157 break;
79e68feb
RS
1158 }
1159
1160 if (i == size / UNITS_PER_WORD)
1161 return 1;
fff9e713
MT
1162 /* If we output at least one word and then could not finish,
1163 there is no valid way to continue. */
1164 if (i > 0)
1165 abort ();
79e68feb
RS
1166 }
1167
1168 if (force)
1169 abort ();
1170
1171 return 0;
1172}
1173\f
1174/* Assemble the floating-point constant D into an object of size MODE. */
1175
1176void
1177assemble_real (d, mode)
1178 REAL_VALUE_TYPE d;
1179 enum machine_mode mode;
1180{
1181 jmp_buf output_constant_handler;
1182
1183 if (setjmp (output_constant_handler))
1184 {
1185 error ("floating point trap outputting a constant");
1186#ifdef REAL_IS_NOT_DOUBLE
1187 bzero (&d, sizeof d);
1188 d = dconst0;
1189#else
1190 d = 0;
1191#endif
1192 }
1193
1194 set_float_handler (output_constant_handler);
1195
1196 switch (mode)
1197 {
1198#ifdef ASM_OUTPUT_FLOAT
1199 case SFmode:
1200 ASM_OUTPUT_FLOAT (asm_out_file, d);
1201 break;
1202#endif
1203
1204#ifdef ASM_OUTPUT_DOUBLE
1205 case DFmode:
1206 ASM_OUTPUT_DOUBLE (asm_out_file, d);
1207 break;
1208#endif
1209
1210#ifdef ASM_OUTPUT_LONG_DOUBLE
1211 case TFmode:
1212 ASM_OUTPUT_LONG_DOUBLE (asm_out_file, d);
1213 break;
1214#endif
1215
1216 default:
1217 abort ();
1218 }
1219
37366632 1220 set_float_handler (NULL_PTR);
79e68feb
RS
1221}
1222\f
1223/* Here we combine duplicate floating constants to make
1224 CONST_DOUBLE rtx's, and force those out to memory when necessary. */
1225
1226/* Chain of all CONST_DOUBLE rtx's constructed for the current function.
1227 They are chained through the CONST_DOUBLE_CHAIN.
1228 A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
1229 In that case, CONST_DOUBLE_MEM is either a MEM,
1230 or const0_rtx if no MEM has been made for this CONST_DOUBLE yet. */
1231
1232static rtx const_double_chain;
1233
1234/* Return a CONST_DOUBLE for a value specified as a pair of ints.
1235 For an integer, I0 is the low-order word and I1 is the high-order word.
1236 For a real number, I0 is the word with the low address
1237 and I1 is the word with the high address. */
1238
1239rtx
1240immed_double_const (i0, i1, mode)
37366632 1241 HOST_WIDE_INT i0, i1;
79e68feb
RS
1242 enum machine_mode mode;
1243{
1244 register rtx r;
1245 int in_current_obstack;
1246
1247 if (GET_MODE_CLASS (mode) == MODE_INT)
1248 {
1249 /* We clear out all bits that don't belong in MODE, unless they and our
1250 sign bit are all one. So we get either a reasonable negative value
1251 or a reasonable unsigned value for this mode. */
1252 int width = GET_MODE_BITSIZE (mode);
37366632
RK
1253 if (width < HOST_BITS_PER_WIDE_INT
1254 && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
1255 != ((HOST_WIDE_INT) (-1) << (width - 1))))
1256 i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
1257 else if (width == HOST_BITS_PER_WIDE_INT
79e68feb
RS
1258 && ! (i1 == ~0 && i0 < 0))
1259 i1 = 0;
37366632 1260 else if (width > 2 * HOST_BITS_PER_WIDE_INT)
79e68feb
RS
1261 /* We cannot represent this value as a constant. */
1262 abort ();
1263
37366632 1264 /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
79e68feb
RS
1265
1266 ??? Strictly speaking, this is wrong if we create a CONST_INT
1267 for a large unsigned constant with the size of MODE being
37366632
RK
1268 HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
1269 wider mode. In that case we will mis-interpret it as a negative
1270 number.
79e68feb
RS
1271
1272 Unfortunately, the only alternative is to make a CONST_DOUBLE
1273 for any constant in any mode if it is an unsigned constant larger
1274 than the maximum signed integer in an int on the host. However,
1275 doing this will break everyone that always expects to see a CONST_INT
1276 for SImode and smaller.
1277
1278 We have always been making CONST_INTs in this case, so nothing new
1279 is being broken. */
1280
37366632 1281 if (width <= HOST_BITS_PER_WIDE_INT)
79e68feb
RS
1282 i1 = (i0 < 0) ? ~0 : 0;
1283
1284 /* If this integer fits in one word, return a CONST_INT. */
1285 if ((i1 == 0 && i0 >= 0)
1286 || (i1 == ~0 && i0 < 0))
37366632 1287 return GEN_INT (i0);
79e68feb
RS
1288
1289 /* We use VOIDmode for integers. */
1290 mode = VOIDmode;
1291 }
1292
1293 /* Search the chain for an existing CONST_DOUBLE with the right value.
1294 If one is found, return it. */
1295
1296 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1297 if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
1298 && GET_MODE (r) == mode)
1299 return r;
1300
1301 /* No; make a new one and add it to the chain.
1302
1303 We may be called by an optimizer which may be discarding any memory
1304 allocated during its processing (such as combine and loop). However,
1305 we will be leaving this constant on the chain, so we cannot tolerate
1306 freed memory. So switch to saveable_obstack for this allocation
1307 and then switch back if we were in current_obstack. */
1308
1309 in_current_obstack = rtl_in_saveable_obstack ();
1310 r = gen_rtx (CONST_DOUBLE, mode, 0, i0, i1);
1311 if (in_current_obstack)
1312 rtl_in_current_obstack ();
1313
1314 CONST_DOUBLE_CHAIN (r) = const_double_chain;
1315 const_double_chain = r;
1316
1317 /* Store const0_rtx in mem-slot since this CONST_DOUBLE is on the chain.
1318 Actual use of mem-slot is only through force_const_mem. */
1319
1320 CONST_DOUBLE_MEM (r) = const0_rtx;
1321
1322 return r;
1323}
1324
1325/* Return a CONST_DOUBLE for a specified `double' value
1326 and machine mode. */
1327
1328rtx
1329immed_real_const_1 (d, mode)
1330 REAL_VALUE_TYPE d;
1331 enum machine_mode mode;
1332{
1333 union real_extract u;
1334 register rtx r;
1335 int in_current_obstack;
1336
1337 /* Get the desired `double' value as a sequence of ints
1338 since that is how they are stored in a CONST_DOUBLE. */
1339
1340 u.d = d;
1341
1342 /* Detect special cases. */
1343
f246a305
RS
1344 /* Avoid REAL_VALUES_EQUAL here in order to distinguish minus zero. */
1345 if (!bcmp (&dconst0, &d, sizeof d))
79e68feb
RS
1346 return CONST0_RTX (mode);
1347 else if (REAL_VALUES_EQUAL (dconst1, d))
1348 return CONST1_RTX (mode);
1349
37366632 1350 if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
79e68feb
RS
1351 return immed_double_const (u.i[0], u.i[1], mode);
1352
1353 /* The rest of this function handles the case where
1354 a float value requires more than 2 ints of space.
1355 It will be deleted as dead code on machines that don't need it. */
1356
1357 /* Search the chain for an existing CONST_DOUBLE with the right value.
1358 If one is found, return it. */
1359
1360 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1361 if (! bcmp (&CONST_DOUBLE_LOW (r), &u, sizeof u)
1362 && GET_MODE (r) == mode)
1363 return r;
1364
1365 /* No; make a new one and add it to the chain.
1366
1367 We may be called by an optimizer which may be discarding any memory
1368 allocated during its processing (such as combine and loop). However,
1369 we will be leaving this constant on the chain, so we cannot tolerate
1370 freed memory. So switch to saveable_obstack for this allocation
1371 and then switch back if we were in current_obstack. */
1372
1373 in_current_obstack = rtl_in_saveable_obstack ();
1374 r = rtx_alloc (CONST_DOUBLE);
1375 PUT_MODE (r, mode);
1376 bcopy (&u, &CONST_DOUBLE_LOW (r), sizeof u);
1377 if (in_current_obstack)
1378 rtl_in_current_obstack ();
1379
1380 CONST_DOUBLE_CHAIN (r) = const_double_chain;
1381 const_double_chain = r;
1382
1383 /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
1384 chain, but has not been allocated memory. Actual use of CONST_DOUBLE_MEM
1385 is only through force_const_mem. */
1386
1387 CONST_DOUBLE_MEM (r) = const0_rtx;
1388
1389 return r;
1390}
1391
1392/* Return a CONST_DOUBLE rtx for a value specified by EXP,
1393 which must be a REAL_CST tree node. */
1394
1395rtx
1396immed_real_const (exp)
1397 tree exp;
1398{
1399 return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
1400}
1401
1402/* At the end of a function, forget the memory-constants
1403 previously made for CONST_DOUBLEs. Mark them as not on real_constant_chain.
1404 Also clear out real_constant_chain and clear out all the chain-pointers. */
1405
1406void
1407clear_const_double_mem ()
1408{
1409 register rtx r, next;
1410
1411 for (r = const_double_chain; r; r = next)
1412 {
1413 next = CONST_DOUBLE_CHAIN (r);
1414 CONST_DOUBLE_CHAIN (r) = 0;
1415 CONST_DOUBLE_MEM (r) = cc0_rtx;
1416 }
1417 const_double_chain = 0;
1418}
1419\f
1420/* Given an expression EXP with a constant value,
1421 reduce it to the sum of an assembler symbol and an integer.
1422 Store them both in the structure *VALUE.
1423 Abort if EXP does not reduce. */
1424
1425struct addr_const
1426{
1427 rtx base;
1428 int offset;
1429};
1430
1431static void
1432decode_addr_const (exp, value)
1433 tree exp;
1434 struct addr_const *value;
1435{
1436 register tree target = TREE_OPERAND (exp, 0);
1437 register int offset = 0;
1438 register rtx x;
1439
1440 while (1)
1441 {
1442 if (TREE_CODE (target) == COMPONENT_REF
1443 && (TREE_CODE (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1)))
1444 == INTEGER_CST))
1445 {
1446 offset += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1))) / BITS_PER_UNIT;
1447 target = TREE_OPERAND (target, 0);
1448 }
1449 else if (TREE_CODE (target) == ARRAY_REF)
1450 {
1451 if (TREE_CODE (TREE_OPERAND (target, 1)) != INTEGER_CST
1452 || TREE_CODE (TYPE_SIZE (TREE_TYPE (target))) != INTEGER_CST)
1453 abort ();
1454 offset += ((TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (target)))
1455 * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)))
1456 / BITS_PER_UNIT);
1457 target = TREE_OPERAND (target, 0);
1458 }
1459 else
1460 break;
1461 }
1462
1463 switch (TREE_CODE (target))
1464 {
1465 case VAR_DECL:
1466 case FUNCTION_DECL:
1467 x = DECL_RTL (target);
1468 break;
1469
1470 case LABEL_DECL:
1471 x = gen_rtx (MEM, FUNCTION_MODE,
1472 gen_rtx (LABEL_REF, VOIDmode,
1473 label_rtx (TREE_OPERAND (exp, 0))));
1474 break;
1475
1476 case REAL_CST:
1477 case STRING_CST:
1478 case COMPLEX_CST:
1479 case CONSTRUCTOR:
1480 x = TREE_CST_RTL (target);
1481 break;
1482
1483 default:
1484 abort ();
1485 }
1486
1487 if (GET_CODE (x) != MEM)
1488 abort ();
1489 x = XEXP (x, 0);
1490
1491 value->base = x;
1492 value->offset = offset;
1493}
1494\f
1495/* Uniquize all constants that appear in memory.
1496 Each constant in memory thus far output is recorded
1497 in `const_hash_table' with a `struct constant_descriptor'
1498 that contains a polish representation of the value of
1499 the constant.
1500
1501 We cannot store the trees in the hash table
1502 because the trees may be temporary. */
1503
1504struct constant_descriptor
1505{
1506 struct constant_descriptor *next;
1507 char *label;
1508 char contents[1];
1509};
1510
1511#define HASHBITS 30
1512#define MAX_HASH_TABLE 1009
1513static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
1514
1515/* Compute a hash code for a constant expression. */
1516
1517int
1518const_hash (exp)
1519 tree exp;
1520{
1521 register char *p;
1522 register int len, hi, i;
1523 register enum tree_code code = TREE_CODE (exp);
1524
1525 if (code == INTEGER_CST)
1526 {
1527 p = (char *) &TREE_INT_CST_LOW (exp);
1528 len = 2 * sizeof TREE_INT_CST_LOW (exp);
1529 }
1530 else if (code == REAL_CST)
1531 {
1532 p = (char *) &TREE_REAL_CST (exp);
1533 len = sizeof TREE_REAL_CST (exp);
1534 }
1535 else if (code == STRING_CST)
1536 p = TREE_STRING_POINTER (exp), len = TREE_STRING_LENGTH (exp);
1537 else if (code == COMPLEX_CST)
1538 return const_hash (TREE_REALPART (exp)) * 5
1539 + const_hash (TREE_IMAGPART (exp));
1540 else if (code == CONSTRUCTOR)
1541 {
1542 register tree link;
1543
1544 /* For record type, include the type in the hashing.
1545 We do not do so for array types
1546 because (1) the sizes of the elements are sufficient
eb528802
RS
1547 and (2) distinct array types can have the same constructor.
1548 Instead, we include the array size because the constructor could
1549 be shorter. */
79e68feb
RS
1550 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1551 hi = ((int) TREE_TYPE (exp) & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
1552 else
eb528802
RS
1553 hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
1554 & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
79e68feb
RS
1555
1556 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
77fa0940
RK
1557 if (TREE_VALUE (link))
1558 hi = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
79e68feb
RS
1559
1560 return hi;
1561 }
1562 else if (code == ADDR_EXPR)
1563 {
1564 struct addr_const value;
1565 decode_addr_const (exp, &value);
1566 if (GET_CODE (value.base) == SYMBOL_REF)
1567 {
1568 /* Don't hash the address of the SYMBOL_REF;
1569 only use the offset and the symbol name. */
1570 hi = value.offset;
1571 p = XSTR (value.base, 0);
1572 for (i = 0; p[i] != 0; i++)
1573 hi = ((hi * 613) + (unsigned)(p[i]));
1574 }
1575 else if (GET_CODE (value.base) == LABEL_REF)
1576 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
1577
1578 hi &= (1 << HASHBITS) - 1;
1579 hi %= MAX_HASH_TABLE;
1580 return hi;
1581 }
1582 else if (code == PLUS_EXPR || code == MINUS_EXPR)
1583 return const_hash (TREE_OPERAND (exp, 0)) * 9
1584 + const_hash (TREE_OPERAND (exp, 1));
1585 else if (code == NOP_EXPR || code == CONVERT_EXPR)
1586 return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
1587
1588 /* Compute hashing function */
1589 hi = len;
1590 for (i = 0; i < len; i++)
1591 hi = ((hi * 613) + (unsigned)(p[i]));
1592
1593 hi &= (1 << HASHBITS) - 1;
1594 hi %= MAX_HASH_TABLE;
1595 return hi;
1596}
1597\f
1598/* Compare a constant expression EXP with a constant-descriptor DESC.
1599 Return 1 if DESC describes a constant with the same value as EXP. */
1600
1601static int
1602compare_constant (exp, desc)
1603 tree exp;
1604 struct constant_descriptor *desc;
1605{
1606 return 0 != compare_constant_1 (exp, desc->contents);
1607}
1608
1609/* Compare constant expression EXP with a substring P of a constant descriptor.
1610 If they match, return a pointer to the end of the substring matched.
1611 If they do not match, return 0.
1612
1613 Since descriptors are written in polish prefix notation,
1614 this function can be used recursively to test one operand of EXP
1615 against a subdescriptor, and if it succeeds it returns the
1616 address of the subdescriptor for the next operand. */
1617
1618static char *
1619compare_constant_1 (exp, p)
1620 tree exp;
1621 char *p;
1622{
1623 register char *strp;
1624 register int len;
1625 register enum tree_code code = TREE_CODE (exp);
1626
1627 if (code != (enum tree_code) *p++)
1628 return 0;
1629
1630 if (code == INTEGER_CST)
1631 {
1632 /* Integer constants are the same only if the same width of type. */
1633 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1634 return 0;
1635 strp = (char *) &TREE_INT_CST_LOW (exp);
1636 len = 2 * sizeof TREE_INT_CST_LOW (exp);
1637 }
1638 else if (code == REAL_CST)
1639 {
1640 /* Real constants are the same only if the same width of type. */
1641 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1642 return 0;
1643 strp = (char *) &TREE_REAL_CST (exp);
1644 len = sizeof TREE_REAL_CST (exp);
1645 }
1646 else if (code == STRING_CST)
1647 {
1648 if (flag_writable_strings)
1649 return 0;
1650 strp = TREE_STRING_POINTER (exp);
1651 len = TREE_STRING_LENGTH (exp);
1652 if (bcmp (&TREE_STRING_LENGTH (exp), p,
1653 sizeof TREE_STRING_LENGTH (exp)))
1654 return 0;
1655 p += sizeof TREE_STRING_LENGTH (exp);
1656 }
1657 else if (code == COMPLEX_CST)
1658 {
1659 p = compare_constant_1 (TREE_REALPART (exp), p);
1660 if (p == 0) return 0;
1661 p = compare_constant_1 (TREE_IMAGPART (exp), p);
1662 return p;
1663 }
1664 else if (code == CONSTRUCTOR)
1665 {
1666 register tree link;
1667 int length = list_length (CONSTRUCTOR_ELTS (exp));
1668 tree type;
1669
1670 if (bcmp (&length, p, sizeof length))
1671 return 0;
1672 p += sizeof length;
1673
1674 /* For record constructors, insist that the types match.
1675 For arrays, just verify both constructors are for arrays. */
1676 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1677 type = TREE_TYPE (exp);
1678 else
1679 type = 0;
1680 if (bcmp (&type, p, sizeof type))
1681 return 0;
1682 p += sizeof type;
1683
eb528802
RS
1684 /* For arrays, insist that the size in bytes match. */
1685 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1686 {
1687 int size = int_size_in_bytes (TREE_TYPE (exp));
1688 if (bcmp (&size, p, sizeof size))
1689 return 0;
1690 p += sizeof size;
1691 }
1692
79e68feb 1693 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
77fa0940
RK
1694 {
1695 if (TREE_VALUE (link))
1696 {
1697 if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
1698 return 0;
1699 }
1700 else
1701 {
1702 tree zero = 0;
1703
1704 if (bcmp (&zero, p, sizeof zero))
1705 return 0;
1706 p += sizeof zero;
1707 }
1708 }
1709
79e68feb
RS
1710 return p;
1711 }
1712 else if (code == ADDR_EXPR)
1713 {
1714 struct addr_const value;
1715 decode_addr_const (exp, &value);
1716 strp = (char *) &value.offset;
1717 len = sizeof value.offset;
1718 /* Compare the offset. */
1719 while (--len >= 0)
1720 if (*p++ != *strp++)
1721 return 0;
1722 /* Compare symbol name. */
1723 strp = XSTR (value.base, 0);
1724 len = strlen (strp) + 1;
1725 }
1726 else if (code == PLUS_EXPR || code == MINUS_EXPR)
1727 {
1728 p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1729 if (p == 0) return 0;
1730 p = compare_constant_1 (TREE_OPERAND (exp, 1), p);
1731 return p;
1732 }
1733 else if (code == NOP_EXPR || code == CONVERT_EXPR)
1734 {
1735 p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1736 return p;
1737 }
1738
1739 /* Compare constant contents. */
1740 while (--len >= 0)
1741 if (*p++ != *strp++)
1742 return 0;
1743
1744 return p;
1745}
1746\f
1747/* Construct a constant descriptor for the expression EXP.
1748 It is up to the caller to enter the descriptor in the hash table. */
1749
1750static struct constant_descriptor *
1751record_constant (exp)
1752 tree exp;
1753{
1754 struct constant_descriptor *ptr = 0;
1755 int buf;
1756
1757 obstack_grow (&permanent_obstack, &ptr, sizeof ptr);
1758 obstack_grow (&permanent_obstack, &buf, sizeof buf);
1759 record_constant_1 (exp);
1760 return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
1761}
1762
1763/* Add a description of constant expression EXP
1764 to the object growing in `permanent_obstack'.
1765 No need to return its address; the caller will get that
1766 from the obstack when the object is complete. */
1767
1768static void
1769record_constant_1 (exp)
1770 tree exp;
1771{
1772 register char *strp;
1773 register int len;
1774 register enum tree_code code = TREE_CODE (exp);
1775
1776 obstack_1grow (&permanent_obstack, (unsigned int) code);
1777
1778 if (code == INTEGER_CST)
1779 {
1780 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1781 strp = (char *) &TREE_INT_CST_LOW (exp);
1782 len = 2 * sizeof TREE_INT_CST_LOW (exp);
1783 }
1784 else if (code == REAL_CST)
1785 {
1786 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1787 strp = (char *) &TREE_REAL_CST (exp);
1788 len = sizeof TREE_REAL_CST (exp);
1789 }
1790 else if (code == STRING_CST)
1791 {
1792 if (flag_writable_strings)
1793 return;
1794 strp = TREE_STRING_POINTER (exp);
1795 len = TREE_STRING_LENGTH (exp);
1796 obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
1797 sizeof TREE_STRING_LENGTH (exp));
1798 }
1799 else if (code == COMPLEX_CST)
1800 {
1801 record_constant_1 (TREE_REALPART (exp));
1802 record_constant_1 (TREE_IMAGPART (exp));
1803 return;
1804 }
1805 else if (code == CONSTRUCTOR)
1806 {
1807 register tree link;
1808 int length = list_length (CONSTRUCTOR_ELTS (exp));
1809 tree type;
1810
1811 obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
1812
1813 /* For record constructors, insist that the types match.
1814 For arrays, just verify both constructors are for arrays. */
1815 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1816 type = TREE_TYPE (exp);
1817 else
1818 type = 0;
1819 obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
1820
eb528802
RS
1821 /* For arrays, insist that the size in bytes match. */
1822 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1823 {
1824 int size = int_size_in_bytes (TREE_TYPE (exp));
1825 obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
1826 }
1827
79e68feb 1828 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
77fa0940
RK
1829 {
1830 if (TREE_VALUE (link))
1831 record_constant_1 (TREE_VALUE (link));
1832 else
1833 {
1834 tree zero = 0;
1835
1836 obstack_grow (&permanent_obstack, (char *) &zero, sizeof zero);
1837 }
1838 }
1839
79e68feb
RS
1840 return;
1841 }
1842 else if (code == ADDR_EXPR)
1843 {
1844 struct addr_const value;
1845 decode_addr_const (exp, &value);
1846 /* Record the offset. */
1847 obstack_grow (&permanent_obstack,
1848 (char *) &value.offset, sizeof value.offset);
1849 /* Record the symbol name. */
1850 obstack_grow (&permanent_obstack, XSTR (value.base, 0),
1851 strlen (XSTR (value.base, 0)) + 1);
1852 return;
1853 }
1854 else if (code == PLUS_EXPR || code == MINUS_EXPR)
1855 {
1856 record_constant_1 (TREE_OPERAND (exp, 0));
1857 record_constant_1 (TREE_OPERAND (exp, 1));
1858 return;
1859 }
1860 else if (code == NOP_EXPR || code == CONVERT_EXPR)
1861 {
1862 record_constant_1 (TREE_OPERAND (exp, 0));
1863 return;
1864 }
1865
1866 /* Record constant contents. */
1867 obstack_grow (&permanent_obstack, strp, len);
1868}
1869\f
1870/* Return an rtx representing a reference to constant data in memory
1871 for the constant expression EXP.
1872 If assembler code for such a constant has already been output,
1873 return an rtx to refer to it.
1874 Otherwise, output such a constant in memory and generate
1875 an rtx for it. The TREE_CST_RTL of EXP is set up to point to that rtx.
1876 The const_hash_table records which constants already have label strings. */
1877
1878rtx
1879output_constant_def (exp)
1880 tree exp;
1881{
1882 register int hash, align;
1883 register struct constant_descriptor *desc;
1884 char label[256];
1885 char *found = 0;
1886 int reloc;
1887 register rtx def;
1888
1889 if (TREE_CODE (exp) == INTEGER_CST)
1890 abort (); /* No TREE_CST_RTL slot in these. */
1891
1892 if (TREE_CST_RTL (exp))
1893 return TREE_CST_RTL (exp);
1894
1895 /* Make sure any other constants whose addresses appear in EXP
1896 are assigned label numbers. */
1897
1898 reloc = output_addressed_constants (exp);
1899
1900 /* Compute hash code of EXP. Search the descriptors for that hash code
1901 to see if any of them describes EXP. If yes, the descriptor records
1902 the label number already assigned. */
1903
1904 hash = const_hash (exp) % MAX_HASH_TABLE;
1905
1906 for (desc = const_hash_table[hash]; desc; desc = desc->next)
1907 if (compare_constant (exp, desc))
1908 {
1909 found = desc->label;
1910 break;
1911 }
1912
1913 if (found == 0)
1914 {
1915 /* No constant equal to EXP is known to have been output.
1916 Make a constant descriptor to enter EXP in the hash table.
1917 Assign the label number and record it in the descriptor for
1918 future calls to this function to find. */
1919
1920 /* Create a string containing the label name, in LABEL. */
1921 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
1922
1923 desc = record_constant (exp);
1924 desc->next = const_hash_table[hash];
1925 desc->label
1926 = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1927 const_hash_table[hash] = desc;
1928 }
1929
1930 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
1931
1932 push_obstacks_nochange ();
1933 if (TREE_PERMANENT (exp))
1934 end_temporary_allocation ();
1935
1936 def = gen_rtx (SYMBOL_REF, Pmode, desc->label);
1937
1938 TREE_CST_RTL (exp)
1939 = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), def);
1940 RTX_UNCHANGING_P (TREE_CST_RTL (exp)) = 1;
dd43f13d
RS
1941 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
1942 || TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1943 MEM_IN_STRUCT_P (TREE_CST_RTL (exp)) = 1;
79e68feb
RS
1944
1945 pop_obstacks ();
1946
1947 /* Optionally set flags or add text to the name to record information
1948 such as that it is a function name. If the name is changed, the macro
1949 ASM_OUTPUT_LABELREF will have to know how to strip this information.
1950 And if it finds a * at the beginning after doing so, it must handle
1951 that too. */
1952#ifdef ENCODE_SECTION_INFO
1953 ENCODE_SECTION_INFO (exp);
1954#endif
1955
1956 if (found == 0)
1957 {
1958 /* Now output assembler code to define that label
1959 and follow it with the data of EXP. */
1960
1961 /* First switch to text section, except for writable strings. */
1962#ifdef SELECT_SECTION
1963 SELECT_SECTION (exp, reloc);
1964#else
1965 if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
1966 || (flag_pic && reloc))
1967 data_section ();
1968 else
1969 readonly_data_section ();
1970#endif
1971
1972 /* Align the location counter as required by EXP's data type. */
1973 align = TYPE_ALIGN (TREE_TYPE (exp));
1974#ifdef CONSTANT_ALIGNMENT
1975 align = CONSTANT_ALIGNMENT (exp, align);
1976#endif
1977
1978 if (align > BITS_PER_UNIT)
1979 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1980
1981 /* Output the label itself. */
1982 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", const_labelno);
1983
1984 /* Output the value of EXP. */
1985 output_constant (exp,
1986 (TREE_CODE (exp) == STRING_CST
1987 ? TREE_STRING_LENGTH (exp)
1988 : int_size_in_bytes (TREE_TYPE (exp))));
1989
1990 ++const_labelno;
1991 }
1992
1993 return TREE_CST_RTL (exp);
1994}
1995\f
1996/* Similar hash facility for making memory-constants
1997 from constant rtl-expressions. It is used on RISC machines
1998 where immediate integer arguments and constant addresses are restricted
1999 so that such constants must be stored in memory.
2000
2001 This pool of constants is reinitialized for each function
2002 so each function gets its own constants-pool that comes right before it.
2003
2004 All structures allocated here are discarded when functions are saved for
2005 inlining, so they do not need to be allocated permanently. */
2006
2007#define MAX_RTX_HASH_TABLE 61
2008static struct constant_descriptor *const_rtx_hash_table[MAX_RTX_HASH_TABLE];
2009
2010/* Structure to represent sufficient information about a constant so that
2011 it can be output when the constant pool is output, so that function
2012 integration can be done, and to simplify handling on machines that reference
2013 constant pool as base+displacement. */
2014
2015struct pool_constant
2016{
2017 struct constant_descriptor *desc;
2018 struct pool_constant *next;
2019 enum machine_mode mode;
2020 rtx constant;
2021 int labelno;
2022 int align;
2023 int offset;
2024};
2025
2026/* Pointers to first and last constant in pool. */
2027
2028static struct pool_constant *first_pool, *last_pool;
2029
2030/* Current offset in constant pool (does not include any machine-specific
2031 header. */
2032
2033static int pool_offset;
2034
2035/* Structure used to maintain hash table mapping symbols used to their
2036 corresponding constants. */
2037
2038struct pool_sym
2039{
2040 char *label;
2041 struct pool_constant *pool;
2042 struct pool_sym *next;
2043};
2044
2045static struct pool_sym *const_rtx_sym_hash_table[MAX_RTX_HASH_TABLE];
2046
2047/* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
2048 The argument is XSTR (... , 0) */
2049
2050#define SYMHASH(LABEL) \
2051 ((((int) (LABEL)) & ((1 << HASHBITS) - 1)) % MAX_RTX_HASH_TABLE)
2052\f
2053/* Initialize constant pool hashing for next function. */
2054
2055void
2056init_const_rtx_hash_table ()
2057{
2058 bzero (const_rtx_hash_table, sizeof const_rtx_hash_table);
2059 bzero (const_rtx_sym_hash_table, sizeof const_rtx_sym_hash_table);
2060
2061 first_pool = last_pool = 0;
2062 pool_offset = 0;
2063}
2064
2065enum kind { RTX_DOUBLE, RTX_INT };
2066
2067struct rtx_const
2068{
2069#ifdef ONLY_INT_FIELDS
2070 unsigned int kind : 16;
2071 unsigned int mode : 16;
2072#else
2073 enum kind kind : 16;
2074 enum machine_mode mode : 16;
2075#endif
2076 union {
2077 union real_extract du;
2078 struct addr_const addr;
2079 } un;
2080};
2081
2082/* Express an rtx for a constant integer (perhaps symbolic)
2083 as the sum of a symbol or label plus an explicit integer.
2084 They are stored into VALUE. */
2085
2086static void
2087decode_rtx_const (mode, x, value)
2088 enum machine_mode mode;
2089 rtx x;
2090 struct rtx_const *value;
2091{
2092 /* Clear the whole structure, including any gaps. */
2093
2094 {
2095 int *p = (int *) value;
2096 int *end = (int *) (value + 1);
2097 while (p < end)
2098 *p++ = 0;
2099 }
2100
2101 value->kind = RTX_INT; /* Most usual kind. */
2102 value->mode = mode;
2103
2104 switch (GET_CODE (x))
2105 {
2106 case CONST_DOUBLE:
2107 value->kind = RTX_DOUBLE;
2108 value->mode = GET_MODE (x);
2109 bcopy (&CONST_DOUBLE_LOW (x), &value->un.du, sizeof value->un.du);
2110 break;
2111
2112 case CONST_INT:
2113 value->un.addr.offset = INTVAL (x);
2114 break;
2115
2116 case SYMBOL_REF:
2117 case LABEL_REF:
2118 value->un.addr.base = x;
2119 break;
2120
2121 case CONST:
2122 x = XEXP (x, 0);
2123 if (GET_CODE (x) == PLUS)
2124 {
2125 value->un.addr.base = XEXP (x, 0);
2126 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2127 abort ();
2128 value->un.addr.offset = INTVAL (XEXP (x, 1));
2129 }
2130 else if (GET_CODE (x) == MINUS)
2131 {
2132 value->un.addr.base = XEXP (x, 0);
2133 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2134 abort ();
2135 value->un.addr.offset = - INTVAL (XEXP (x, 1));
2136 }
2137 else
2138 abort ();
2139 break;
2140
2141 default:
2142 abort ();
2143 }
2144
2145 if (value->kind == RTX_INT && value->un.addr.base != 0)
2146 switch (GET_CODE (value->un.addr.base))
2147 {
2148 case SYMBOL_REF:
2149 case LABEL_REF:
2150 /* Use the string's address, not the SYMBOL_REF's address,
2151 for the sake of addresses of library routines.
2152 For a LABEL_REF, compare labels. */
2153 value->un.addr.base = XEXP (value->un.addr.base, 0);
2154 }
2155}
2156
2157/* Compute a hash code for a constant RTL expression. */
2158
2159int
2160const_hash_rtx (mode, x)
2161 enum machine_mode mode;
2162 rtx x;
2163{
2164 register int hi, i;
2165
2166 struct rtx_const value;
2167 decode_rtx_const (mode, x, &value);
2168
2169 /* Compute hashing function */
2170 hi = 0;
2171 for (i = 0; i < sizeof value / sizeof (int); i++)
2172 hi += ((int *) &value)[i];
2173
2174 hi &= (1 << HASHBITS) - 1;
2175 hi %= MAX_RTX_HASH_TABLE;
2176 return hi;
2177}
2178
2179/* Compare a constant rtl object X with a constant-descriptor DESC.
2180 Return 1 if DESC describes a constant with the same value as X. */
2181
2182static int
2183compare_constant_rtx (mode, x, desc)
2184 enum machine_mode mode;
2185 rtx x;
2186 struct constant_descriptor *desc;
2187{
2188 register int *p = (int *) desc->contents;
2189 register int *strp;
2190 register int len;
2191 struct rtx_const value;
2192
2193 decode_rtx_const (mode, x, &value);
2194 strp = (int *) &value;
2195 len = sizeof value / sizeof (int);
2196
2197 /* Compare constant contents. */
2198 while (--len >= 0)
2199 if (*p++ != *strp++)
2200 return 0;
2201
2202 return 1;
2203}
2204
2205/* Construct a constant descriptor for the rtl-expression X.
2206 It is up to the caller to enter the descriptor in the hash table. */
2207
2208static struct constant_descriptor *
2209record_constant_rtx (mode, x)
2210 enum machine_mode mode;
2211 rtx x;
2212{
2213 struct constant_descriptor *ptr;
2214 char *label;
2215 struct rtx_const value;
2216
2217 decode_rtx_const (mode, x, &value);
2218
2219 obstack_grow (current_obstack, &ptr, sizeof ptr);
2220 obstack_grow (current_obstack, &label, sizeof label);
2221
2222 /* Record constant contents. */
2223 obstack_grow (current_obstack, &value, sizeof value);
2224
2225 return (struct constant_descriptor *) obstack_finish (current_obstack);
2226}
2227\f
2228/* Given a constant rtx X, make (or find) a memory constant for its value
2229 and return a MEM rtx to refer to it in memory. */
2230
2231rtx
2232force_const_mem (mode, x)
2233 enum machine_mode mode;
2234 rtx x;
2235{
2236 register int hash;
2237 register struct constant_descriptor *desc;
2238 char label[256];
2239 char *found = 0;
2240 rtx def;
2241
2242 /* If we want this CONST_DOUBLE in the same mode as it is in memory
2243 (this will always be true for floating CONST_DOUBLEs that have been
2244 placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
2245 use the previous copy. Otherwise, make a new one. Note that in
2246 the unlikely event that this same CONST_DOUBLE is used in two different
2247 modes in an alternating fashion, we will allocate a lot of different
2248 memory locations, but this should be extremely rare. */
2249
2250 if (GET_CODE (x) == CONST_DOUBLE
2251 && GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
2252 && GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
2253 return CONST_DOUBLE_MEM (x);
2254
2255 /* Compute hash code of X. Search the descriptors for that hash code
2256 to see if any of them describes X. If yes, the descriptor records
2257 the label number already assigned. */
2258
2259 hash = const_hash_rtx (mode, x);
2260
2261 for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
2262 if (compare_constant_rtx (mode, x, desc))
2263 {
2264 found = desc->label;
2265 break;
2266 }
2267
2268 if (found == 0)
2269 {
2270 register struct pool_constant *pool;
2271 register struct pool_sym *sym;
2272 int align;
2273
2274 /* No constant equal to X is known to have been output.
2275 Make a constant descriptor to enter X in the hash table.
2276 Assign the label number and record it in the descriptor for
2277 future calls to this function to find. */
2278
2279 desc = record_constant_rtx (mode, x);
2280 desc->next = const_rtx_hash_table[hash];
2281 const_rtx_hash_table[hash] = desc;
2282
2283 /* Align the location counter as required by EXP's data type. */
2284 align = (mode == VOIDmode) ? UNITS_PER_WORD : GET_MODE_SIZE (mode);
2285 if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2286 align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
2287
2288 pool_offset += align - 1;
2289 pool_offset &= ~ (align - 1);
2290
2291 /* Allocate a pool constant descriptor, fill it in, and chain it in. */
2292
2293 pool = (struct pool_constant *) oballoc (sizeof (struct pool_constant));
2294 pool->desc = desc;
2295 pool->constant = x;
2296 pool->mode = mode;
2297 pool->labelno = const_labelno;
2298 pool->align = align;
2299 pool->offset = pool_offset;
2300 pool->next = 0;
2301
2302 if (last_pool == 0)
2303 first_pool = pool;
2304 else
2305 last_pool->next = pool;
2306
2307 last_pool = pool;
2308 pool_offset += GET_MODE_SIZE (mode);
2309
2310 /* Create a string containing the label name, in LABEL. */
2311 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2312
2313 ++const_labelno;
2314
2315 desc->label = found
2316 = (char *) obstack_copy0 (saveable_obstack, label, strlen (label));
2317
2318 /* Add label to symbol hash table. */
2319 hash = SYMHASH (found);
2320 sym = (struct pool_sym *) oballoc (sizeof (struct pool_sym));
2321 sym->label = found;
2322 sym->pool = pool;
2323 sym->next = const_rtx_sym_hash_table[hash];
2324 const_rtx_sym_hash_table[hash] = sym;
2325 }
2326
2327 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2328
2329 def = gen_rtx (MEM, mode, gen_rtx (SYMBOL_REF, Pmode, found));
2330
2331 RTX_UNCHANGING_P (def) = 1;
2332 /* Mark the symbol_ref as belonging to this constants pool. */
2333 CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
2334 current_function_uses_const_pool = 1;
2335
2336 if (GET_CODE (x) == CONST_DOUBLE)
2337 {
2338 if (CONST_DOUBLE_MEM (x) == cc0_rtx)
2339 {
2340 CONST_DOUBLE_CHAIN (x) = const_double_chain;
2341 const_double_chain = x;
2342 }
2343 CONST_DOUBLE_MEM (x) = def;
2344 }
2345
2346 return def;
2347}
2348\f
2349/* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
2350 the corresponding pool_constant structure. */
2351
2352static struct pool_constant *
2353find_pool_constant (addr)
2354 rtx addr;
2355{
2356 struct pool_sym *sym;
2357 char *label = XSTR (addr, 0);
2358
2359 for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; sym = sym->next)
2360 if (sym->label == label)
2361 return sym->pool;
2362
2363 abort ();
2364}
2365
2366/* Given a constant pool SYMBOL_REF, return the corresponding constant. */
2367
2368rtx
2369get_pool_constant (addr)
2370 rtx addr;
2371{
2372 return (find_pool_constant (addr))->constant;
2373}
2374
2375/* Similar, return the mode. */
2376
2377enum machine_mode
2378get_pool_mode (addr)
2379 rtx addr;
2380{
2381 return (find_pool_constant (addr))->mode;
2382}
2383
2384/* Similar, return the offset in the constant pool. */
2385
2386int
2387get_pool_offset (addr)
2388 rtx addr;
2389{
2390 return (find_pool_constant (addr))->offset;
2391}
2392
2393/* Return the size of the constant pool. */
2394
2395int
2396get_pool_size ()
2397{
2398 return pool_offset;
2399}
2400\f
2401/* Write all the constants in the constant pool. */
2402
2403void
2404output_constant_pool (fnname, fndecl)
2405 char *fnname;
2406 tree fndecl;
2407{
2408 struct pool_constant *pool;
2409 rtx x;
2410 union real_extract u;
2411
2412#ifdef ASM_OUTPUT_POOL_PROLOGUE
2413 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
2414#endif
2415
2416 for (pool = first_pool; pool; pool = pool->next)
2417 {
2418 x = pool->constant;
2419
2420 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
2421 whose CODE_LABEL has been deleted. This can occur if a jump table
2422 is eliminated by optimization. If so, write a constant of zero
2423 instead. */
2424 if ((GET_CODE (x) == LABEL_REF && INSN_DELETED_P (XEXP (x, 0)))
2425 || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
2426 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
2427 && INSN_DELETED_P (XEXP (XEXP (XEXP (x, 0), 0), 0))))
2428 x = const0_rtx;
2429
2430 /* First switch to correct section. */
2431#ifdef SELECT_RTX_SECTION
2432 SELECT_RTX_SECTION (pool->mode, x);
2433#else
2434 readonly_data_section ();
2435#endif
2436
2437#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
2438 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
2439 pool->align, pool->labelno, done);
2440#endif
2441
2442 if (pool->align > 1)
2443 ASM_OUTPUT_ALIGN (asm_out_file, exact_log2 (pool->align));
2444
2445 /* Output the label. */
2446 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
2447
2448 /* Output the value of the constant itself. */
2449 switch (GET_MODE_CLASS (pool->mode))
2450 {
2451 case MODE_FLOAT:
2452 if (GET_CODE (x) != CONST_DOUBLE)
2453 abort ();
2454
2455 bcopy (&CONST_DOUBLE_LOW (x), &u, sizeof u);
2456 assemble_real (u.d, pool->mode);
2457 break;
2458
2459 case MODE_INT:
2460 assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
2461 break;
2462
2463 default:
2464 abort ();
2465 }
2466
2467 done: ;
2468 }
2469
2470 /* Done with this pool. */
2471 first_pool = last_pool = 0;
2472}
2473\f
2474/* Find all the constants whose addresses are referenced inside of EXP,
2475 and make sure assembler code with a label has been output for each one.
2476 Indicate whether an ADDR_EXPR has been encountered. */
2477
2478int
2479output_addressed_constants (exp)
2480 tree exp;
2481{
2482 int reloc = 0;
2483
2484 switch (TREE_CODE (exp))
2485 {
2486 case ADDR_EXPR:
2487 {
2488 register tree constant = TREE_OPERAND (exp, 0);
2489
2490 while (TREE_CODE (constant) == COMPONENT_REF)
2491 {
2492 constant = TREE_OPERAND (constant, 0);
2493 }
2494
2495 if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
2496 || TREE_CODE (constant) == CONSTRUCTOR)
2497 /* No need to do anything here
2498 for addresses of variables or functions. */
2499 output_constant_def (constant);
2500 }
2501 reloc = 1;
2502 break;
2503
2504 case PLUS_EXPR:
2505 case MINUS_EXPR:
2506 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2507 reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
2508 break;
2509
2510 case NOP_EXPR:
2511 case CONVERT_EXPR:
2512 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2513 break;
2514
2515 case CONSTRUCTOR:
2516 {
2517 register tree link;
2518 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2519 if (TREE_VALUE (link) != 0)
2520 reloc |= output_addressed_constants (TREE_VALUE (link));
2521 }
2522 break;
2523
2524 case ERROR_MARK:
2525 break;
2526 }
2527 return reloc;
2528}
2529\f
2530/* Output assembler code for constant EXP to FILE, with no label.
2531 This includes the pseudo-op such as ".int" or ".byte", and a newline.
2532 Assumes output_addressed_constants has been done on EXP already.
2533
2534 Generate exactly SIZE bytes of assembler data, padding at the end
2535 with zeros if necessary. SIZE must always be specified.
2536
2537 SIZE is important for structure constructors,
2538 since trailing members may have been omitted from the constructor.
2539 It is also important for initialization of arrays from string constants
2540 since the full length of the string constant might not be wanted.
2541 It is also needed for initialization of unions, where the initializer's
2542 type is just one member, and that may not be as long as the union.
2543
2544 There a case in which we would fail to output exactly SIZE bytes:
2545 for a structure constructor that wants to produce more than SIZE bytes.
2546 But such constructors will never be generated for any possible input. */
2547
2548void
2549output_constant (exp, size)
2550 register tree exp;
2551 register int size;
2552{
2553 register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
2554 rtx x;
2555
2556 if (size == 0)
2557 return;
2558
fff9e713
MT
2559 /* Allow a constructor with no elements for any data type.
2560 This means to fill the space with zeros. */
77fa0940 2561 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
fff9e713
MT
2562 {
2563 assemble_zeros (size);
2564 return;
2565 }
2566
79e68feb
RS
2567 /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
2568 That way we get the constant (we hope) inside it. */
2569 if (TREE_CODE (exp) == NOP_EXPR
2570 && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
2571 exp = TREE_OPERAND (exp, 0);
2572
2573 switch (code)
2574 {
2575 case INTEGER_TYPE:
2576 case ENUMERAL_TYPE:
2577 case POINTER_TYPE:
2578 case REFERENCE_TYPE:
2579 /* ??? What about (int)((float)(int)&foo + 4) */
2580 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
2581 || TREE_CODE (exp) == NON_LVALUE_EXPR)
2582 exp = TREE_OPERAND (exp, 0);
2583
37366632 2584 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
79e68feb
RS
2585 EXPAND_INITIALIZER),
2586 size, 0))
2587 error ("initializer for integer value is too complicated");
2588 size = 0;
2589 break;
2590
2591 case REAL_TYPE:
2592 if (TREE_CODE (exp) != REAL_CST)
2593 error ("initializer for floating value is not a floating constant");
2594
2595 assemble_real (TREE_REAL_CST (exp),
2596 mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
2597 size = 0;
2598 break;
2599
2600 case COMPLEX_TYPE:
2601 output_constant (TREE_REALPART (exp), size / 2);
2602 output_constant (TREE_IMAGPART (exp), size / 2);
2603 size -= (size / 2) * 2;
2604 break;
2605
2606 case ARRAY_TYPE:
2607 if (TREE_CODE (exp) == CONSTRUCTOR)
2608 {
2609 output_constructor (exp, size);
2610 return;
2611 }
2612 else if (TREE_CODE (exp) == STRING_CST)
2613 {
2614 int excess = 0;
2615
2616 if (size > TREE_STRING_LENGTH (exp))
2617 {
2618 excess = size - TREE_STRING_LENGTH (exp);
2619 size = TREE_STRING_LENGTH (exp);
2620 }
2621
2622 assemble_string (TREE_STRING_POINTER (exp), size);
2623 size = excess;
2624 }
2625 else
2626 abort ();
2627 break;
2628
2629 case RECORD_TYPE:
2630 case UNION_TYPE:
2631 if (TREE_CODE (exp) == CONSTRUCTOR)
2632 output_constructor (exp, size);
2633 else
2634 abort ();
2635 return;
2636 }
2637
2638 if (size > 0)
2639 assemble_zeros (size);
2640}
2641\f
2642/* Subroutine of output_constant, used for CONSTRUCTORs
2643 (aggregate constants).
2644 Generate at least SIZE bytes, padding if necessary. */
2645
2646void
2647output_constructor (exp, size)
2648 tree exp;
2649 int size;
2650{
2651 register tree link, field = 0;
2652 /* Number of bytes output or skipped so far.
2653 In other words, current position within the constructor. */
2654 int total_bytes = 0;
2655 /* Non-zero means BYTE contains part of a byte, to be output. */
2656 int byte_buffer_in_use = 0;
2657 register int byte;
2658
37366632 2659 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
79e68feb
RS
2660 abort ();
2661
2662 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2663 field = TYPE_FIELDS (TREE_TYPE (exp));
2664
2665 /* As LINK goes through the elements of the constant,
2666 FIELD goes through the structure fields, if the constant is a structure.
2667 if the constant is a union, then we override this,
2668 by getting the field from the TREE_LIST element.
2669 But the constant could also be an array. Then FIELD is zero. */
2670 for (link = CONSTRUCTOR_ELTS (exp);
2671 link;
2672 link = TREE_CHAIN (link),
2673 field = field ? TREE_CHAIN (field) : 0)
2674 {
2675 tree val = TREE_VALUE (link);
2676 /* the element in a union constructor specifies the proper field. */
2677 if (TREE_PURPOSE (link) != 0)
2678 field = TREE_PURPOSE (link);
2679
2680 /* Eliminate the marker that makes a cast not be an lvalue. */
d964285c
CH
2681 if (val != 0)
2682 STRIP_NOPS (val);
79e68feb
RS
2683
2684 if (field == 0 || !DECL_BIT_FIELD (field))
2685 {
2686 register int fieldsize;
2687 /* Since this structure is static,
2688 we know the positions are constant. */
2689 int bitpos = (field ? (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
2690 / BITS_PER_UNIT)
2691 : 0);
2692
2693 /* An element that is not a bit-field.
2694 Output any buffered-up bit-fields preceding it. */
2695 if (byte_buffer_in_use)
2696 {
2697 ASM_OUTPUT_BYTE (asm_out_file, byte);
2698 total_bytes++;
2699 byte_buffer_in_use = 0;
2700 }
2701
2702 /* Advance to offset of this element.
2703 Note no alignment needed in an array, since that is guaranteed
2704 if each element has the proper size. */
2705 if (field != 0 && bitpos != total_bytes)
2706 {
2707 assemble_zeros (bitpos - total_bytes);
2708 total_bytes = bitpos;
2709 }
2710
2711 /* Determine size this element should occupy. */
2712 if (field)
2713 {
2714 if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
2715 abort ();
2716 if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
2717 {
2718 /* This avoids overflow trouble. */
2719 tree size_tree = size_binop (CEIL_DIV_EXPR,
2720 DECL_SIZE (field),
2721 size_int (BITS_PER_UNIT));
2722 fieldsize = TREE_INT_CST_LOW (size_tree);
2723 }
2724 else
2725 {
2726 fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
2727 fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2728 }
2729 }
2730 else
2731 fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
2732
2733 /* Output the element's initial value. */
2734 if (val == 0)
2735 assemble_zeros (fieldsize);
2736 else
2737 output_constant (val, fieldsize);
2738
2739 /* Count its size. */
2740 total_bytes += fieldsize;
2741 }
2742 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
2743 error ("invalid initial value for member `%s'",
2744 IDENTIFIER_POINTER (DECL_NAME (field)));
2745 else
2746 {
2747 /* Element that is a bit-field. */
2748
2749 int next_offset = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
2750 int end_offset
2751 = (next_offset + TREE_INT_CST_LOW (DECL_SIZE (field)));
2752
2753 if (val == 0)
2754 val = integer_zero_node;
2755
2756 /* If this field does not start in this (or, next) byte,
2757 skip some bytes. */
2758 if (next_offset / BITS_PER_UNIT != total_bytes)
2759 {
2760 /* Output remnant of any bit field in previous bytes. */
2761 if (byte_buffer_in_use)
2762 {
2763 ASM_OUTPUT_BYTE (asm_out_file, byte);
2764 total_bytes++;
2765 byte_buffer_in_use = 0;
2766 }
2767
2768 /* If still not at proper byte, advance to there. */
2769 if (next_offset / BITS_PER_UNIT != total_bytes)
2770 {
2771 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
2772 total_bytes = next_offset / BITS_PER_UNIT;
2773 }
2774 }
2775
2776 if (! byte_buffer_in_use)
2777 byte = 0;
2778
2779 /* We must split the element into pieces that fall within
2780 separate bytes, and combine each byte with previous or
2781 following bit-fields. */
2782
b4ac57ab 2783 /* next_offset is the offset n fbits from the beginning of
79e68feb
RS
2784 the structure to the next bit of this element to be processed.
2785 end_offset is the offset of the first bit past the end of
2786 this element. */
2787 while (next_offset < end_offset)
2788 {
2789 int this_time;
2790 int shift, value;
2791 int next_byte = next_offset / BITS_PER_UNIT;
2792 int next_bit = next_offset % BITS_PER_UNIT;
2793
2794 /* Advance from byte to byte
2795 within this element when necessary. */
2796 while (next_byte != total_bytes)
2797 {
2798 ASM_OUTPUT_BYTE (asm_out_file, byte);
2799 total_bytes++;
2800 byte = 0;
2801 }
2802
2803 /* Number of bits we can process at once
2804 (all part of the same byte). */
2805 this_time = MIN (end_offset - next_offset,
2806 BITS_PER_UNIT - next_bit);
2807#if BYTES_BIG_ENDIAN
2808 /* On big-endian machine, take the most significant bits
2809 first (of the bits that are significant)
2810 and put them into bytes from the most significant end. */
2811 shift = end_offset - next_offset - this_time;
2812 /* Don't try to take a bunch of bits that cross
2813 the word boundary in the INTEGER_CST. */
37366632
RK
2814 if (shift < HOST_BITS_PER_WIDE_INT
2815 && shift + this_time > HOST_BITS_PER_WIDE_INT)
79e68feb 2816 {
37366632
RK
2817 this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2818 shift = HOST_BITS_PER_WIDE_INT;
79e68feb
RS
2819 }
2820
2821 /* Now get the bits from the appropriate constant word. */
37366632 2822 if (shift < HOST_BITS_PER_WIDE_INT)
79e68feb
RS
2823 {
2824 value = TREE_INT_CST_LOW (val);
2825 }
37366632 2826 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
79e68feb
RS
2827 {
2828 value = TREE_INT_CST_HIGH (val);
37366632 2829 shift -= HOST_BITS_PER_WIDE_INT;
79e68feb
RS
2830 }
2831 else
2832 abort ();
37366632
RK
2833 byte |= (((value >> shift)
2834 & (((HOST_WIDE_INT) 1 << this_time) - 1))
79e68feb
RS
2835 << (BITS_PER_UNIT - this_time - next_bit));
2836#else
2837 /* On little-endian machines,
2838 take first the least significant bits of the value
2839 and pack them starting at the least significant
2840 bits of the bytes. */
2841 shift = (next_offset
2842 - TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
2843 /* Don't try to take a bunch of bits that cross
2844 the word boundary in the INTEGER_CST. */
37366632
RK
2845 if (shift < HOST_BITS_PER_WIDE_INT
2846 && shift + this_time > HOST_BITS_PER_WIDE_INT)
79e68feb 2847 {
37366632
RK
2848 this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2849 shift = HOST_BITS_PER_WIDE_INT;
79e68feb
RS
2850 }
2851
2852 /* Now get the bits from the appropriate constant word. */
2853 if (shift < HOST_BITS_PER_INT)
2854 value = TREE_INT_CST_LOW (val);
37366632 2855 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
79e68feb
RS
2856 {
2857 value = TREE_INT_CST_HIGH (val);
37366632 2858 shift -= HOST_BITS_PER_WIDE_INT;
79e68feb
RS
2859 }
2860 else
2861 abort ();
37366632
RK
2862 byte |= ((value >> shift)
2863 & (((HOST_WIDE_INT) 1 << this_time) - 1)) << next_bit;
79e68feb
RS
2864#endif
2865 next_offset += this_time;
2866 byte_buffer_in_use = 1;
2867 }
2868 }
2869 }
2870 if (byte_buffer_in_use)
2871 {
2872 ASM_OUTPUT_BYTE (asm_out_file, byte);
2873 total_bytes++;
2874 }
2875 if (total_bytes < size)
2876 assemble_zeros (size - total_bytes);
2877}
This page took 0.623361 seconds and 5 git commands to generate.