static void remove_from_pending_weak_list	PROTO ((char *));
static const char *strip_reg_name	PROTO((const char *));static int contains_pointers_p		PROTO((tree));static void decode_addr_const		PROTO((tree, struct addr_const *));static int const_hash			PROTO((tree));static int compare_constant		PROTO((tree,					       struct constant_descriptor *));static char *compare_constant_1		PROTO((tree, char *));static struct constant_descriptor *record_constant PROTO((tree));static void record_constant_1		PROTO((tree));static tree copy_constant		PROTO((tree));static void output_constant_def_contents  PROTO((tree, int, int));static void decode_rtx_const		PROTO((enum machine_mode, rtx,					       struct rtx_const *));static int const_hash_rtx		PROTO((enum machine_mode, rtx));static int compare_constant_rtx		PROTO((enum machine_mode, rtx,					       struct constant_descriptor *));static struct constant_descriptor *record_constant_rtx PROTO((enum machine_mode,							      rtx));static struct pool_constant *find_pool_constant PROTO((rtx));static void mark_constant_pool		PROTO((void));static void mark_constants		PROTO((rtx));static int output_addressed_constants	PROTO((tree));static void output_after_function_constants PROTO((void));static void output_constructor		PROTO((tree, int));#ifdef ASM_OUTPUT_BSSstatic void asm_output_bss		PROTO((FILE *, tree, char *, int, int));#endif#ifdef BSS_SECTION_ASM_OP#ifdef ASM_OUTPUT_ALIGNED_BSSstatic void asm_output_aligned_bss	PROTO((FILE *, tree, char *, int, int));#endif#endif /* BSS_SECTION_ASM_OP */static enum in_section { no_section, in_text, in_data, in_named#ifdef BSS_SECTION_ASM_OP  , in_bss#endif#ifdef EH_FRAME_SECTION_ASM_OP  , in_eh_frame#endif#ifdef EXTRA_SECTIONS  , EXTRA_SECTIONS#endif} in_section = no_section;/* Return a non-zero value if DECL has a section attribute.  */#define IN_NAMED_SECTION(DECL) \  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \   && DECL_SECTION_NAME (DECL) != NULL_TREE)/* Text of section name when in_section == in_named.  */static char *in_named_name;/* Define functions like text_section for any extra sections.  */#ifdef EXTRA_SECTION_FUNCTIONSEXTRA_SECTION_FUNCTIONS#endif/* Tell assembler to switch to text section.  */voidtext_section (){  if (in_section != in_text)    {      fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);      in_section = in_text;    }}/* Tell assembler to switch to data section.  */voiddata_section (){  if (in_section != in_data)    {      if (flag_shared_data)	{#ifdef SHARED_SECTION_ASM_OP	  fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);#else	  fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);#endif	}      else	fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);      in_section = in_data;    }}/* Tell assembler to ALWAYS switch to data section, in case   it's not sure where it it.  */voidforce_data_section (){  in_section = no_section;  data_section ();}/* Tell assembler to switch to read-only data section.  This is normally   the text section.  */voidreadonly_data_section (){#ifdef READONLY_DATA_SECTION  READONLY_DATA_SECTION ();  /* Note this can call data_section.  */#else  text_section ();#endif}/* Determine if we're in the text section.  */intin_text_section (){  return in_section == in_text;}/* Determine if we're in the data section.  */intin_data_section (){  return in_section == in_data;}/* Tell assembler to change to section NAME for DECL.   If DECL is NULL, just switch to section NAME.   If NAME is NULL, get the name from DECL.   If RELOC is 1, the initializer for DECL contains relocs.  */voidnamed_section (decl, name, reloc)     tree decl;     const char *name;     int reloc ATTRIBUTE_UNUSED;{  if (decl != NULL_TREE      && TREE_CODE_CLASS (TREE_CODE (decl)) != 'd')    abort ();  if (name == NULL)    name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));  if (in_section != in_named || strcmp (name, in_named_name))    {#ifdef ASM_OUTPUT_SECTION_NAME      ASM_OUTPUT_SECTION_NAME (asm_out_file, decl, name, reloc);#else      /* Section attributes are not supported if this macro isn't provided -	 some host formats don't support them at all.  The front-end should	 already have flagged this as an error.  */      abort ();#endif      in_named_name = obstack_alloc (&permanent_obstack, strlen (name) + 1);      strcpy (in_named_name, name);      in_section = in_named;    }}#ifdef ASM_OUTPUT_SECTION_NAME#ifndef UNIQUE_SECTION#define UNIQUE_SECTION(DECL,RELOC)				\do {								\  int len;							\  char *name, *string;						\								\  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL));	\  /* Strip off any encoding in name.  */			\  STRIP_NAME_ENCODING (name, name);				\								\  len = strlen (name) + 1;					\  string = alloca (len + 1);					\  sprintf (string, ".%s", name);				\								\  DECL_SECTION_NAME (DECL) = build_string (len, string);	\} while (0)#endif#ifndef UNIQUE_SECTION_P#define UNIQUE_SECTION_P(DECL) 0#endif#endif#ifdef BSS_SECTION_ASM_OP/* Tell the assembler to switch to the bss section.  */voidbss_section (){  if (in_section != in_bss)    {#ifdef SHARED_BSS_SECTION_ASM_OP      if (flag_shared_data)	fprintf (asm_out_file, "%s\n", SHARED_BSS_SECTION_ASM_OP);      else#endif	fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);      in_section = in_bss;    }}#ifdef ASM_OUTPUT_BSS/* Utility function for ASM_OUTPUT_BSS for targets to use if   they don't support alignments in .bss.   ??? It is believed that this function will work in most cases so such   support is localized here.  */static voidasm_output_bss (file, decl, name, size, rounded)     FILE *file;     tree decl;     char *name;     int size, rounded;{  ASM_GLOBALIZE_LABEL (file, name);  bss_section ();#ifdef ASM_DECLARE_OBJECT_NAME  last_assemble_variable_decl = decl;  ASM_DECLARE_OBJECT_NAME (file, name, decl);#else  /* Standard thing is just output label for the object.  */  ASM_OUTPUT_LABEL (file, name);#endif /* ASM_DECLARE_OBJECT_NAME */  ASM_OUTPUT_SKIP (file, rounded);}#endif#ifdef ASM_OUTPUT_ALIGNED_BSS/* Utility function for targets to use in implementing   ASM_OUTPUT_ALIGNED_BSS.   ??? It is believed that this function will work in most cases so such   support is localized here.  */static voidasm_output_aligned_bss (file, decl, name, size, align)     FILE *file;     tree decl;     char *name;     int size, align;{  ASM_GLOBALIZE_LABEL (file, name);  bss_section ();  ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));#ifdef ASM_DECLARE_OBJECT_NAME  last_assemble_variable_decl = decl;  ASM_DECLARE_OBJECT_NAME (file, name, decl);#else  /* Standard thing is just output label for the object.  */  ASM_OUTPUT_LABEL (file, name);#endif /* ASM_DECLARE_OBJECT_NAME */  ASM_OUTPUT_SKIP (file, size ? size : 1);}#endif#endif /* BSS_SECTION_ASM_OP */#ifdef EH_FRAME_SECTION_ASM_OPvoideh_frame_section (){  if (in_section != in_eh_frame)    {      fprintf (asm_out_file, "%s\n", EH_FRAME_SECTION_ASM_OP);      in_section = in_eh_frame;    }} #endif/* Switch to the section for function DECL.   If DECL is NULL_TREE, switch to the text section.   ??? It's not clear that we will ever be passed NULL_TREE, but it's   safer to handle it.  */voidfunction_section (decl)     tree decl;{  if (decl != NULL_TREE      && DECL_SECTION_NAME (decl) != NULL_TREE)    named_section (decl, (char *) 0, 0);  else    text_section ();}/* Switch to section for variable DECL.   RELOC is the `reloc' argument to SELECT_SECTION.  */voidvariable_section (decl, reloc)     tree decl;     int reloc;{  if (IN_NAMED_SECTION (decl))    named_section (decl, NULL, reloc);  else    {      /* C++ can have const variables that get initialized from constructors,	 and thus can not be in a readonly section.  We prevent this by	 verifying that the initial value is constant for objects put in a	 readonly section.	 error_mark_node is used by the C front end to indicate that the	 initializer has not been seen yet.  In this case, we assume that	 the initializer must be constant.	 C++ uses error_mark_node for variables that have complicated	 initializers, but these variables go in BSS so we won't be called	 for them.  */#ifdef SELECT_SECTION      SELECT_SECTION (decl, reloc);#else      if (DECL_READONLY_SECTION (decl, reloc))	readonly_data_section ();      else	data_section ();#endif    }}/* Tell assembler to switch to the section for the exception handling   table.  */voidexception_section (){#if defined (EXCEPTION_SECTION)  EXCEPTION_SECTION ();#else#ifdef ASM_OUTPUT_SECTION_NAME  named_section (NULL_TREE, ".gcc_except_table", 0);#else  if (flag_pic)    data_section ();  else    readonly_data_section ();#endif#endif}/* Create the rtl to represent a function, for a function definition.   DECL is a FUNCTION_DECL node which describes which function.   The rtl is stored into DECL.  */voidmake_function_rtl (decl)     tree decl;{  char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));  char *new_name = name;  /* Rename a nested function to avoid conflicts.  */  if (decl_function_context (decl) != 0      && DECL_INITIAL (decl) != 0      && DECL_RTL (decl) == 0)    {      char *label;      name = IDENTIFIER_POINTER (DECL_NAME (decl));      ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);      name = obstack_copy0 (saveable_obstack, label, strlen (label));      var_labelno++;    }  else    {      /* When -fprefix-function-name is used, every function name is         prefixed.  Even static functions are prefixed because they         could be declared latter.  Note that a nested function name         is not prefixed.  */      if (flag_prefix_function_name)        {          new_name = (char *) alloca (strlen (name) + CHKR_PREFIX_SIZE + 1);          strcpy (new_name, CHKR_PREFIX);          strcpy (new_name + CHKR_PREFIX_SIZE, name);          name = obstack_copy0 (saveable_obstack, new_name, strlen (new_name));        }    }  if (DECL_RTL (decl) == 0)    {      DECL_RTL (decl)	= gen_rtx_MEM (DECL_MODE (decl),		       gen_rtx_SYMBOL_REF (Pmode, name));      /* Optionally set flags or add text to the name to record information	 such as that it is a function name.  If the name is changed, the macro	 ASM_OUTPUT_LABELREF will have to know how to strip this information.  */#ifdef ENCODE_SECTION_INFO      ENCODE_SECTION_INFO (decl);#endif    }  else    {      /* ??? Another way to do this would be to do what halfpic.c does	 and maintain a hashed table of such critters.  */      /* ??? Another way to do this would be to pass a flag bit to	 ENCODE_SECTION_INFO saying whether this is a new decl or not.  */      /* Let the target reassign the RTL if it wants.	 This is necessary, for example, when one machine specific	 decl attribute overrides another.  */#ifdef REDO_SECTION_INFO_P      if (REDO_SECTION_INFO_P (decl))	ENCODE_SECTION_INFO (decl);#endif    }  /* Record at least one function has been defined.  */  function_defined = 1;}/* Given NAME, a putative register name, discard any customary prefixes.  */static const char *strip_reg_name (name)  const char *name;{#ifdef REGISTER_PREFIX  if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))    name += strlen (REGISTER_PREFIX);#endif  if (name[0] == '%' || name[0] == '#')    name++;  return name;}