]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
target.h (gcc_target): Add asm_out.named_section, section_type_flags, have_named_sect...
authorRichard Henderson <rth@redhat.com>
Sat, 4 Aug 2001 01:31:41 +0000 (18:31 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 4 Aug 2001 01:31:41 +0000 (18:31 -0700)
* target.h (gcc_target): Add asm_out.named_section,
section_type_flags, have_named_sections.
* target-def.h (TARGET_ASM_NAMED_SECTION): New.
(TARGET_HAVE_NAMED_SECTIONS): New.
(TARGET_SECTION_TYPE_FLAGS): New.

* Makefile.in (toplev.o): Depend on TARGET_H.
(varasm.o, dbxout.o): Likewise.
* c-common.c (decl_attributes): Check targetm.have_named_sections
instead of ifdef ASM_OUTPUT_SECTION_NAME.
* dbxout.c (dbxout_function_decl): Likewise.
(dbxout_function_end): Likewise.
* toplev.c (compile_file): Likewise.
* varasm.c (exception_section): Likewise.
* cp/decl2.c (finish_objects): Likewise.

* defaults.h (EH_FRAME_SECTION): Remove.
(EH_FRAME_SECTION_ASM_OP): Remove.
(EH_FRAME_SECTION_NAME): New.
(UNIQUE_SECTION): Don't depend on ASM_OUTPUT_SECTION_NAME.
(UNIQUE_SECTION_P): Remove.
* dwarf2out.c (SECTION_FORMAT): Remove.
(ASM_OUTPUT_SECTION): Remove.
(output_call_frame_info): Use named_section_flags.
(output_comp_unit, dwarf2out_start_source_file): Likewise.
(dwarf2out_end_source_file, dwarf2out_define): Likewise.
(dwarf2out_undef, dwarf2out_init, dwarf2out_finish): Likewise.
* varasm.c (in_eh_frame, eh_frame_section): Remove.
(named_section_flags): New.
(named_section): Use it and targetm.section_type_flags.
(resolve_unique_section): New.
(assemble_start_function): Use it.
(asm_emit_uninitialised, assemble_variable): Likewise.
(default_section_type_flags): New.
(default_no_named_section, default_elf_asm_named_section): New.
(default_coff_asm_named_section, default_pe_asm_named_section): New.
* output.h: Update varasm.c decls.
(SECTION_*): New flags.

* crtstuff.c: Check EH_FRAME_SECTION_NAME not EH_FRAME_SECTION_ASM_OP.
(__EH_FRAME_BEGIN__, __FRAME_END__): Use attribute section.

* config/elfos.h (UNIQUE_SECTION_P): Remove.
* config/alpha/elf.h, config/arm/linux-elf.h: Likewise.
* config/arm/pe.h, config/arm/unknown-elf.h: Likewise.
* config/i386/cygwin.h, config/i386/djgpp.h: Likewise.
* config/i386/i386-interix.h, config/i386/win32.h: Likewise.
* config/ia64/sysv4.h, config/mcore/mcore-pe.h: Likewise.
* config/mips/elf.h, config/mips/elf64.h: Likewise.
* config/mips/iris6gld.h, config/mips/mips.h: Likewise.
* config/pa/pa64-hpux.h,

* config/elfos.h (ASM_OUTPUT_SECTION_NAME): Remove.
(TARGET_ASM_NAMED_SECTION): New.
* config/psos.h, config/a29k/a29k.h, config/alpha/elf.h: Likewise.
* config/alpha/vms.h, config/arm/coff.h: Likewise.
* config/arm/conix-elf.h, config/arm/elf.h: Likewise.
* config/arm/linux-elf.h, config/arm/pe.h: Likewise.
* config/arm/unknown-elf.h, config/avr/avr.h: Likewise.
* config/c4x/c4x.h, config/h8300/h8300.h: Likewise.
* config/i386/cygwin.h, config/i386/djgpp.h: Likewise.
* config/i386/i386-interix.h, config/i386/i386elf.h : Likewise.
* config/i386/sco5.h, config/i386/win32.h: Likewise.
* config/m68k/coff.h, config/mcore/mcore-pe.h: Likewise.
* config/mcore/mcore.h, config/mips/elf.h: Likewise.
* config/mips/elf64.h, config/mips/iris6.h: Likewise.
* config/mips/netbsd.h, config/mips/openbsd.h: Likewise.
* config/pa/pa64-hpux.h, config/rs6000/sysv4.h: Likewise.
* config/rs6000/xcoff.h, config/sh/sh.h: Likewise.
* config/sparc/sysv4.h: Likewise.

* config/nextstep.h: Error until named sections implemented.

* config/a29k/a29k.c (a29k_asm_named_section): New.
* config/alpha/alpha.c (SECTION_VMS_OVERLAY): New.
(vms_section_type_flags, vms_asm_named_section): New.
* config/arm/arm.c (arm_elf_asm_named_section): New.
* config/avr/avr.c (asm_output_section_name): Remove.
* config/avr/avr-protos.h: Update.
* config/c4x/c4x.c (c4x_asm_named_section): New.
* config/h8300/h8300.c (h8300_asm_named_section): New.
* config/i386/i386.c (sco_asm_named_section): New.
* config/i386/winnt.c (SECTION_PE_SHARED): New.
(i386_pe_section_type_flags): New.
(i386_pe_asm_named_section): New.
* config/i386/i386-protos.h: Update.
* config/m68k/m68k.c (m68k_coff_asm_named_section): New.
* config/mcore/mcore.c (mcore_asm_named_section): New.
* config/mips/mips.c (iris6_asm_named_section): New.
* config/mips/mips.h (ENCODE_SECTION_INFO): Use DECL_ONE_ONLY
instead of UNIQUE_SECTION_P.
* config/rs6000/rs6000.c (rs6000_elf_section_type_flags): New.
(xcoff_asm_named_section): New.
* config/sh/sh.c (sh_asm_named_section): New.
* config/sparc/sparc.c (sparc_elf_asm_named_section): New.

* config/i386/djgpp.h (EH_FRAME_SECTION_ASM_OP): Remove.
* config/i386/sco5.h (EH_FRAME_SECTION_ASM_OP*): Remove.
(EH_FRAME_SECTION_NAME): New.
(EXCEPTION_SECTION): New.
* config/ia64/ia64.h (EH_FRAME_SECTION_ASM_OP): Remove.
(DEBUG_*_SECTION): Remove.
* config/m68k/rtemself.h (EH_FRAME_SECTION_ASM_OP): Remove.
* config/mips/iris6.h (DEBUG_*_SECTION): Remove.
(EH_FRAME_SECTION_ASM_OP): Remove.

* doc/tm.texi (UNIQUE_SECTION_P): Remove.
(ASM_OUTPUT_SECTION_NAME): Remove.
(TARGET_ASM_NAMED_SECTION): New.
(TARGET_HAVE_NAMED_SECTIONS): New.
(TARGET_SECTION_TYPE_FLAGS): New.
(EH_FRAME_SECTION_ASM_OP): Remove.
(EH_FRAME_SECTION_NAME): New.

From-SVN: r44623

72 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/c-common.c
gcc/config/a29k/a29k.c
gcc/config/a29k/a29k.h
gcc/config/alpha/alpha.c
gcc/config/alpha/elf.h
gcc/config/alpha/vms.h
gcc/config/arm/arm.c
gcc/config/arm/coff.h
gcc/config/arm/conix-elf.h
gcc/config/arm/elf.h
gcc/config/arm/linux-elf.h
gcc/config/arm/pe.h
gcc/config/arm/unknown-elf.h
gcc/config/avr/avr-protos.h
gcc/config/avr/avr.c
gcc/config/avr/avr.h
gcc/config/c4x/c4x.c
gcc/config/c4x/c4x.h
gcc/config/d30v/d30v.h
gcc/config/elfos.h
gcc/config/h8300/h8300.c
gcc/config/h8300/h8300.h
gcc/config/i386/cygwin.h
gcc/config/i386/djgpp.h
gcc/config/i386/i386-interix.h
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386elf.h
gcc/config/i386/sco5.h
gcc/config/i386/win32.h
gcc/config/i386/winnt.c
gcc/config/ia64/ia64.h
gcc/config/ia64/sysv4.h
gcc/config/m68k/coff.h
gcc/config/m68k/m68k.c
gcc/config/m68k/rtemself.h
gcc/config/m88k/m88k.h
gcc/config/mcore/mcore-pe.h
gcc/config/mcore/mcore.c
gcc/config/mcore/mcore.h
gcc/config/mips/elf.h
gcc/config/mips/elf64.h
gcc/config/mips/iris6.h
gcc/config/mips/iris6gld.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/mips/netbsd.h
gcc/config/mips/openbsd.h
gcc/config/nextstep.h
gcc/config/pa/pa64-hpux.h
gcc/config/psos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/sysv4.h
gcc/config/rs6000/xcoff.h
gcc/config/sh/elf.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sparc/sparc.c
gcc/config/sparc/sysv4.h
gcc/cp/decl2.c
gcc/crtstuff.c
gcc/dbxout.c
gcc/defaults.h
gcc/doc/tm.texi
gcc/dwarf2out.c
gcc/output.h
gcc/target-def.h
gcc/target.h
gcc/toplev.c
gcc/varasm.c

index 40acfdf77e14bbc7811c71028da7de96d727645b..c88ff2386e689199a9b4a5c209bae9a486193e4c 100644 (file)
@@ -1,3 +1,119 @@
+2001-08-03  Richard Henderson  <rth@redhat.com>
+
+       * target.h (gcc_target): Add asm_out.named_section, 
+       section_type_flags, have_named_sections.
+       * target-def.h (TARGET_ASM_NAMED_SECTION): New.
+       (TARGET_HAVE_NAMED_SECTIONS): New.
+       (TARGET_SECTION_TYPE_FLAGS): New.
+
+       * Makefile.in (toplev.o): Depend on TARGET_H.
+       (varasm.o, dbxout.o): Likewise.
+       * c-common.c (decl_attributes): Check targetm.have_named_sections
+       instead of ifdef ASM_OUTPUT_SECTION_NAME.
+       * dbxout.c (dbxout_function_decl): Likewise.
+       (dbxout_function_end): Likewise.
+       * toplev.c (compile_file): Likewise.
+       * varasm.c (exception_section): Likewise.
+       * cp/decl2.c (finish_objects): Likewise.
+
+       * defaults.h (EH_FRAME_SECTION): Remove.
+       (EH_FRAME_SECTION_ASM_OP): Remove.
+       (EH_FRAME_SECTION_NAME): New.
+       (UNIQUE_SECTION): Don't depend on ASM_OUTPUT_SECTION_NAME.
+       (UNIQUE_SECTION_P): Remove.
+       * dwarf2out.c (SECTION_FORMAT): Remove.
+       (ASM_OUTPUT_SECTION): Remove.
+       (output_call_frame_info): Use named_section_flags.
+       (output_comp_unit, dwarf2out_start_source_file): Likewise.
+       (dwarf2out_end_source_file, dwarf2out_define): Likewise.
+       (dwarf2out_undef, dwarf2out_init, dwarf2out_finish): Likewise.
+       * varasm.c (in_eh_frame, eh_frame_section): Remove.
+       (named_section_flags): New.
+       (named_section): Use it and targetm.section_type_flags.
+       (resolve_unique_section): New.
+       (assemble_start_function): Use it.
+       (asm_emit_uninitialised, assemble_variable): Likewise.
+       (default_section_type_flags): New.
+       (default_no_named_section, default_elf_asm_named_section): New.
+       (default_coff_asm_named_section, default_pe_asm_named_section): New.
+       * output.h: Update varasm.c decls.
+       (SECTION_*): New flags.
+
+       * crtstuff.c: Check EH_FRAME_SECTION_NAME not EH_FRAME_SECTION_ASM_OP.
+       (__EH_FRAME_BEGIN__, __FRAME_END__): Use attribute section.
+
+       * config/elfos.h (UNIQUE_SECTION_P): Remove.
+       * config/alpha/elf.h, config/arm/linux-elf.h: Likewise.
+       * config/arm/pe.h, config/arm/unknown-elf.h: Likewise.
+       * config/i386/cygwin.h, config/i386/djgpp.h: Likewise.
+       * config/i386/i386-interix.h, config/i386/win32.h: Likewise.
+       * config/ia64/sysv4.h, config/mcore/mcore-pe.h: Likewise.
+       * config/mips/elf.h, config/mips/elf64.h: Likewise.
+       * config/mips/iris6gld.h, config/mips/mips.h: Likewise.
+       * config/pa/pa64-hpux.h, 
+
+       * config/elfos.h (ASM_OUTPUT_SECTION_NAME): Remove.
+       (TARGET_ASM_NAMED_SECTION): New.
+       * config/psos.h, config/a29k/a29k.h, config/alpha/elf.h: Likewise.
+       * config/alpha/vms.h, config/arm/coff.h: Likewise.
+       * config/arm/conix-elf.h, config/arm/elf.h: Likewise.
+       * config/arm/linux-elf.h, config/arm/pe.h: Likewise.
+       * config/arm/unknown-elf.h, config/avr/avr.h: Likewise.
+       * config/c4x/c4x.h, config/h8300/h8300.h: Likewise.
+       * config/i386/cygwin.h, config/i386/djgpp.h: Likewise.
+       * config/i386/i386-interix.h, config/i386/i386elf.h : Likewise.
+       * config/i386/sco5.h, config/i386/win32.h: Likewise.
+       * config/m68k/coff.h, config/mcore/mcore-pe.h: Likewise.
+       * config/mcore/mcore.h, config/mips/elf.h: Likewise.
+       * config/mips/elf64.h, config/mips/iris6.h: Likewise.
+       * config/mips/netbsd.h, config/mips/openbsd.h: Likewise.
+       * config/pa/pa64-hpux.h, config/rs6000/sysv4.h: Likewise.
+       * config/rs6000/xcoff.h, config/sh/sh.h: Likewise.
+       * config/sparc/sysv4.h: Likewise.
+
+       * config/nextstep.h: Error until named sections implemented.
+
+       * config/a29k/a29k.c (a29k_asm_named_section): New.
+       * config/alpha/alpha.c (SECTION_VMS_OVERLAY): New.
+       (vms_section_type_flags, vms_asm_named_section): New.
+       * config/arm/arm.c (arm_elf_asm_named_section): New.
+       * config/avr/avr.c (asm_output_section_name): Remove.
+       * config/avr/avr-protos.h: Update.
+       * config/c4x/c4x.c (c4x_asm_named_section): New.
+       * config/h8300/h8300.c (h8300_asm_named_section): New.
+       * config/i386/i386.c (sco_asm_named_section): New.
+       * config/i386/winnt.c (SECTION_PE_SHARED): New.
+       (i386_pe_section_type_flags): New.
+       (i386_pe_asm_named_section): New.
+       * config/i386/i386-protos.h: Update.
+       * config/m68k/m68k.c (m68k_coff_asm_named_section): New.
+       * config/mcore/mcore.c (mcore_asm_named_section): New.
+       * config/mips/mips.c (iris6_asm_named_section): New.
+       * config/mips/mips.h (ENCODE_SECTION_INFO): Use DECL_ONE_ONLY
+       instead of UNIQUE_SECTION_P.
+       * config/rs6000/rs6000.c (rs6000_elf_section_type_flags): New.
+       (xcoff_asm_named_section): New.
+       * config/sh/sh.c (sh_asm_named_section): New.
+       * config/sparc/sparc.c (sparc_elf_asm_named_section): New.
+
+       * config/i386/djgpp.h (EH_FRAME_SECTION_ASM_OP): Remove.
+       * config/i386/sco5.h (EH_FRAME_SECTION_ASM_OP*): Remove.
+       (EH_FRAME_SECTION_NAME): New.
+       (EXCEPTION_SECTION): New.
+       * config/ia64/ia64.h (EH_FRAME_SECTION_ASM_OP): Remove.
+       (DEBUG_*_SECTION): Remove.
+       * config/m68k/rtemself.h (EH_FRAME_SECTION_ASM_OP): Remove.
+       * config/mips/iris6.h (DEBUG_*_SECTION): Remove.
+       (EH_FRAME_SECTION_ASM_OP): Remove.
+
+       * doc/tm.texi (UNIQUE_SECTION_P): Remove.
+       (ASM_OUTPUT_SECTION_NAME): Remove.
+       (TARGET_ASM_NAMED_SECTION): New.
+       (TARGET_HAVE_NAMED_SECTIONS): New.
+       (TARGET_SECTION_TYPE_FLAGS): New.
+       (EH_FRAME_SECTION_ASM_OP): Remove.
+       (EH_FRAME_SECTION_NAME): New.
+
 2001-08-03  Zack Weinberg  <zackw@stanford.edu>
 
        * builtins.c (fold_builtin_constant_p): Return integer_zero_node
index c465c9c3b0824e2fb94367f4e1fe1468064f9cbe..cdb68f7b357cf3a4f20ce593ee41eddf3e27f1a8 100644 (file)
@@ -1357,7 +1357,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) function.h \
    debug.h insn-config.h intl.h $(RECOG_H) Makefile toplev.h \
    dwarf2out.h sdbout.h dbxout.h $(EXPR_H) hard-reg-set.h $(BASIC_BLOCK_H) \
    graph.h $(LOOP_H) except.h $(REGS_H) $(TIMEVAR_H) $(lang_options_files) \
-   ssa.h $(PARAMS_H) $(TM_P_H) reload.h dwarf2asm.h
+   ssa.h $(PARAMS_H) $(TM_P_H) reload.h dwarf2asm.h $(TARGET_H)
        $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(MAYBE_USE_COLLECT2) \
          -DTARGET_NAME=\"$(target_alias)\" \
          -c $(srcdir)/toplev.c
@@ -1377,7 +1377,7 @@ errors.o : errors.c $(GCONFIG_H) $(SYSTEM_H) errors.h
 varasm.o : varasm.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
    function.h $(EXPR_H) hard-reg-set.h $(REGS_H) $(OBSTACK_H) \
    output.h c-pragma.h toplev.h xcoffout.h debug.h $(GGC_H) $(TM_P_H) \
-   $(HASHTAB_H)
+   $(HASHTAB_H) $(TARGET_H)
 function.o : function.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
    function.h $(EXPR_H) $(REGS_H) hard-reg-set.h \
    insn-config.h $(RECOG_H) output.h toplev.h except.h hash.h $(GGC_H) $(TM_P_H)
@@ -1408,7 +1408,7 @@ optabs.o : optabs.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h  \
    insn-config.h $(EXPR_H) $(RECOG_H) reload.h \
    toplev.h $(GGC_H) real.h $(TM_P_H) except.h
 dbxout.o : dbxout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
-    $(REGS_H) debug.h $(TM_P_H) \
+    $(REGS_H) debug.h $(TM_P_H) $(TARGET_H) \
    insn-config.h reload.h gstab.h xcoffout.h output.h dbxout.h toplev.h
 debug.o : debug.c $(CONFIG_H) $(SYSTEM_H)
 sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
index 59be405120e5913491b4422747e7652e0eb7ffa5..dc5ff8fdad16bf27f72e0bdebfab52be98c1fda6 100644 (file)
@@ -971,33 +971,34 @@ decl_attributes (node, attributes, flags)
          break;
 
        case A_SECTION:
-#ifdef ASM_OUTPUT_SECTION_NAME
-         if ((TREE_CODE (decl) == FUNCTION_DECL
-              || TREE_CODE (decl) == VAR_DECL)
-             && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
+         if (targetm.have_named_sections)
            {
-             if (TREE_CODE (decl) == VAR_DECL
-                 && current_function_decl != NULL_TREE
-                 && ! TREE_STATIC (decl))
-               error_with_decl (decl,
-                 "section attribute cannot be specified for local variables");
-             /* The decl may have already been given a section attribute from
-                a previous declaration.  Ensure they match.  */
-             else if (DECL_SECTION_NAME (decl) != NULL_TREE
-                      && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
-                                 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
-               error_with_decl (*node,
-                                "section of `%s' conflicts with previous declaration");
+             if ((TREE_CODE (decl) == FUNCTION_DECL
+                  || TREE_CODE (decl) == VAR_DECL)
+                 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
+               {
+                 if (TREE_CODE (decl) == VAR_DECL
+                     && current_function_decl != NULL_TREE
+                     && ! TREE_STATIC (decl))
+                   error_with_decl (decl,
+                                    "section attribute cannot be specified for local variables");
+                 /* The decl may have already been given a section attribute
+                    from a previous declaration.  Ensure they match.  */
+                 else if (DECL_SECTION_NAME (decl) != NULL_TREE
+                          && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
+                                     TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
+                   error_with_decl (*node,
+                                    "section of `%s' conflicts with previous declaration");
+                 else
+                   DECL_SECTION_NAME (decl) = TREE_VALUE (args);
+               }
              else
-               DECL_SECTION_NAME (decl) = TREE_VALUE (args);
+               error_with_decl (*node,
+                                "section attribute not allowed for `%s'");
            }
          else
            error_with_decl (*node,
-                          "section attribute not allowed for `%s'");
-#else
-         error_with_decl (*node,
-                 "section attributes are not supported for this target");
-#endif
+                            "section attributes are not supported for this target");
          break;
 
        case A_ALIGNED:
index 896f162fb7b918fd54ced6123accd35654f7f786..a4905e6597cdad12962bab4824202931dab8be98 100644 (file)
@@ -48,6 +48,8 @@ static void compute_regstack_size PARAMS ((void));
 static void check_epilogue_internal_label PARAMS ((FILE *));
 static void output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static void output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
+static void a29k_asm_named_section PARAMS ((const char *, unsigned int,
+                                           unsigned int));
 
 #define min(A,B)       ((A) < (B) ? (A) : (B))
 
@@ -1568,3 +1570,13 @@ output_function_epilogue (file, size)
     free (a29k_first_epilogue_insn);
   a29k_first_epilogue_insn = 0;
 }
+
+static void
+a29k_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  /* ??? Is it really correct to mark all sections as "bss"?  */
+  fprintf (asm_out_file, "\t.sect %s, bss\n\t.use %s\n", name, name);
+}
index 96d19ac6df402f86954bab64186ee65dd10a8695..8568d5e484d3a8503ac9e243dfcd79d33aade71a 100644 (file)
@@ -1428,11 +1428,8 @@ literal_section ()                                               \
 extern int a29k_debug_reg_map[];
 #define DBX_REGISTER_NUMBER(REGNO) a29k_debug_reg_map[REGNO]
 
-/* This how to write an assembler directive to FILE to switch to
-   section NAME for DECL.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  fprintf (FILE, "\t.sect %s, bss\n\t.use %s\n", NAME, NAME)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION a29k_asm_named_section
 
 /* This is how to output the definition of a user-level label named NAME,
    such as the label on a static function or variable NAME.  */
index 2456e995977beec1ca1e88d834006455d7b00925..345d95e2f6ba6e182f4d02b0748c1c3e8de89e62 100644 (file)
@@ -148,9 +148,14 @@ static void alpha_output_function_end_prologue
 \f
 /* Initialize the GCC target structure.  */
 #if TARGET_ABI_OPEN_VMS
-   static int vms_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree));
-#  undef TARGET_VALID_DECL_ATTRIBUTE
-#  define TARGET_VALID_DECL_ATTRIBUTE vms_valid_decl_attribute_p
+static int vms_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree));
+static unsigned int vms_section_type_flags PARAMS ((tree, const char *, int));
+static void vms_asm_named_section PARAMS ((const char *, unsigned int,
+                                          unsigned int));
+# undef TARGET_VALID_DECL_ATTRIBUTE
+# define TARGET_VALID_DECL_ATTRIBUTE vms_valid_decl_attribute_p
+# undef TARGET_SECTION_TYPE_FLAGS
+# define TARGET_SECTION_TYPE_FLAGS vms_section_type_flags
 #endif
 
 #undef TARGET_ASM_FUNCTION_END_PROLOGUE
@@ -6535,6 +6540,51 @@ alpha_write_linkage (stream)
   splay_tree_foreach (alpha_links, alpha_write_one_linkage, stream);
 }
 
+/* Given a decl, a section name, and whether the decl initializer
+   has relocs, choose attributes for the section.  */
+
+#define SECTION_VMS_OVERLAY    SECTION_FORGET
+
+static unsigned int
+vms_section_type_flags (decl, name, reloc)
+     tree decl;
+     const char *name;
+     int reloc;
+{
+  unsigned int flags = default_section_type_flags (decl, name, reloc);
+
+  if (decl && DECL_MACHINE_ATTRIBUTES (decl)
+      && lookup_attribute ("overlaid", DECL_MACHINE_ATTRIBUTES (decl)))
+    flags |= SECTION_VMS_OVERLAY;
+
+  return flags;
+}
+
+/* Switch to an arbitrary section NAME with attributes as specified
+   by FLAGS.  ALIGN specifies any known alignment requirements for
+   the section; 0 if the default should be used.  */
+
+static void
+vms_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align;
+{
+  const char *flag_str = "";
+
+  if (flags & SECTION_VMS_OVERLAY)
+    flag_str = ",OVR";
+  else if (flags & SECTION_DEBUG)
+    flag_str = ",NOWRT";
+
+  fprintf (asm_out_file, ".section\t%s%s\n", name, flag_str);
+
+  /* ??? An indicated alignment of 1 byte is only used by dwarf,
+     and for that we turn off auto-alignment.  */
+  if (align == 1)
+    ASM_OUTPUT_ALIGN (asm_out_file, 0);
+}
+
 #else
 
 rtx
index dbec2b487f31b3fed6eb6b9d4f309394d1fa4b39..a8e89003be4a2361a0e090ee4da6bc4584602c24 100644 (file)
@@ -294,69 +294,8 @@ void FN ()                                 \
     }                                          \
 }
 
-
-/* Switch into a generic section.
-
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.
-
-   If the section has already been defined, we must not emit the
-   attributes here. The SVR4 assembler does not recognize section
-   redefinitions.  If DECL is NULL, no attributes are emitted.  */
-
-#undef  ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)               \
-  do                                                                   \
-    {                                                                  \
-      static htab_t htab;                                               \
-                                                                        \
-      struct section_info                                               \
-      {                                                                        \
-       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;              \
-      };                                                                \
-                                                                        \
-      struct section_info *s;                                          \
-      const char *mode;                                                        \
-      enum sect_enum type;                                              \
-      PTR* slot;                                                        \
-                                                                        \
-      /* The names we put in the hashtable will always be the unique    \
-        versions gived to us by the stringtable, so we can just use    \
-        their addresses as the keys.  */                               \
-      if (!htab)                                                        \
-       htab = htab_create (31,                                         \
-                           htab_hash_pointer,                          \
-                           htab_eq_pointer,                            \
-                           NULL);                                      \
-                                                                        \
-      if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                   \
-       type = SECT_EXEC, mode = "ax";                                  \
-      else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))            \
-       type = SECT_RO, mode = "a";                                     \
-      else                                                             \
-       type = SECT_RW, mode = "aw";                                    \
-                                                                       \
-      /* See if we already have an entry for this section.  */          \
-      slot = htab_find_slot (htab, NAME, INSERT);                       \
-      if (!*slot)                                                       \
-       {                                                               \
-         s = (struct section_info *) xmalloc (sizeof (* s));           \
-         s->type = type;                                               \
-         *slot = s;                                                    \
-         fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n",           \
-                  NAME, mode);                                         \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         s = (struct section_info *) *slot;                            \
-         if (DECL && s->type != type)                                  \
-           error_with_decl (DECL,                                      \
-                            "%s causes a section type conflict");      \
-                                                                       \
-         fprintf (FILE, "\t.section\t%s\n", NAME);                     \
-       }                                                               \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* A C statement (sans semicolon) to output an element in the table of
    global constructors.  */
@@ -460,8 +399,6 @@ void FN ()                                  \
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
 
-#define UNIQUE_SECTION_P(DECL)   (DECL_ONE_ONLY (DECL))
-
 #undef  UNIQUE_SECTION
 #define UNIQUE_SECTION(DECL, RELOC)                                    \
   do                                                                   \
index d10a19df396ffc1e86127f470f7fa2bd35436869..bc7e1e6afacd52ca1957f1672286090423602d19 100644 (file)
@@ -407,30 +407,8 @@ do {                                                                       \
 #define ASM_OUTPUT_ALIGN(FILE,LOG)     \
     fprintf (FILE, "\t.align %d\n", LOG);
 
-#define ASM_OUTPUT_SECTION(FILE,SECTION)                       \
-   (strcmp (SECTION, ".text") == 0)                            \
-     ? text_section ()                                         \
-     : named_section (NULL_TREE, SECTION, 0),                  \
-       ASM_OUTPUT_ALIGN (FILE, 0)                              \
-
-#define ASM_OUTPUT_SECTION_NAME(FILE,DECL,NAME,RELOC)          \
-  do                                                           \
-    {                                                          \
-      const char *flags;                                       \
-      int ovr = 0;                                             \
-      if (DECL && DECL_MACHINE_ATTRIBUTES (DECL)               \
-         && lookup_attribute                                   \
-             ("overlaid", DECL_MACHINE_ATTRIBUTES (DECL)))     \
-       flags = ",OVR", ovr = 1;                                \
-      else if (strncmp (NAME,".debug", 6) == 0)                        \
-       flags = ",NOWRT";                                       \
-      else                                                     \
-       flags = "";                                             \
-      fputc ('\n', (FILE));                                    \
-      fprintf (FILE, ".section\t%s%s\n", NAME, flags);         \
-      if (ovr)                                                 \
-        (NAME) = "";                                           \
-    } while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION vms_asm_named_section
 
 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                             \
   do { literals_section();                                             \
index 35c520c31ec5944e72d6246357518d45fef584e7..b79a92bae9051a0e0f3d3fdb1f3b6cbdeabe6178 100644 (file)
@@ -114,6 +114,9 @@ static void  thumb_output_function_prologue PARAMS ((FILE *,
                                                         HOST_WIDE_INT));
 static int      arm_comp_type_attributes       PARAMS ((tree, tree));
 static void     arm_set_default_type_attributes        PARAMS ((tree));
+static void     arm_elf_asm_named_section      PARAMS ((const char *,
+                                                        unsigned int,
+                                                        unsigned int));
 #undef Hint
 #undef Mmode
 #undef Ulong
@@ -10632,3 +10635,38 @@ aof_dump_imports (f)
     }
 }
 #endif /* AOF_ASSEMBLER */
+
+/* Switch to an arbitrary section NAME with attributes as specified
+   by FLAGS.  ALIGN specifies any known alignment requirements for
+   the section; 0 if the default should be used.
+
+   Differs from the default elf version only in the prefix character
+   used before the section type.  */
+
+static void
+arm_elf_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  char flagchars[8], *f = flagchars;
+  const char *type;
+
+  if (!(flags & SECTION_DEBUG))
+    *f++ = 'a';
+  if (flags & SECTION_WRITE)
+    *f++ = 'w';
+  if (flags & SECTION_CODE)
+    *f++ = 'x';
+  if (flags & SECTION_SMALL)
+    *f++ = 's';
+  *f = '\0';
+
+  if (flags & SECTION_BSS)
+    type = "nobits";
+  else
+    type = "progbits";
+
+  fprintf (asm_out_file, "\t.section\t%s,\"%s\",%%%s\n",
+          name, flagchars, type);
+}
index eeea20b2a9d3fcc185ca686bf77f2f39b208b28b..11cb9bb1fca9cc698f8ab1b0ba30075e7e39407d 100644 (file)
@@ -64,21 +64,8 @@ Boston, MA 02111-1307, USA.  */
     }                                                          \
   while (0)
 
-/* A C statement to output something to the assembler file to switch to
-   section NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)     \
-  do                                                           \
-    {                                                          \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)         \
-        fprintf (STREAM, "\t.section %s,\"x\"\n", (NAME));     \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))  \
-        fprintf (STREAM, "\t.section %s,\"\"\n", (NAME));      \
-      else                                                     \
-        fprintf (STREAM, "\t.section %s,\"w\"\n", (NAME));     \
-    }                                                          \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_coff_asm_named_section
 \f
 /* Support the ctors/dtors and other sections.  */
 
index a626af88fd89ebdab814fb023d9dd1f828a6778b..f32228f6e88f782803ed62b2c4635feaf2e0c83e 100644 (file)
@@ -83,28 +83,14 @@ func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) }
 asm (DTORS_SECTION_ASM_OP);                            \
 func_ptr __DTOR_END__[1] = { (func_ptr) 0 };
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)             \
-  do                                                                   \
-    {                                                                  \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                 \
-       fprintf (STREAM, "\t.section %s,\"ax\",@progbits\n", (NAME));   \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))          \
-       fprintf (STREAM, "\t.section %s,\"a\"\n", (NAME));              \
-      else                                                             \
-       fprintf (STREAM, "\t.section %s,\"aw\"\n", (NAME));             \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* The ARM development system defines __main.  */
 #define NAME__MAIN "__gccmain"
 #define SYMBOL__MAIN __gccmain
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
 #define UNIQUE_SECTION(DECL,RELOC)                             \
   do                                                           \
     {                                                          \
index 2eb2388be8c7d41770580e64a03a5bf8e4b9de14..102b53ae0c7274f279ee69b88dc9d54db6bf29ec 100644 (file)
@@ -299,23 +299,9 @@ dtors_section ()                                           \
 }
 #endif
 
-/* A C statement to output something to the assembler file to switch to
-   section NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL
-   or NULL_TREE.  */
-#undef  ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)             \
-  do                                                                   \
-    {                                                                  \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                 \
-       fprintf (STREAM, "\t.section %s,\"ax\",%%progbits\n", NAME);    \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))          \
-       fprintf (STREAM, "\t.section %s,\"a\"\n", NAME);                \
-      else if (! strncmp (NAME, ".bss", 4))                            \
-       fprintf (STREAM, "\t.section %s,\"aw\",%%nobits\n", NAME);      \
-      else                                                             \
-       fprintf (STREAM, "\t.section %s,\"aw\"\n", NAME);               \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  arm_elf_asm_named_section
 \f
 /* Support the ctors/dtors sections for g++.  */
 #ifndef INT_ASM_OP
index 4940ae92a56bf0dbce297a5d73fbf29b95880aaf..06519604ff0c54fdfaba01550945028c27f83514 100644 (file)
@@ -132,15 +132,8 @@ const_section ()                                                   \
     }                                                                  \
 }
 
-/* Switch into a generic section.
-   This is currently only used to support section attributes.
-
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.  */
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  fprintf (FILE, ".section\t%s,\"%s\",%%progbits\n", NAME, \
-          (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
-          (DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  arm_elf_asm_named_section
 
 /* A C statement or statements to switch to the appropriate
    section for output of DECL.  DECL is either a `VAR_DECL' node
@@ -171,8 +164,6 @@ const_section ()                                                    \
 }
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#define UNIQUE_SECTION_P(DECL)   (DECL_ONE_ONLY (DECL))
-
 #define UNIQUE_SECTION(DECL, RELOC)                            \
   do                                                           \
     {                                                          \
index 82818861c191807f604651dea6179723a732f77a..6d4f61d942fe5347d080a5e82affd83c30590815 100644 (file)
@@ -118,35 +118,12 @@ Boston, MA 02111-1307, USA.  */
    symbols must be explicitly imported from shared libraries (DLLs).  */
 #define MULTIPLE_SYMBOL_SPACES
 
-#define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
-
 #define UNIQUE_SECTION(DECL, RELOC) arm_pe_unique_section (DECL, RELOC)
 
 #define SUPPORTS_ONE_ONLY 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#undef  ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)     \
-  do                                                           \
-    {                                                          \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)         \
-       fprintf (STREAM, "\t.section %s,\"x\"\n", (NAME));      \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))  \
-       fprintf (STREAM, "\t.section %s,\"\"\n", (NAME));       \
-      else                                                     \
-       fprintf (STREAM, "\t.section %s,\"w\"\n", (NAME));      \
-      /* Functions may have been compiled at various levels of \
-        optimization so we can't use `same_size' here.         \
-        Instead, have the linker pick one.  */                 \
-      if ((DECL) && DECL_ONE_ONLY (DECL))                      \
-       fprintf (STREAM, "\t.linkonce %s\n",                    \
-                TREE_CODE (DECL) == FUNCTION_DECL              \
-                ? "discard" : "same_size");                    \
-    }                                                          \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
 \f
 /* This outputs a lot of .req's to define alias for various registers.
    Let's try to avoid this.  */
index fab8155f1ef18624f060714d639e869633aa635b..1eebb7b0801a675edf45753cab7a2a34e21c7d48 100644 (file)
@@ -85,23 +85,8 @@ rdata_section ()                                             \
   asm (DTORS_SECTION_ASM_OP);                          \
   func_ptr __DTOR_END__[1] = { (func_ptr) 0 };
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)             \
-  do                                                                   \
-    {                                                                  \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                 \
-        fprintf (STREAM, "\t.section %s,\"ax\",@progbits\n", (NAME));  \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))          \
-        fprintf (STREAM, "\t.section %s,\"a\"\n", (NAME));             \
-      else if (! strncmp (NAME, ".bss", 4))                            \
-       fprintf (STREAM, "\t.section %s,\"aw\",@nobits\n", (NAME));     \
-      else                                                             \
-        fprintf (STREAM, "\t.section %s,\"aw\"\n", (NAME));            \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* The ARM development system defines __main.  */
 #define NAME__MAIN "__gccmain"
@@ -114,8 +99,6 @@ rdata_section ()                                             \
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
 
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
-
 #define UNIQUE_SECTION(DECL, RELOC)                                    \
   do                                                                   \
     {                                                                  \
index 9d9839831b3051b1628745e949d93772a6c6144a..b6f4d74cb0021342c403c9232e54b1117bcfcf9f 100644 (file)
@@ -45,9 +45,6 @@ extern void   asm_output_external          PARAMS ((FILE *file, tree decl,
                                                   char *name));
 extern void   unique_section               PARAMS ((tree decl, int reloc));
 extern void   encode_section_info          PARAMS ((tree decl));
-extern void   asm_output_section_name      PARAMS ((FILE *file, tree decl,
-                                                  const char *name,
-                                                  int reloc));
 extern int    avr_progmem_p                PARAMS ((tree decl));
 
 
index 605360a601b597299135a4d14dc377a0bbf5aa3e..6d11d0583745678ff33f2677e0cc24729f888584 100644 (file)
@@ -4556,23 +4556,6 @@ unique_section (decl, reloc)
 }
 
 
-/* Output section name to file FILE
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.  */
-
-void
-asm_output_section_name(file, decl, name, reloc)
-     FILE *file;
-     tree decl;
-     const char *name;
-     int reloc ATTRIBUTE_UNUSED;
-{
-  fprintf (file, ".section %s, \"%s\", @progbits\n", name,
-          decl && TREE_CODE (decl) == FUNCTION_DECL ? "ax" :
-          decl && TREE_READONLY (decl) ? "a" : "aw");
-}
-
-
 /* The routine used to output NUL terminated strings.  We use a special
    version of this for most svr4 targets because doing so makes the
    generated assembly code more compact (and thus faster to assemble)
index dfb588231ec20ff632b5475980a2cfdd0a0b885b..5467fa4172061232222f2b35a0e8eeb69840d32e 100644 (file)
@@ -1956,12 +1956,6 @@ progmem_section (void)                                                         \
    Decode SYM_NAME and store the real name part in VAR, sans the
    characters that encode section info.  Define this macro if
    `ENCODE_SECTION_INFO' alters the symbol's name string.  */
-/* `UNIQUE_SECTION_P (DECL)'
-   A C expression which evaluates to true if DECL should be placed
-   into a unique section for some target-specific reason.  If you do
-   not define this macro, the default is `0'.  Note that the flag
-   `-ffunction-sections' will also cause functions to be placed into
-   unique sections.  */
 
 #define UNIQUE_SECTION(DECL, RELOC) unique_section (DECL, RELOC)
 /* `UNIQUE_SECTION (DECL, RELOC)'
@@ -1971,7 +1965,6 @@ progmem_section (void)                                                          \
    link-time relocations.  If you do not define this macro, GNU CC
    will use the symbol name prefixed by `.' as the section name.  */
 
-
 #define ASM_FILE_START(STREAM) asm_file_start (STREAM)
 /* A C expression which outputs to the stdio stream STREAM some
    appropriate text to go at the start of an assembler file.
@@ -2022,19 +2015,8 @@ progmem_section (void)                                                         \
    This macro need not be defined if the standard form of debugging
    information for the debugger in use is appropriate.  */
 
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  asm_output_section_name(FILE, DECL, NAME, RELOC)
-
-/* `ASM_OUTPUT_SECTION_NAME (STREAM, DECL, NAME, RELOC)'
-   A C statement to output something to the assembler file to switch
-   to section NAME for object DECL which is either a `FUNCTION_DECL',
-   a `VAR_DECL' or `NULL_TREE'.  RELOC indicates whether the initial
-   value of EXP requires link-time relocations.  Some target formats
-   do not support arbitrary sections.  Do not define this macro in
-   such cases.
-
-   At present this macro is only used to support section attributes.
-   When this macro is undefined, section attributes are disabled.  */
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
 
 #define OBJC_PROLOGUE {}
 /* A C statement to output any assembler statements which are
index 02a3dcd22a7226eb629100b0d68ea5f07c6408ca..da2f90d895cb48729218862bb90a15779f6325b3 100644 (file)
@@ -191,6 +191,8 @@ static int c4x_rptb_valid_p PARAMS ((rtx, rtx));
 static int c4x_label_ref_used_p PARAMS ((rtx, rtx));
 static int c4x_valid_type_attribute_p PARAMS ((tree, tree, tree, tree));
 static void c4x_insert_attributes PARAMS ((tree, tree *));
+static void c4x_asm_named_section PARAMS ((const char *, unsigned int,
+                                          unsigned int));
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_VALID_TYPE_ATTRIBUTE
@@ -5177,3 +5179,12 @@ c4x_expand_builtin (exp, target, subtarget, mode, ignore)
     }
   return NULL_RTX;
 }
+
+static void
+c4x_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  fprintf (asm_out_file, "\t.sect\t\"%s\"\n", name);
+}
index 102346f6a04352e4dbee2eb1336c1ab2b88d0c54..dba5e47807331ffbc9ce31d3493dbdcbb53924ee 100644 (file)
@@ -2087,8 +2087,8 @@ dtors_section ()                                                  \
     }                                                                  \
 }
 
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-   fprintf (FILE, "\t.sect\t\"%s\"\n", NAME);
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION c4x_asm_named_section
 
 /* This is machine-dependent because it needs to push something
    on the stack.  */
index 5e0f0b0a02b165ccd862afae7f48143210c4e65f..2b1321b4ca97ebf6296b6525b6a6130fd15c40c9 100644 (file)
@@ -3760,16 +3760,6 @@ extern const char *d30v_branch_cost_string;
    the symbol's name string.  */
 /* #define STRIP_NAME_ENCODING(VAR, SYM_NAME) */
 
-/* A C expression which evaluates to true if DECL should be placed
-   into a unique section for some target-specific reason.  If you do
-   not define this macro, the default is `0'.  Note that the flag
-   `-ffunction-sections' will also cause functions to be placed into
-   unique sections.
-
-   Defined in svr4.h.  */
-/* #define UNIQUE_SECTION_P(DECL) */
-
-/* A C statement to build up a unique section name, expressed as a
    STRING_CST node, and assign it to `DECL_SECTION_NAME (DECL)'.
    RELOC indicates whether the initial value of EXP requires
    link-time relocations.  If you do not define this macro, GNU CC
@@ -3888,17 +3878,6 @@ extern const char *d30v_branch_cost_string;
    Defined in svr4.h.  */
 /* #define ASM_OUTPUT_IDENT(STREAM, STRING) */
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a `FUNCTION_DECL', a `VAR_DECL' or
-   `NULL_TREE'.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.
-
-   At present this macro is only used to support section attributes.  When this
-   macro is undefined, section attributes are disabled.
-
-   Defined in svr4.h.  */
-/* #define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME) */
-
 /* A C statement to output any assembler statements which are required to
    precede any Objective C object definitions or message sending.  The
    statement is executed only when compiling an Objective C program.  */
@@ -4852,23 +4831,6 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
    This macro need not be defined on most platforms.  */
 /* #define ASM_OUTPUT_EH_REGION_END() */
 
-/* A C expression to switch to the section in which the main exception table is
-   to be placed (*note Sections::.).  The default is a section named
-   `.gcc_except_table' on machines that support named sections via
-   `ASM_OUTPUT_SECTION_NAME', otherwise if `-fpic' or `-fPIC' is in effect, the
-   `data_section', otherwise the `readonly_data_section'.  */
-/* #define EXCEPTION_SECTION() */
-
-/* If defined, a C string constant for the assembler operation to switch to the
-   section for exception handling frame unwind information.  If not defined,
-   GNU CC will provide a default definition if the target supports named
-   sections.  `crtstuff.c' uses this macro to switch to the appropriate
-   section.
-
-   You should define this symbol if your target supports DWARF 2 frame unwind
-   information and the default definition does not work.  */
-/* #define EH_FRAME_SECTION_ASM_OP */
-
 /* A C expression that is nonzero if the normal exception table output should
    be omitted.
 
index eef4115004730ce9d768c81acf29908c57848191..82dde08c758e1ae6e0501bf92db1d20861442c2a 100644 (file)
@@ -338,8 +338,6 @@ dtors_section ()                                            \
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
 
-#define UNIQUE_SECTION_P(DECL)   (DECL_ONE_ONLY (DECL))
-
 #define UNIQUE_SECTION(DECL, RELOC)                            \
   do                                                           \
     {                                                          \
@@ -403,69 +401,8 @@ dtors_section ()                                           \
     }                                                          \
   while (0)
 
-/* Switch into a generic section.
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.
-   If the section has already been defined, we must not
-   emit the attributes here. The SVR4 assembler does not
-   recognize section redefinitions.
-   If DECL is NULL, no attributes are emitted.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)               \
-  do                                                                   \
-    {                                                                  \
-      static htab_t htab;                                               \
-                                                                        \
-      struct section_info                                               \
-      {                                                                        \
-       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;              \
-      };                                                                \
-                                                                        \
-      struct section_info *s;                                          \
-      const char *mode;                                                        \
-      enum sect_enum type;                                              \
-      PTR* slot;                                                        \
-                                                                        \
-      /* The names we put in the hashtable will always be the unique    \
-        versions gived to us by the stringtable, so we can just use    \
-        their addresses as the keys.  */                               \
-      if (!htab)                                                        \
-       htab = htab_create (31,                                         \
-                           htab_hash_pointer,                          \
-                           htab_eq_pointer,                            \
-                           NULL);                                      \
-                                                                        \
-      if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                   \
-       type = SECT_EXEC, mode = "ax";                                  \
-      else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))            \
-       type = SECT_RO, mode = "a";                                     \
-      else                                                             \
-       type = SECT_RW, mode = "aw";                                    \
-                                                                       \
-                                                                        \
-      /* See if we already have an entry for this section.  */          \
-      slot = htab_find_slot (htab, NAME, INSERT);                       \
-      if (!*slot)                                                       \
-       {                                                               \
-         s = (struct section_info *) xmalloc (sizeof (* s));           \
-         s->type = type;                                               \
-         *slot = s;                                                    \
-         fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n",           \
-                  NAME, mode);                                         \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         s = (struct section_info *) *slot;                            \
-         if (DECL && s->type != type)                                  \
-           error_with_decl (DECL,                                      \
-                            "%s causes a section type conflict");      \
-                                                                       \
-         fprintf (FILE, "\t.section\t%s\n", NAME);                     \
-       }                                                               \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* A C statement or statements to switch to the appropriate
    section for output of RTX in mode MODE.  RTX is some kind
index 46282086de7e28c5bdf6e8569cd332a4d063936c..55aef3876f7d7580e8c2c6c6ebdbfdee5e3cc4df 100644 (file)
@@ -56,6 +56,8 @@ static const char *cond_string PARAMS ((enum rtx_code));
 static int h8300_valid_decl_attribute PARAMS ((tree, tree, tree, tree));
 static void h8300_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static void h8300_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
+static void h8300_asm_named_section PARAMS ((const char *, unsigned int,
+                                            unsigned int));
 
 /* CPU_TYPE, says what cpu we're compiling for.  */
 int cpu_type;
@@ -3325,3 +3327,13 @@ h8300_adjust_insn_length (insn, length)
 
   return 0;
 }
+
+static void
+h8300_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  /* ??? Perhaps we should be using default_coff_asm_named_section.  */
+  fprintf (asm_out_file, "\t.section %s\n", name);
+}
index 96fbbbb0fe509f2fe72780bc2ed8f8eba334b821..f419ba4b1d0037ebf3a32745234c801726a2197c 100644 (file)
@@ -1225,13 +1225,8 @@ readonly_data ()                                                 \
   fprintf (FILE,                                                       \
           "\t.text\n.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO)
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  fprintf (FILE, "\t.section %s\n", NAME)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION h8300_asm_named_section
 
 /* This is how to output the definition of a user-level label named NAME,
    such as the label on a static function or variable NAME.  */
index 6e76f1c7bec6d4aa5c0744989522d8caaad4b8f9..9ea367f3a8fcb53fa26b0926c060c2aa9924d809 100644 (file)
@@ -407,69 +407,16 @@ do {                                                      \
    symbols must be explicitly imported from shared libraries (DLLs).  */
 #define MULTIPLE_SYMBOL_SPACES
 
-#define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
 extern void i386_pe_unique_section PARAMS ((TREE, int));
 #define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
 
 #define SUPPORTS_ONE_ONLY 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)             \
-do {                                                                   \
-  static struct section_info                                           \
-    {                                                                  \
-      struct section_info *next;                                       \
-      char *name;                                                      \
-      enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;               \
-    } *sections;                                                       \
-  struct section_info *s;                                              \
-  const char *mode;                                                    \
-  enum sect_enum type;                                                 \
-                                                                       \
-  for (s = sections; s; s = s->next)                                   \
-    if (!strcmp (NAME, s->name))                                       \
-      break;                                                           \
-                                                                       \
-  if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                       \
-    type = SECT_EXEC, mode = "x";                                      \
-  else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))                        \
-    type = SECT_RO, mode = "";                                         \
-  else                                                                 \
-    {                                                                  \
-      type = SECT_RW;                                                  \
-      if (DECL && TREE_CODE (DECL) == VAR_DECL                         \
-         && lookup_attribute ("shared", DECL_MACHINE_ATTRIBUTES (DECL))) \
-       mode = "ws";                                                    \
-      else                                                             \
-       mode = "w";                                                     \
-    }                                                                  \
-                                                                       \
-  if (s == 0)                                                          \
-    {                                                                  \
-      s = (struct section_info *) xmalloc (sizeof (struct section_info)); \
-      s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));                \
-      strcpy (s->name, NAME);                                          \
-      s->type = type;                                                  \
-      s->next = sections;                                              \
-      sections = s;                                                    \
-      fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);           \
-      /* Functions may have been compiled at various levels of         \
-        optimization so we can't use `same_size' here.  Instead,       \
-        have the linker pick one.  */                                  \
-      if ((DECL) && DECL_ONE_ONLY (DECL))                              \
-       fprintf (STREAM, "\t.linkonce %s\n",                            \
-                TREE_CODE (DECL) == FUNCTION_DECL                      \
-                ? "discard" : "same_size");                            \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);           \
-    }                                                                  \
-} while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  i386_pe_asm_named_section
+
+/* Select attributes for named sections.  */
+#define TARGET_SECTION_TYPE_FLAGS  i386_pe_section_type_flags
 
 /* Write the extra assembler code needed to declare a function
    properly.  If we are generating SDB debugging information, this
index 14a43570e75714b7f81222fd996e5fb68ba863d3..f5e79c2ba0fd68f62c0dabbe5a1309a42d132763 100644 (file)
@@ -57,10 +57,6 @@ Boston, MA 02111-1307, USA.  */
 #undef DTORS_SECTION_ASM_OP
 #define DTORS_SECTION_ASM_OP "\t.section .dtor"
 
-/* Define the name of the .eh_frame section.  */
-#undef EH_FRAME_SECTION_ASM_OP
-#define EH_FRAME_SECTION_ASM_OP "\t.section .eh_frame"
-
 /* Define the name of the .ident op.  */
 #undef IDENT_ASM_OP
 #define IDENT_ASM_OP "\t.ident\t"
@@ -189,14 +185,8 @@ dtor_section ()                                                    \
     fprintf (FILE, "\n");                      \
   } while (0)
 
-/* Tell GCC how to output a section name. Add "x" for code sections.  */
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)\
-  do {                                                                 \
-    if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                   \
-      fprintf ((FILE), "\t.section %s,\"x\"\n", (NAME));               \
-    else                                                               \
-      fprintf ((FILE), "\t.section %s\n", (NAME));                     \
-  } while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_coff_asm_named_section
 
 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)       \
   do {                                         \
@@ -287,11 +277,6 @@ while (0)
 #undef MAKE_DECL_ONE_ONLY
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
 
-/* Additional support for C++ templates and support for
-   garbage collection.  */
-#undef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
-
 #undef UNIQUE_SECTION
 #define UNIQUE_SECTION(DECL,RELOC)                             \
 do {                                                           \
index 0460b64b07bc5b6147dd94bb8e916f896c8ccc84..864f5200c7c7a743465cc396e9bc1c32d6ce791b 100644 (file)
@@ -341,26 +341,6 @@ dtors_section ()                                                   \
     }                                                                  \
 }
 
-#if 0
-/* Currently gas chokes on this; that's not too hard to fix, but there's
-   not a lot of impeteus to do it, either.  If it is done, gas will have
-   to handle long section name escapes (which are defined in the COFF/PE
-   document as /nnn where nnn is a string table index).  The benefit:
-   section attributes and -ffunction-sections, neither of which seem to
-   be critical. */
-/* gas may have been fixed? bfd was. */
-
-/* Switch into a generic section.
-   This is currently only used to support section attributes.
-
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.  */
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \
-  fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
-          (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
-          (DECL) && TREE_READONLY (DECL) ? "a" : "aw")
-#endif
-
 /* The MS compilers take alignment as a number of bytes, so we do as well */
 #undef ASM_OUTPUT_ALIGN
 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
@@ -505,63 +485,13 @@ do {                                                                      \
    symbols must be explicitly imported from shared libraries (DLLs).  */
 #define MULTIPLE_SYMBOL_SPACES
 
-#define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
 extern void i386_pe_unique_section ();
 #define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
 
 #define SUPPORTS_ONE_ONLY 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)             \
-do {                                                                   \
-  static struct section_info                                           \
-    {                                                                  \
-      struct section_info *next;                                       \
-      char *name;                                                      \
-      enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;               \
-    } *sections;                                                       \
-  struct section_info *s;                                              \
-  const char *mode;                                                    \
-  enum sect_enum type;                                                 \
-                                                                       \
-  for (s = sections; s; s = s->next)                                   \
-    if (!strcmp (NAME, s->name))                                       \
-      break;                                                           \
-                                                                       \
-  if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                       \
-    type = SECT_EXEC, mode = "x";                                      \
-  else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))                        \
-    type = SECT_RO, mode = "r";                                                \
-  else                                                                 \
-    type = SECT_RW, mode = "w";                                                \
-                                                                       \
-  if (s == 0)                                                          \
-    {                                                                  \
-      s = (struct section_info *) xmalloc (sizeof (struct section_info)); \
-      s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));                \
-      strcpy (s->name, NAME);                                          \
-      s->type = type;                                                  \
-      s->next = sections;                                              \
-      sections = s;                                                    \
-      fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);           \
-      /* Functions may have been compiled at various levels of         \
-         optimization so we can't use `same_size' here.  Instead,      \
-         have the linker pick one.  */                                 \
-      if ((DECL) && DECL_ONE_ONLY (DECL))                              \
-        fprintf (STREAM, "\t.linkonce %s\n",                           \
-                TREE_CODE (DECL) == FUNCTION_DECL                      \
-                ? "discard" : "same_size");                            \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);           \
-    }                                                                  \
-} while (0)
-
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
 #endif /* 0 */
 
 /* DWARF2 Unwinding doesn't work with exception handling yet. */
index 5b9e9792e1f291cb7c65d248d21146035bbfde3f..e263116ace3f603a9bcfb0d76f9a8bdd73b0e4f1 100644 (file)
@@ -181,4 +181,8 @@ extern int ix86_constant_alignment PARAMS ((tree, int));
 extern int ix86_valid_type_attribute_p PARAMS ((tree, tree, tree, tree));
 extern int i386_pe_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree));
 extern int i386_pe_valid_type_attribute_p PARAMS ((tree, tree, tree, tree));
+extern unsigned int i386_pe_section_type_flags PARAMS ((tree, const char *,
+                                                       int));
+extern void i386_pe_asm_named_section PARAMS ((const char *, unsigned int,
+                                              unsigned int));
 #endif
index 9017207e292e6da02aa1093c77a9ae8b5d170558..2547ea40a5390a5b9ddc5177a8544384797ec5be 100644 (file)
@@ -608,6 +608,11 @@ static int ix86_fp_comparison_cost PARAMS ((enum rtx_code code));
 static int ix86_save_reg PARAMS ((int, int));
 static void ix86_compute_frame_layout PARAMS ((struct ix86_frame *));
 static int ix86_comp_type_attributes PARAMS ((tree, tree));
+
+#if defined(TARGET_ELF) && defined(TARGET_COFF)
+static void sco_asm_named_section PARAMS ((const char *, unsigned int,
+                                          unsigned int));
+#endif
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_VALID_TYPE_ATTRIBUTE
@@ -2323,7 +2328,7 @@ ix86_asm_file_end (file)
   /* ??? Binutils 2.10 and earlier has a linkonce elimination bug related
      to updating relocations to a section being discarded such that this
      doesn't work.  Ought to detect this at configure time.  */
-#if 0 && defined (ASM_OUTPUT_SECTION_NAME)
+#if 0
   /* The trick here is to create a linkonce section containing the
      pic label thunk, but to refer to it with an internal label.
      Because the label is internal, we don't have inter-dso name
@@ -2331,16 +2336,18 @@ ix86_asm_file_end (file)
 
      In order to use these macros, however, we must create a fake
      function decl.  */
-  {
-    tree decl = build_decl (FUNCTION_DECL,
-                           get_identifier ("i686.get_pc_thunk"),
-                           error_mark_node);
-    DECL_ONE_ONLY (decl) = 1;
-    UNIQUE_SECTION (decl, 0);
-    named_section (decl, NULL, 0);
-  }
+  if (targetm.have_named_sections)
+    {
+      tree decl = build_decl (FUNCTION_DECL,
+                             get_identifier ("i686.get_pc_thunk"),
+                             error_mark_node);
+      DECL_ONE_ONLY (decl) = 1;
+      UNIQUE_SECTION (decl, 0);
+      named_section (decl, NULL, 0);
+    }
+  else
 #else
-  text_section ();
+    text_section ();
 #endif
 
   /* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an
@@ -10822,3 +10829,17 @@ ix86_output_main_function_alignment_hack (file, size)
   fprintf (file, "\tret\n");
   ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (label));
 }
+
+#if defined(TARGET_ELF) && defined(TARGET_COFF)
+static void
+sco_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align;
+{
+  if (TARGET_ELF)
+    default_elf_asm_named_section (name, flags, align);
+  else
+    default_coff_asm_named_section (name, flags, align);
+}
+#endif
index 1d7d4b7e6500fa0fb321ae276c13a93b10e30509..c2c5cff7513f702d4839977e6777c498afe9425d 100644 (file)
@@ -170,21 +170,8 @@ do { long value[3];                                                        \
 
 #define LOCAL_LABEL_PREFIX     "."
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#undef  ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-do {                                                                   \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                     \
-    fprintf (FILE, ".section\t%s,\"ax\"\n", (NAME));                   \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))              \
-    fprintf (FILE, ".section\t%s,\"a\"\n", (NAME));                    \
-  else                                                                 \
-    fprintf (FILE, ".section\t%s,\"aw\"\n", (NAME));                   \
-} while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* If defined, a C expression whose value is a string containing the
    assembler operation to identify the following data as
index 2477b6a0cdc75189353cfaa4663d414e4dc47008..b7a7cdbfd294d08f873e4a96fc3184f12dd4d6a0 100644 (file)
@@ -75,10 +75,10 @@ Boston, MA 02111-1307, USA.  */
 #define GLOBAL_ASM_OP                  "\t.globl\t"
 
 #undef EH_FRAME_SECTION_ASM_OP
-#define EH_FRAME_SECTION_ASM_OP_COFF   "\t.section\t.ehfram, \"x\""
-#define EH_FRAME_SECTION_ASM_OP_ELF    "\t.section\t.eh_frame, \"aw\""
-#define EH_FRAME_SECTION_ASM_OP        \
-  ((TARGET_ELF) ? EH_FRAME_SECTION_ASM_OP_ELF : EH_FRAME_SECTION_ASM_OP_COFF)
+#define EH_FRAME_SECTION_NAME_COFF     ".ehfram"
+#define EH_FRAME_SECTION_NAME_ELF      ".eh_frame"
+#define EH_FRAME_SECTION_NAME  \
+  ((TARGET_ELF) ? EH_FRAME_SECTION_NAME_ELF : EH_FRAME_SECTION_NAME_COFF)
 
 /* Avoid problems (long sectino names, forward assembler refs) with DWARF
    exception unwinding when we're generating COFF */
@@ -444,56 +444,14 @@ do {                                                                      \
 #define USER_LABEL_PREFIX ""
 
 /* 
- * Compensate for the difference between ELF and COFF assembler syntax.
- * Otherwise, this is cribbed from ../svr4.h.
  * We rename 'gcc_except_table' to the shorter name in preparation
- * for the day when we're ready to do DWARF2 eh unwinding under COFF 
+ * for the day when we're ready to do DWARF2 eh unwinding under COFF.
  */
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-do {                                                                   \
-  static struct section_info                                            \
-    {                                                                   \
-      struct section_info *next;                                        \
-      char *name;                                                       \
-      enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;                \
-    } *sections;                                                        \
-  struct section_info *s;                                               \
-  const char *mode;                                                     \
-  enum sect_enum type;                                                  \
-  const char *sname = NAME ;                                           \
-  if (strcmp(NAME, ".gcc_except_table") == 0) sname = ".gccexc" ;      \
-                                                                        \
-  for (s = sections; s; s = s->next)                                    \
-    if (!strcmp (NAME, s->name))                                        \
-      break;                                                            \
-                                                                        \
-  if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                        \
-    type = SECT_EXEC, mode = (TARGET_ELF) ? "ax" : "x" ;                \
-  else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))                 \
-    type = SECT_RO, mode = "a";                                         \
-  else                                                                  \
-    type = SECT_RW, mode = (TARGET_ELF) ? "aw" : "w" ;                  \
-                                                                        \
-  if (s == 0)                                                           \
-    {                                                                   \
-      s = (struct section_info *) xmalloc (sizeof (struct section_info));  \
-      s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));         \
-      strcpy (s->name, NAME);                                           \
-      s->type = type;                                                   \
-      s->next = sections;                                               \
-      sections = s;                                                     \
-      fprintf (FILE, ".section\t%s,\"%s\"%s\n", sname, mode,           \
-               (TARGET_ELF) ? ",@progbits" : "" );                     \
-    }                                                                   \
-  else                                                                  \
-    {                                                                   \
-      if (DECL && s->type != type)                                      \
-        error_with_decl (DECL, "%s causes a section type conflict");    \
-                                                                        \
-      fprintf (FILE, ".section\t%s\n", sname);                          \
-    }                                                                   \
-} while (0)
+#define EXCEPTION_SECTION()            named_section (NULL, ".gccexc", 1)
+
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  sco_asm_named_section
 
 #undef ASM_OUTPUT_SKIP
 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
@@ -925,7 +883,7 @@ compiler at the end of the day. Onward we go ...
 # undef FINI_SECTION_ASM_OP
 # undef CTORS_SECTION_ASM_OP
 # undef DTORS_SECTION_ASM_OP
-# undef EH_FRAME_SECTION_ASM_OP
+# undef EH_FRAME_SECTION_NAME
 # undef CTOR_LIST_BEGIN
 # undef CTOR_LIST_END
 # undef DO_GLOBAL_CTORS_BODY
@@ -936,13 +894,13 @@ compiler at the end of the day. Onward we go ...
 #  define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_ELF
 #  define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_ELF
 #  define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_ELF
-#  define EH_FRAME_SECTION_ASM_OP EH_FRAME_SECTION_ASM_OP_ELF
+#  define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_ELF
 # else /* ! _SCO_ELF */
 #  define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_COFF
 #  define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_COFF
 #  define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_COFF
 #  define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_COFF
-#  define EH_FRAME_SECTION_ASM_OP EH_FRAME_SECTION_ASM_OP_COFF
+#  define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_COFF
 #  define CTOR_LIST_BEGIN asm (INIT_SECTION_ASM_OP); asm ("pushl $0")
 #  define CTOR_LIST_END CTOR_LIST_BEGIN
 #  define DO_GLOBAL_CTORS_BODY                                         \
index 24d8e2d278d23969d8060971527dd5e80bf53b36..7e03383f29f94040b56891387b43eabd43f9919c 100644 (file)
@@ -233,33 +233,16 @@ do {                                                                      \
    symbols must be explicitly imported from shared libraries (DLLs).  */
 #define MULTIPLE_SYMBOL_SPACES
 
-#define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
 extern void i386_pe_unique_section ();
 #define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
 
 #define SUPPORTS_ONE_ONLY 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)     \
-do {                                                           \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)             \
-    fprintf (STREAM, "\t.section %s,\"x\"\n", (NAME));         \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))      \
-    fprintf (STREAM, "\t.section %s,\"\"\n", (NAME));          \
-  else                                                         \
-    fprintf (STREAM, "\t.section %s,\"w\"\n", (NAME));         \
-  /* Functions may have been compiled at various levels of     \
-     optimization so we can't use `same_size' here.  Instead,  \
-     have the linker pick one.  */                             \
-  if ((DECL) && DECL_ONE_ONLY (DECL))                          \
-    fprintf (STREAM, "\t.linkonce %s\n",                       \
-            TREE_CODE (DECL) == FUNCTION_DECL                  \
-            ? "discard" : "same_size");                        \
-} while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  i386_pe_asm_named_section
+
+/* Select attributes for named sections.  */
+#define TARGET_SECTION_TYPE_FLAGS  i386_pe_section_type_flags
 
 #undef ASM_COMMENT_START
 #define ASM_COMMENT_START " #"
index 2d85b66930eb1b03a38c549e73062c46f9131d91..ff13c3863b7b545372255815b4836db9f52b29c7 100644 (file)
@@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA.  */
 #include "flags.h"
 #include "tm_p.h"
 #include "toplev.h"
+#include "hashtab.h"
 
 /* i386/PE specific attribute support.
 
@@ -55,7 +56,7 @@ void i386_pe_mark_dllimport PARAMS ((tree));
 int
 i386_pe_valid_decl_attribute_p (decl, attributes, attr, args)
      tree decl;
-     tree attributes;
+     tree attributes ATTRIBUTE_UNUSED;
      tree attr;
      tree args;
 {
@@ -455,6 +456,99 @@ i386_pe_unique_section (decl, reloc)
 
   DECL_SECTION_NAME (decl) = build_string (len, string);
 }
+
+/* Select a set of attributes for section NAME based on the properties
+   of DECL and whether or not RELOC indicates that DECL's initializer
+   might contain runtime relocations.
+
+   We make the section read-only and executable for a function decl,
+   read-only for a const data decl, and writable for a non-const data decl.
+
+   If the section has already been defined, to not allow it to have
+   different attributes, as (1) this is ambiguous since we're not seeing
+   all the declarations up front and (2) some assemblers (e.g. SVR4)
+   do not recoginize section redefinitions.  */
+/* ??? This differs from the "standard" PE implementation in that we
+   handle the SHARED variable attribute.  Should this be done for all
+   PE targets?  */
+
+#define SECTION_PE_SHARED      SECTION_MACH_DEP
+
+unsigned int
+i386_pe_section_type_flags (decl, name, reloc)
+     tree decl;
+     const char *name;
+     int reloc;
+{
+  static htab_t htab;
+  unsigned int flags;
+  unsigned int **slot;
+
+  /* The names we put in the hashtable will always be the unique
+     versions gived to us by the stringtable, so we can just use
+     their addresses as the keys.  */
+  if (!htab)
+    htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
+
+  if (decl && TREE_CODE (decl) == FUNCTION_DECL)
+    flags = SECTION_CODE;
+  else if (decl && DECL_READONLY_SECTION (decl, reloc))
+    flags = 0;
+  else
+    {
+      flags = SECTION_WRITE;
+
+      if (decl && TREE_CODE (decl) == VAR_DECL
+         && lookup_attribute ("shared", DECL_MACHINE_ATTRIBUTES (decl)))
+       flags |= SECTION_PE_SHARED;
+    }
+
+  if (decl && DECL_ONE_ONLY (decl))
+    flags |= SECTION_LINKONCE;
+
+  /* See if we already have an entry for this section.  */
+  slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
+  if (!*slot)
+    {
+      *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
+      **slot = flags;
+    }
+  else
+    {
+      if (decl && **slot != flags)
+       error_with_decl (decl, "%s causes a section type conflict");
+    }
+
+  return flags;
+}
+
+void
+i386_pe_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  char flagchars[8], *f = flagchars;
+
+  if (flags & SECTION_CODE)
+    *f++ = 'x';
+  if (flags & SECTION_WRITE)
+    *f++ = 'w';
+  if (flags & SECTION_PE_SHARED)
+    *f++ = 's';
+  *f = '\0';
+
+  fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
+
+  if (flags & SECTION_LINKONCE)
+    {
+      /* Functions may have been compiled at various levels of
+         optimization so we can't use `same_size' here.
+         Instead, have the linker pick one.  */
+      fprintf (asm_out_file, "\t.linkonce %s\n",
+              (flags & SECTION_CODE ? "discard" : "same_size"));
+    }
+}
 \f
 /* The Microsoft linker requires that every function be marked as
    DT_FCN.  When using gas on cygwin, we must emit appropriate .type
index 0df4ceb8b18489b55c9681aa245ee34b3be1ae99..b5fe7ef88a513e1646e62eba191118ad0bd783d1 100644 (file)
@@ -2454,16 +2454,6 @@ do {                                                                     \
 \f
 /* Assembler Commands for Exception Regions.  */
 
-/* If defined, a C string constant for the assembler operation to switch to the
-   section for exception handling frame unwind information.  If not defined,
-   GNU CC will provide a default definition if the target supports named
-   sections.  `crtstuff.c' uses this macro to switch to the appropriate
-   section.
-
-   You should define this symbol if your target supports DWARF 2 frame unwind
-   information and the default definition does not work.  */
-#define EH_FRAME_SECTION_ASM_OP "\t.section\t.IA_64.unwind,\"aw\""
-
 /* Select a format to encode pointers in exception handling data.  CODE
    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
    true if the symbol may be affected by dynamic relocations.  */
@@ -2551,18 +2541,6 @@ do {                                                                     \
 
 #define DWARF2_DEBUGGING_INFO
 
-/* Section names for DWARF2 debug info.  */
-
-#define DEBUG_INFO_SECTION     ".debug_info, \"\", \"progbits\""
-#define DEBUG_ABBREV_SECTION   ".debug_abbrev, \"\", \"progbits\""
-#define DEBUG_ARANGES_SECTION  ".debug_aranges, \"\", \"progbits\""
-#define DEBUG_MACINFO_SECTION  ".debug_macinfo, \"\", \"progbits\""
-#define DEBUG_LINE_SECTION     ".debug_line, \"\", \"progbits\""
-#define DEBUG_LOC_SECTION      ".debug_loc, \"\", \"progbits\""
-#define DEBUG_PUBNAMES_SECTION ".debug_pubnames, \"\", \"progbits\""
-#define DEBUG_STR_SECTION      ".debug_str, \"\", \"progbits\""
-#define DEBUG_RANGES_SECTION   ".debug_ranges, \"\", \"progbits\""
-
 /* C string constants giving the pseudo-op to use for a sequence of
    2, 4, and 8 byte unaligned constants.  dwarf2out.c needs these.  */
 
index de39c1ebc5fe9c4271175d5c0788ccf4d848c5c1..ea9eb2f7014610f37207a16ed0fbf06c9a715033 100644 (file)
@@ -47,11 +47,6 @@ do {                                                                 \
   ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1);                             \
 } while (0)
 
-/* ??? Intel assembler does not allow "." in section names, so turn off
-   gnu.linkonce section support, but only when using the Intel assembler.  */
-#undef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (TARGET_GNU_AS ? DECL_ONE_ONLY (DECL) : 0)
-
 /* The # tells the Intel assembler that this is not a register name.
    However, we can't emit the # in a label definition, so we set a variable
    in ASM_OUTPUT_LABEL to control whether we want the postfix here or not.
index 4565f77fbeca08011ab1710175dcadb60f8b2a23..8a63c6ca5bac0d74edbe8747bc12f208305068cd 100644 (file)
@@ -100,13 +100,9 @@ Boston, MA 02111-1307, USA.  */
 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
   asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
 
-/* Support generic sections */
-
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  fprintf((FILE), ".section\t%s,\"%c\"\n", (NAME), \
-         (DECL) && (TREE_CODE (DECL) == FUNCTION_DECL || \
-                    DECL_READONLY_SECTION (DECL, RELOC)) ? 'x' : 'd')
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  m68k_coff_asm_named_section
 
 /* Support the ctors and dtors sections for g++.  */
 
index 46aeea02e7d8c062a1003fa812b62c33d711a419..b18c07cd089b5f9d1f196a0246385ecd4760dd19 100644 (file)
@@ -60,6 +60,8 @@ static rtx find_addr_reg PARAMS ((rtx));
 static const char *singlemove_string PARAMS ((rtx *));
 static void m68k_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static void m68k_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
+static void m68k_coff_asm_named_section PARAMS ((const char *, unsigned int,
+                                                unsigned int));
 \f
 
 /* Alignment to use for loops and jumps */
@@ -4208,3 +4210,21 @@ output_xorsi3 (operands)
     }
   return "eor%.l %2,%0";
 }
+
+/* Output assembly to switch to section NAME with attribute FLAGS.  */
+
+static void
+m68k_coff_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  char flagchar;
+
+  if (flags & SECTION_WRITE)
+    flagchar = 'd';
+  else
+    flagchar = 'x';
+
+  fprintf (asm_out_file, "\t.section\t%s,\"%c\"\n", name, flagchar);
+}
index 6a06d35acce69cde4b0a22e1b3c9aeeb95435016..a8b32e6e90dba144c246e106bfc8791f0e7793c3 100644 (file)
@@ -58,9 +58,6 @@ Boston, MA 02111-1307, USA.  */
 #undef FINI_SECTION_ASM_OP
 #define FINI_SECTION_ASM_OP    "\t.section\t.fini"
 
-#undef EH_FRAME_SECTION_ASM_OP
-#define EH_FRAME_SECTION_ASM_OP        "\t.section\t.eh_frame"
-
 /* Do I need this? */
 #undef INVOKE__main
 
index 2be34328f14508a266c854c7172150ae5a2eaea6..81358f717bf05547c3bd9d446a9e2b5e1ca3b394 100644 (file)
@@ -1673,7 +1673,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
 #undef CONST_SECTION_ASM_OP
 #undef CTORS_SECTION_ASM_OP
 #undef DTORS_SECTION_ASM_OP
-#undef  ASM_OUTPUT_SECTION_NAME
+#undef  TARGET_ASM_NAMED_SECTION
 #undef INIT_SECTION_ASM_OP
 #undef FINI_SECTION_ASM_OP
 #undef TYPE_ASM_OP
index 417271d21f2d444fa2d7ce646c8bb343db906e7b..2d0c195549ad3597b1fdeac3965afd80ddc21ba3 100644 (file)
@@ -221,30 +221,8 @@ rdata_section ()                                           \
 #undef DO_GLOBAL_DTORS_BODY
 #undef INIT_SECTION_ASM_OP
 
-#define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
-
 #define SUPPORTS_ONE_ONLY 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-#undef  ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)     \
-  do                                                           \
-    {                                                          \
-      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)         \
-       fprintf (STREAM, "\t.section %s,\"x\"\n", NAME);        \
-      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))  \
-       fprintf (STREAM, "\t.section %s,\"\"\n", NAME);         \
-      else                                                     \
-       fprintf (STREAM, "\t.section %s,\"w\"\n", NAME);        \
-      /* Functions may have been compiled at various levels of \
-        optimization so we can't use `same_size' here.         \
-        Instead, have the linker pick one.  */                 \
-      if ((DECL) && DECL_ONE_ONLY (DECL))                      \
-       fprintf (STREAM, "\t.linkonce %s\n",                    \
-                TREE_CODE (DECL) == FUNCTION_DECL              \
-                ? "discard" : "same_size");                    \
-    }                                                          \
-  while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
index e1f0f3382e4e9927648457267b003807d8d6aae1..778b734be35d9d6fb2329aef715836d19f7b3686 100644 (file)
@@ -132,6 +132,9 @@ static int        mcore_dllexport_p            PARAMS ((tree));
 static int        mcore_dllimport_p            PARAMS ((tree));
 static int        mcore_valid_decl_attribute   PARAMS ((tree, tree,
                                                        tree, tree));
+static void      mcore_asm_named_section      PARAMS ((const char *,
+                                                       unsigned int,
+                                                       unsigned int));
 \f
 /* Initialize the GCC target structure.  */
 #ifdef TARGET_DLLIMPORT_DECL_ATTRIBUTES
@@ -3594,3 +3597,12 @@ mcore_naked_function_p ()
 {
   return lookup_attribute ("naked", DECL_MACHINE_ATTRIBUTES (current_function_decl)) != NULL_TREE;
 }
+
+static void
+mcore_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  fprintf (asm_out_file, "\t.section %s\n", name);
+}
index fecb9d8b4cf034c6d11d4ecefdb8b1e58b70407c..3cd595efb36d86a5aba54cf8b53f83cf1a7dfc23 100644 (file)
@@ -1137,9 +1137,8 @@ switch_to_section (section, decl)                         \
     }                                                          \
 }
 
-
-#define ASM_OUTPUT_SECTION(file, nam) \
-   do { fprintf (file, "\t.section\t%s\n", nam); } while (0) 
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  mcore_asm_named_section
 
 /* This is how to output an insn to push a register on the stack.
    It need not be very fast code.  */
index 34d26c773da5c387934269db3f121da80ee4da4a..3ef9020c28a88c2a5704fe504b6486b36cfc0562 100644 (file)
@@ -56,24 +56,9 @@ do {                                                 \
 #undef MAX_OFILE_ALIGNMENT
 #define MAX_OFILE_ALIGNMENT (32768*8)
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC) \
-do {                                                           \
-  extern FILE *asm_out_text_file;                              \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)             \
-    fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))      \
-    fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME));    \
-  else if (! strcmp (NAME, ".bss"))                             \
-    fprintf (F, "\t.section %s,\"aw\",@nobits\n", (NAME));      \
-  else                                                         \
-    fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME));   \
-} while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* The following macro defines the format used to output the second
    operand of the .type assembler directive.  Different svr4 assemblers
@@ -211,8 +196,6 @@ do {                                                                         \
  } while (0)
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#undef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
 #undef UNIQUE_SECTION
 #define UNIQUE_SECTION(DECL,RELOC)                                        \
 do {                                                                      \
index 0636200ed4b7ced0b10d13562d24aeab09db5589..782c62bad8dfa06b45dad6f7502dc60bf24b826c 100644 (file)
@@ -73,24 +73,9 @@ do {                                                 \
   fprintf (asm_out_text_file, "\t.etype\t0x%x;", (a)); \
 } while (0)
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#undef ASM_OUTPUT_SECTION_NAME
-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC) \
-do {                                                           \
-  extern FILE *asm_out_text_file;                              \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)             \
-    fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))      \
-    fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME));    \
-  else if (! strcmp (NAME, ".bss"))                            \
-    fprintf (F, "\t.section %s,\"aw\",@nobits\n", (NAME));     \
-  else                                                         \
-    fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME));   \
-} while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* The following macro defines the format used to output the second
    operand of the .type assembler directive.  Different svr4 assemblers
@@ -192,8 +177,6 @@ do {                                                                         \
  } while (0)
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#undef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
 #undef UNIQUE_SECTION
 #define UNIQUE_SECTION(DECL,RELOC)                                        \
 do {                                                                      \
index 62ddc19b0cd18e96e7cb761b510e064703da73ee..4e3a227638a13ee1008e491edeb7acd2fc2b99a4 100644 (file)
@@ -217,19 +217,6 @@ Boston, MA 02111-1307, USA.  */
 
 #define POPSECTION_ASM_OP      "\t.popsection"
 
-#define DEBUG_INFO_SECTION     ".debug_info,0x7000001e,0,0,1"
-#define DEBUG_LINE_SECTION     ".debug_line,0x7000001e,0,0,1"
-#define DEBUG_SFNAMES_SECTION  ".debug_sfnames,0x7000001e,0,0,1"
-#define DEBUG_SRCINFO_SECTION  ".debug_srcinfo,0x7000001e,0,0,1"
-#define DEBUG_MACINFO_SECTION  ".debug_macinfo,0x7000001e,0,0,1"
-#define DEBUG_PUBNAMES_SECTION ".debug_pubnames,0x7000001e,0,0,1"
-#define DEBUG_ARANGES_SECTION  ".debug_aranges,0x7000001e,0,0,1"
-#define DEBUG_FRAME_SECTION    ".debug_frame,0x7000001e,0x08000000,0,1"
-#define DEBUG_ABBREV_SECTION   ".debug_abbrev,0x7000001e,0,0,1"
-#define DEBUG_LOC_SECTION      ".debug_loc,0x7000001e,0,0,1"
-#define DEBUG_STR_SECTION      ".debug_str,0x7000001e,0,0,1"
-#define DEBUG_RANGES_SECTION   ".debug_ranges,0x7000001e,0,0,1"
-
 /* ??? If no mabi=X option give, but a mipsX option is, then should depend
    on the mipsX option.  */
 /* If no mips[3,4] option given, give the appropriate default for mabi=X */
@@ -278,12 +265,9 @@ Boston, MA 02111-1307, USA.  */
 #if _MIPS_SZPTR == 64
 #define CTORS_SECTION_ASM_OP "\t.section\t.ctors,1,2,0,8"
 #define DTORS_SECTION_ASM_OP "\t.section\t.dtors,1,2,0,8"
-#define EH_FRAME_SECTION_ASM_OP "\t.section\t.eh_frame,1,2,0,8"
 #else /* _MIPS_SZPTR != 64 */
 #define CTORS_SECTION_ASM_OP "\t.section\t.ctors,1,2,0,4"
 #define DTORS_SECTION_ASM_OP "\t.section\t.dtors,1,2,0,4"
-#define EH_FRAME_SECTION_ASM_OP "\t.section\t.eh_frame,1,2,0,4"
-
 #endif /* _MIPS_SZPTR == 64 */
 
 #else /* ! (defined (CRT_BEGIN) || defined (CRT_END)) */
@@ -293,8 +277,6 @@ Boston, MA 02111-1307, USA.  */
   (Pmode == DImode ? "\t.section\t.ctors,1,2,0,8" : "\t.section\t.ctors,1,2,0,4")
 #define DTORS_SECTION_ASM_OP \
   (Pmode == DImode ? "\t.section\t.dtors,1,2,0,8" : "\t.section\t.dtors,1,2,0,4")
-#define EH_FRAME_SECTION_ASM_OP \
-  (Pmode == DImode ? "\t.section\t.eh_frame,1,2,0,8" : "\t.section\t.eh_frame,1,2,0,4")
 #endif /* defined (CRT_BEGIN) || defined (CRT_END) */
 
 /* A default list of other sections which we might be "in" at any given
@@ -382,22 +364,9 @@ dtors_section ()                                                   \
     fprintf (FILE, "\n");                                              \
   } while (0)
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  */
-
-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC)                  \
-do {                                                                   \
-  extern FILE *asm_out_text_file;                                      \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                     \
-    fprintf (asm_out_text_file, "\t.section %s,1,6,4,4\n", (NAME));    \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))              \
-    fprintf (F, "\t.section %s,1,2,0,8\n", (NAME));                    \
-  else if (! strcmp (NAME, ".bss"))                                    \
-    fprintf (F, "\t.section %s,\"aw\",@nobits\n", (NAME));             \
-  else                                                                 \
-    fprintf (F, "\t.section %s,1,3,0,8\n", (NAME));                    \
-} while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  iris6_asm_named_section
 
 /* Stuff for constructors.  End here.  */
 
index 76559e372ca3dfce0e44e2ae94420209cbf1ced3..409af7d0ff440b51926c35aff0b1441b62334ab4 100644 (file)
@@ -49,8 +49,6 @@ Boston, MA 02111-1307, USA.  */
 
 /* The GNU linker supports one-only sections.  */
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#undef  UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
 #define UNIQUE_SECTION(DECL, RELOC)                            \
   do                                                           \
     {                                                          \
index fc181f64e066601275f3a5e892d744a6b477676b..be0033a9fb168a1fb6338c72874ac988b68ad1db 100644 (file)
@@ -110,7 +110,9 @@ static void mips_add_gc_roots                   PARAMS ((void));
 static void mips_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
 static void mips_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static enum processor_type mips_parse_cpu       PARAMS ((const char *));
-
+static void iris6_asm_named_section            PARAMS ((const char *,
+                                                        unsigned int,
+                                                        unsigned int));
 /* Global variables for machine-dependent things.  */
 
 /* Threshold for data being put into the small data/bss area, instead
@@ -9800,3 +9802,49 @@ mips_parse_cpu (cpu_string)
 
   return cpu;
 }
+
+/* Output assembly to switch to section NAME with attribute FLAGS.  */
+
+static void
+iris6_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align;
+{
+  unsigned int sh_type, sh_flags, sh_entsize;
+
+  sh_flags = 0;
+  if (!(flags & SECTION_DEBUG))
+    sh_flags |= 2; /* SHF_ALLOC */
+  if (flags & SECTION_WRITE)
+    sh_flags |= 1; /* SHF_WRITE */
+  if (flags & SECTION_CODE)
+    sh_flags |= 4; /* SHF_EXECINSTR */
+  if (flags & SECTION_SMALL)
+    sh_flags |= 0x10000000; /* SHF_MIPS_GPREL */
+  if (strcmp (name, ".debug_frame") == 0)
+    sh_flags |= 0x08000000; /* SHF_MIPS_NOSTRIP */
+
+  if (flags & SECTION_DEBUG)
+    sh_type = 0x7000001e; /* SHT_MIPS_DWARF */
+  else if (flags & SECTION_BSS)
+    sh_type = 8; /* SHT_NOBITS */
+  else
+    sh_type = 1; /* SHT_PROGBITS */
+
+  if (flags & SECTION_CODE)
+    sh_entsize = 4;
+  else
+    sh_entsize = 0;
+
+  if (align == 0)
+    {
+      if (flags & SECTION_CODE)
+       align = 4;
+      else
+       align = 8;
+    }
+
+  fprintf (asm_out_file, "\t.section %s,%u,%u,%u,%u\n",
+          name, sh_type, sh_flags, sh_entsize, align);
+}
index 0d47c087b665184479a524d608583b35c4d144fa..fab6957a20d11022d5ae9ee9ceb7b6919e5b72c7 100644 (file)
@@ -3097,10 +3097,6 @@ typedef struct mips_args {
    If you are changing this macro, you should look at
    mips_select_section and see if it needs a similar change.  */
 
-#ifndef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) (0)
-#endif
-
 #define ENCODE_SECTION_INFO(DECL)                                      \
 do                                                                     \
   {                                                                    \
@@ -3120,7 +3116,7 @@ do                                                                        \
               references again.  We force it to work by putting string \
               addresses in the constant pool and indirecting.  */      \
            && (! current_function_decl                                 \
-               || ! UNIQUE_SECTION_P (current_function_decl)))         \
+               || ! DECL_ONE_ONLY (current_function_decl)))            \
          {                                                             \
            SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (DECL), 0)) = 1;        \
            mips_string_length += TREE_STRING_LENGTH (DECL);            \
index e3f7821aac7a9f9a8ef9be52247e12c57443ec10..13e7b089d79890e465ff9aaea891e606dbfa09c0 100644 (file)
@@ -201,24 +201,9 @@ do {                                                                        \
       }                                                                        \
   } while (0)
 
-/*
- A C statement to output something to the assembler file to switch to section
- NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
- NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
- define this macro in such cases.
-*/
-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC)                        \
-do {                                                                         \
-  extern FILE *asm_out_text_file;                                            \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                           \
-    fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))                    \
-    fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME));                  \
-  else if (! strcmp (NAME, ".bss"))                                         \
-    fprintf (F, "\t.section %s,\"aw\",@nobits\n", (NAME));                  \
-  else                                                                       \
-    fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME));                 \
-} while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* Since gas and gld are standard on NetBSD, we don't need these */
 #undef ASM_FINAL_SPEC
index 14a1594c3376b82ba2dcd3828d1ca98e9516e003..e4847cef9a26e3ef1ad9f37c54b9cb2a921c7940 100644 (file)
@@ -103,23 +103,9 @@ Boston, MA 02111-1307, USA.  */
 #undef ASM_FINAL_SPEC
 #undef STARTFILE_SPEC
 
-/* A C statement to output something to the assembler file to switch to 
-   section NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL 
-   or NULL_TREE.  Some target formats do not support arbitrary sections.  
-   Do not define this macro in such cases. mips.h doesn't define this, 
-   do it here.  */
-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC)                        \
-do {                                                                         \
-  extern FILE *asm_out_text_file;                                            \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                           \
-    fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))                    \
-    fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME));                  \
-  else if (! strcmp (NAME, ".bss"))                                         \
-    fprintf (F, "\t.section %s,\"aw\",@nobits\n", (NAME));                  \
-  else                                                                       \
-    fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME));                 \
-} while (0)
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* collect2 support (Macros for initialization).  */
 
index 76e1a3505a6ef0da2f20b6af0541495ee6cecbb6..d32675cfc5e604c910e5dd2ef3b7f6b616c18ec0 100644 (file)
@@ -232,6 +232,11 @@ Boston, MA 02111-1307, USA.  */
        fprintf (FILE, ".reference .destructors_used\n");        \
       } while (0)
 
+/* ??? Should be changed to EH_FRAME_SECTION_NAME, but that requires
+   named section support.  Based on this definition, it seems clear
+   that the object file format supports named sections, but it has
+   not been implemented in gcc.  */
+#error "Implement named section support"
 #define EH_FRAME_SECTION_ASM_OP "\t.section __TEXT,__eh_frame,regular"
 
 /* Don't output a .file directive.  That is only used by the assembler for
index 04bc25bad74dc17f69032309e6a612f92f087c15..bc2cc92698f668a517c2e37926763338c9dcec0b 100644 (file)
@@ -186,72 +186,10 @@ dtors_section ()                                                  \
     }                                                                  \
 }
 
-/* Switch into a generic section.
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.
-   If the section has already been defined, we must not
-   emit the attributes here. The SVR4 assembler does not
-   recognize section redefinitions.
-   If DECL is NULL, no attributes are emitted.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)               \
-  do                                                                   \
-    {                                                                  \
-      static htab_t htab;                                               \
-                                                                        \
-      struct section_info                                               \
-      {                                                                        \
-       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;              \
-      };                                                                \
-                                                                        \
-      struct section_info *s;                                          \
-      const char *mode;                                                        \
-      enum sect_enum type;                                              \
-      PTR* slot;                                                        \
-                                                                        \
-      /* The names we put in the hashtable will always be the unique    \
-        versions gived to us by the stringtable, so we can just use    \
-        their addresses as the keys.  */                               \
-      if (!htab)                                                        \
-       htab = htab_create (31,                                         \
-                           htab_hash_pointer,                          \
-                           htab_eq_pointer,                            \
-                           NULL);                                      \
-                                                                        \
-      if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                   \
-       type = SECT_EXEC, mode = "ax";                                  \
-      else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))            \
-       type = SECT_RO, mode = "a";                                     \
-      else                                                             \
-       type = SECT_RW, mode = "aw";                                    \
-                                                                       \
-                                                                        \
-      /* See if we already have an entry for this section.  */          \
-      slot = htab_find_slot (htab, NAME, INSERT);                       \
-      if (!*slot)                                                       \
-       {                                                               \
-         s = (struct section_info *) xmalloc (sizeof (* s));           \
-         s->type = type;                                               \
-         *slot = s;                                                    \
-         fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n",           \
-                  NAME, mode);                                         \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         s = (struct section_info *) *slot;                            \
-         if (DECL && s->type != type)                                  \
-           error_with_decl (DECL,                                      \
-                            "%s causes a section type conflict");      \
-                                                                       \
-         fprintf (FILE, "\t.section\t%s\n", NAME);                     \
-       }                                                               \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
 #define UNIQUE_SECTION(DECL,RELOC)                             \
 do {                                                           \
   int len;                                                     \
index 361c5bb86cf3926abe13286293d18516b3a7eba0..6f67f35cc1d969a589f65bdb0cb473f2588df424 100644 (file)
@@ -73,13 +73,8 @@ Boston, MA 02111-1307, USA.
   do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
        fputc ('\n', FILE); } while (0)
 
-/* Switch into a generic section. */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-  fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
-          (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
-          (DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
-
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* Define the pseudo-ops used to switch to the .ctors and .dtors
    sections. */
index 867206dedf42983fd866705d0647857f4088075f..96ac5c7dc83804d58da831e04a891e01c67ee59e 100644 (file)
@@ -130,6 +130,14 @@ static void rs6000_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
 static void rs6000_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
 static rtx rs6000_emit_set_long_const PARAMS ((rtx,
   HOST_WIDE_INT, HOST_WIDE_INT));
+#if TARGET_ELF
+static unsigned int rs6000_elf_section_type_flags PARAMS ((tree, const char *,
+                                                          int));
+#endif
+#ifdef OBJECT_FORMAT_COFF
+static void xcoff_asm_named_section PARAMS ((const char *, unsigned int,
+                                            unsigned int));
+#endif
 \f
 /* Default register names.  */
 char rs6000_reg_names[][8] =
@@ -177,6 +185,11 @@ static char alt_reg_names[][8] =
 #undef TARGET_ASM_FUNCTION_EPILOGUE
 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
 
+#if TARGET_ELF
+#undef TARGET_SECTION_TYPE_FLAGS
+#define TARGET_SECTION_TYPE_FLAGS  rs6000_elf_section_type_flags
+#endif
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Override command line options.  Mostly we process the processor
@@ -8675,3 +8688,33 @@ toc_section ()
 }
 
 #endif /* TARGET_MACHO */
+
+#if TARGET_ELF
+static unsigned int
+rs6000_elf_section_type_flags (decl, name, reloc)
+     tree decl;
+     const char *name;
+     int reloc;
+{
+  unsigned int flags = default_section_type_flags (decl, name, reloc);
+
+  /* ??? The flag_pic check appears redundant with the DECL_READONLY_SECTION
+     check in default_section_type_flags.  */
+  if (TARGET_RELOCATABLE || flag_pic)
+    flags &= ~SECTION_WRITE;
+
+  /* Solaris doesn't like @nobits, and gas can handle .sbss without it.  */
+  flags &= ~SECTION_BSS;
+}
+#endif
+
+#ifdef OBJECT_FORMAT_COFF
+static void
+xcoff_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  fprintf (asm_out_file, "\t.csect %s\n", name);
+}
+#endif
index 9871d20c1f64839e2a3a7ca1204cc209168be3af..3011c30a669b3670dfcfb9b3c2f2dc526e1cfe20 100644 (file)
@@ -992,63 +992,6 @@ do {                                               \
     asm_fprintf (FILE, "%U%s", _name);         \
 } while (0)
 
-/* Switch into a generic section.
-
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.
-
-   If the section has already been defined, we must not
-   emit the attributes here. The SVR4 assembler does not
-   recognize section redefinitions.
-   If DECL is NULL, no attributes are emitted.
-
-   Note, Solaris as doesn't like @nobits, and gas can handle .sbss without
-   needing @nobits.  */
-
-/* Override elfos.h definition.  */
-#undef ASM_OUTPUT_SECTION_NAME
-#define        ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)                \
-do {                                                                   \
-  static struct section_info                                           \
-    {                                                                  \
-      struct section_info *next;                                       \
-      char *name;                                                      \
-      enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;               \
-    } *sections;                                                       \
-  struct section_info *s;                                              \
-  const char *mode;                                                    \
-  enum sect_enum type;                                                 \
-                                                                       \
-  for (s = sections; s; s = s->next)                                   \
-    if (!strcmp (NAME, s->name))                                       \
-      break;                                                           \
-                                                                       \
-  if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                       \
-    type = SECT_EXEC, mode = "ax";                                     \
-  else if (DECL && DECL_READONLY_SECTION (DECL, RELOC) && !TARGET_RELOCATABLE && !flag_pic) \
-    type = SECT_RO, mode = "a";                                                \
-  else                                                                 \
-    type = SECT_RW, mode = "aw";                                       \
-                                                                       \
-  if (s == 0)                                                          \
-    {                                                                  \
-      s = (struct section_info *) xmalloc (sizeof (struct section_info));  \
-      s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));                \
-      strcpy (s->name, NAME);                                          \
-      s->type = type;                                                  \
-      s->next = sections;                                              \
-      sections = s;                                                    \
-      fprintf (FILE, "\t.section\t\"%s\",\"%s\"\n", NAME, mode);       \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      if (DECL && s->type != type)                                     \
-       error_with_decl (DECL, "%s causes a section type conflict");    \
-                                                                       \
-      fprintf (FILE, "\t.section\t\"%s\"\n", NAME);                    \
-    }                                                                  \
-} while (0)
-
 /* Override elfos.h definition.  */
 #undef ASM_OUTPUT_CONSTRUCTOR
 #define        ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                               \
index 53cc7e730bb8de9b7aafd43ed6c420bb83b460e9..4d0a7fd39494ac95628b8dd3444617f8f33f5b4e 100644 (file)
@@ -489,11 +489,8 @@ toc_section ()                                             \
     }                                                  \
   } while (0)
 
-#define ASM_OUTPUT_SECTION_NAME(ASM_OUT_FILE,DECL,NAME,RELOC)  \
-  do { fputs ("\t.csect ", ASM_OUT_FILE);                      \
-       fputs (TREE_STRING_POINTER (DECL_SECTION_NAME (DECL)), ASM_OUT_FILE); \
-       putc ('\n', ASM_OUT_FILE);                              \
-  } while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  xcoff_asm_named_section
 
 /* Define the name of the section to use for the exception tables.
    TODO: test and see if we can use read_only_data_section, if so,
index 5acfe75e151b833d9b7a401e39318280d9dd7cf4..183fa96c2ab3c3a8711e01cb3afb2b446b496c73 100644 (file)
@@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA.  */
 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
 #undef CTORS_SECTION_ASM_OP
 #undef DTORS_SECTION_ASM_OP
-#undef ASM_OUTPUT_SECTION_NAME
+#undef TARGET_ASM_NAMED_SECTION
 #undef ASM_OUTPUT_CONSTRUCTOR
 #undef ASM_OUTPUT_DESTRUCTOR
 #undef ASM_DECLARE_FUNCTION_NAME
index 87b5be9ee9e89a045ab1960eb3d1d283ecc395a0..6c2104f258559784f64158e0b31420097fde290a 100644 (file)
@@ -156,6 +156,8 @@ static rtx mark_constant_pool_use PARAMS ((rtx));
 static int sh_valid_decl_attribute PARAMS ((tree, tree, tree, tree));
 static void sh_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
 static void sh_insert_attributes PARAMS ((tree, tree *));
+static void sh_asm_named_section PARAMS ((const char *, unsigned int,
+                                         unsigned int));
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_VALID_DECL_ATTRIBUTE
@@ -5556,3 +5558,12 @@ sh_can_redirect_branch (branch1, branch2)
   return 0;
 }
 
+static void
+sh_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int flags ATTRIBUTE_UNUSED;
+{
+  /* ??? Perhaps we should be using default_coff_asm_named_section.  */
+  fprintf (asm_out_file, "\t.section %s\n", name);
+}
index e82a9d243753b97da59e35eea74665f3f7c6ac91..1377610a319199aa52fcb6a70c2a26395a3febde 100644 (file)
@@ -1948,13 +1948,8 @@ dtors_section()                                                  \
    which could be text or it could be a user defined section.  */
 #define JUMP_TABLES_IN_TEXT_SECTION 1
 
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-   do { fprintf (FILE, ".section\t%s\n", NAME); } while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  sh_asm_named_section
 
 /* This is the pseudo-op used to generate a reference to a specific
    symbol in some section.  */
index e7413ee30467c0a5eed9bc816312c86ea3571e96..2693f73cacbb2f165338c8bb3ccda80c27ba5b1c 100644 (file)
@@ -164,6 +164,8 @@ static void sparc_nonflat_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT,
                                                     int));
 static void sparc_nonflat_function_prologue PARAMS ((FILE *, HOST_WIDE_INT,
                                                     int));
+static void sparc_elf_asm_named_section PARAMS ((const char *, unsigned int,
+                                                unsigned int));
 \f
 /* Option handling.  */
 
@@ -8688,3 +8690,23 @@ sparc_add_gc_roots ()
   ggc_add_root (ultra_pipe_hist, ARRAY_SIZE (ultra_pipe_hist),
                sizeof (ultra_pipe_hist[0]), &mark_ultrasparc_pipeline_state);
 }
+
+static void
+sparc_elf_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  fprintf (asm_out_file, "\t.section\t\"%s\"", name);
+
+  if (!(flags & SECTION_DEBUG))
+    fputs (",#alloc", asm_out_file);
+  if (flags & SECTION_WRITE)
+    fputs (",#write", asm_out_file);
+  if (flags & SECTION_CODE)
+    fputs (",#execinstr", asm_out_file);
+
+  /* ??? Handle SECTION_BSS.  */
+
+  fputc ('\n', asm_out_file);
+}
index 19b7f15fc4c2003cf68c719603428a5f8dd1c3c1..4cd0b396ca73aea9880688eb1040cbe69d9f4061 100644 (file)
@@ -182,25 +182,10 @@ do { ASM_OUTPUT_ALIGN ((FILE), Pmode == SImode ? 2 : 3);          \
 #define CTORS_SECTION_ASM_OP    "\t.section\t\".ctors\",#alloc,#write"
 #undef DTORS_SECTION_ASM_OP
 #define DTORS_SECTION_ASM_OP    "\t.section\t\".dtors\",#alloc,#write"
-#undef EH_FRAME_SECTION_ASM_OP
-#define EH_FRAME_SECTION_ASM_OP "\t.section\t\".eh_frame\",#alloc,#write"
-
-/* A C statement to output something to the assembler file to switch to section
-   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
-   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
-   define this macro in such cases.  */
-
-#undef ASM_OUTPUT_SECTION_NAME /* Override svr4.h's definition.  */
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
-do {                                                                   \
-  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)                     \
-    fprintf (FILE, ".section\t\"%s\",#alloc,#execinstr\n",             \
-                                             (NAME));          \
-  else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))              \
-    fprintf (FILE, ".section\t\"%s\",#alloc\n", (NAME));               \
-  else                                                                 \
-    fprintf (FILE, ".section\t\"%s\",#alloc,#write\n", (NAME));                \
-} while (0)
+
+/* Switch into a generic section.  */
+#undef TARGET_ASM_NAMED_SECTION
+#define TARGET_ASM_NAMED_SECTION  sparc_elf_asm_named_section
 
 /* A C statement (sans semicolon) to output to the stdio stream
    FILE the assembler definition of uninitialized global DECL named
index 4d1ca2c0895896688efd68c2437d3b296e09e0b8..666c31b81a32deb09098d84ff24f302210eedb67 100644 (file)
@@ -2861,11 +2861,11 @@ finish_objects (method_type, initp, body)
       else
        assemble_destructor (fnname);
     }
-#if defined (ASM_OUTPUT_SECTION_NAME) && defined (ASM_OUTPUT_CONSTRUCTOR)
+#if defined (ASM_OUTPUT_CONSTRUCTOR)
   /* If we're using init priority we can't use assemble_*tor, but on ELF
      targets we can stick the references into named sections for GNU ld
      to collect.  */
-  else
+  else if (targetm.have_named_sections)
     {
       char buf[15];
       sprintf (buf, ".%ctors.%.5u", method_type == 'I' ? 'c' : 'd',
index 9f62009ee5889ab74905a14ce155982e49db0f5c..75e944176c234813d86f9a102078b65a57d07db1 100644 (file)
@@ -211,7 +211,7 @@ __do_global_dtors_aux (void)
       f ();
     }
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 #if defined(CRT_GET_RFIB_TEXT) || defined(CRT_GET_RFIB_DATA)
   /* If we used the new __register_frame_info_bases interface,
      make sure that we deregister from the same place.  */
@@ -240,7 +240,7 @@ fini_dummy (void)
   asm (TEXT_SECTION_ASM_OP);
 }
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 /* Stick a call to __register_frame_info into the .init section.  For some
    reason calls with no arguments work more reliably in .init, so stick the
    call in another function.  */
@@ -279,7 +279,7 @@ init_dummy (void)
 #endif
   asm (TEXT_SECTION_ASM_OP);
 }
-#endif /* EH_FRAME_SECTION_ASM_OP */
+#endif /* EH_FRAME_SECTION_NAME */
 
 #else  /* OBJECT_FORMAT_ELF */
 
@@ -350,13 +350,13 @@ __do_global_dtors (void)
   for (p = __DTOR_LIST__ + 1; (f = *p); p++)
     f ();
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
   if (__deregister_frame_info)
     __deregister_frame_info (__EH_FRAME_BEGIN__);
 #endif
 }
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 /* Define a function here to call __register_frame.  crtend.o is linked in
    after libgcc.a, and hence can't call libgcc.a functions directly.  That
    can lead to unresolved function references.  */
@@ -404,16 +404,16 @@ asm (DTORS_SECTION_ASM_OP);       /* cc1 doesn't know that we are switching! */
 STATIC func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
 #endif
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 /* Stick a label at the beginning of the frame unwind info so we can register
    and deregister it with the exception handling library code.  */
-
-asm (EH_FRAME_SECTION_ASM_OP);
 #ifdef INIT_SECTION_ASM_OP
 STATIC
 #endif
-char __EH_FRAME_BEGIN__[] = { };
-#endif /* EH_FRAME_SECTION_ASM_OP */
+char __EH_FRAME_BEGIN__[]
+     __attribute__((section(EH_FRAME_SECTION_NAME)))
+     = { };
+#endif /* EH_FRAME_SECTION_NAME */
 
 #endif /* defined(CRT_BEGIN) */
 
@@ -494,14 +494,14 @@ asm (TEXT_SECTION_ASM_OP);
    not an SVR4-style .init section.  __do_global_ctors can be non-static
    in this case because we protect it with -hidden_symbol.  */
 static func_ptr __CTOR_END__[];
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 extern void __frame_dummy (void);
 #endif
 void
 __do_global_ctors (void)
 {
   func_ptr *p;
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
   __frame_dummy ();
 #endif
   for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
@@ -535,13 +535,12 @@ STATIC func_ptr __DTOR_END__[1] __attribute__ ((__unused__))
   = { (func_ptr) 0 };
 #endif
 
-#ifdef EH_FRAME_SECTION_ASM_OP
+#ifdef EH_FRAME_SECTION_NAME
 /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
    this would be the 'length' field in a real FDE.  */
-
-typedef unsigned int ui32 __attribute__ ((mode (SI)));
-asm (EH_FRAME_SECTION_ASM_OP);
-STATIC ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
+STATIC int __FRAME_END__[]
+     __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME)))
+     = { 0 };
 #endif /* EH_FRAME_SECTION */
 
 #endif /* defined(CRT_END) */
@@ -601,14 +600,9 @@ __dereg_frame_dtor (void)
 }
 
 /* Terminate the frame section with a final zero.  */
-
-/* Force cc1 to switch to .data section.  */
-static void * force_to_data[1] __attribute__ ((__unused__)) = { };
-
-typedef unsigned int ui32 __attribute__ ((mode (SI)));
-asm (EH_FRAME_SECTION_ASM_OP);
-static ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
-
+STATIC int __FRAME_END__[]
+     __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME)))
+     = { 0 };
 #endif /* CRT_END */
 
 #endif /* OBJECT_FORMAT_MACHO */
index 4eea7ca82c05a0c5120c721ceb970d1eee2ba028..60a91fe185f5d1703b69bd3029fdab5edc946c92 100644 (file)
@@ -83,6 +83,7 @@ Boston, MA 02111-1307, USA.  */
 #include "tm_p.h"
 #include "ggc.h"
 #include "debug.h"
+#include "target.h"
 
 #ifdef XCOFF_DEBUGGING_INFO
 #include "xcoffout.h"
@@ -290,9 +291,7 @@ static void dbxout_start_source_file        PARAMS ((unsigned, const char *));
 static void dbxout_end_source_file     PARAMS ((unsigned));
 static void dbxout_source_line         PARAMS ((unsigned int, const char *));
 static void dbxout_source_file         PARAMS ((FILE *, const char *));
-#if defined(ASM_OUTPUT_SECTION_NAME)
 static void dbxout_function_end                PARAMS ((void));
-#endif
 static void dbxout_typedefs            PARAMS ((tree));
 static void dbxout_type_index          PARAMS ((tree));
 #if DBX_CONTIN_LENGTH > 0
@@ -378,7 +377,6 @@ struct gcc_debug_hooks xcoff_debug_hooks =
 };
 #endif /* XCOFF_DEBUGGING_INFO  */
 \f
-#if defined(ASM_OUTPUT_SECTION_NAME)
 static void
 dbxout_function_end ()
 {
@@ -399,7 +397,6 @@ dbxout_function_end ()
   assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
   fprintf (asmfile, "\n");
 }
-#endif /* ! NO_DBX_FUNCTION_END */
 
 /* At the beginning of compilation, start writing the symbol table.
    Initialize `typevec' and output the standard data types of C.  */
@@ -642,14 +639,12 @@ dbxout_function_decl (decl)
 #ifdef DBX_OUTPUT_FUNCTION_END
   DBX_OUTPUT_FUNCTION_END (asmfile, decl);
 #endif
-#if defined(ASM_OUTPUT_SECTION_NAME)
   if (use_gnu_debug_info_extensions
 #if defined(NO_DBX_FUNCTION_END)
       && ! NO_DBX_FUNCTION_END
 #endif
-      )
+      && targetm.have_named_sections)
     dbxout_function_end ();
-#endif
 }
 
 #endif /* DBX_DEBUGGING_INFO  */
index d2724f30883335326c4179dbe399c2f31fd40946..20729249dcfdc96918f8fa2e70e8631ec4a8ac37 100644 (file)
@@ -209,23 +209,17 @@ do { ASM_OUTPUT_LABEL(FILE,LABEL_ALTERNATE_NAME (INSN)); } while (0)
 #define DWARF2_UNWIND_INFO 1
 #endif
 
-#if defined (DWARF2_UNWIND_INFO) && !defined (EH_FRAME_SECTION)
-# if defined (EH_FRAME_SECTION_ASM_OP)
-#  define EH_FRAME_SECTION() eh_frame_section ()
-# else
-   /* If we aren't using crtstuff to run ctors, don't use it for EH.  */
-#  if defined (ASM_OUTPUT_SECTION_NAME) && defined (ASM_OUTPUT_CONSTRUCTOR)
-#   define EH_FRAME_SECTION_ASM_OP     "\t.section\t.eh_frame,\"aw\""
-#   define EH_FRAME_SECTION() \
-     do { named_section (NULL_TREE, ".eh_frame", 0); } while (0)
-#  endif
-# endif
+/* If we have named section, and we're using crtstuff to run ctors,
+   then use named sections for registering eh frame information.  */
+#if defined (TARGET_ASM_NAMED_SECTION) && defined (ASM_OUTPUT_CONSTRUCTOR)
+#ifndef EH_FRAME_SECTION_NAME
+#define EH_FRAME_SECTION_NAME ".eh_frame"
+#endif
 #endif
 
 /* If we have no definition for UNIQUE_SECTION, but do have the 
    ability to generate arbitrary sections, construct something
    reasonable.  */
-#ifdef ASM_OUTPUT_SECTION_NAME
 #ifndef UNIQUE_SECTION
 #define UNIQUE_SECTION(DECL,RELOC)                             \
 do {                                                           \
@@ -244,10 +238,6 @@ do {                                                               \
   DECL_SECTION_NAME (DECL) = build_string (len, string);       \
 } while (0)
 #endif
-#ifndef UNIQUE_SECTION_P
-#define UNIQUE_SECTION_P(DECL) 0
-#endif
-#endif
 
 /* By default, we generate a label at the beginning and end of the
    text section, and compute the size of the text section by
index bdee2f892cf1e0d65faf216560e28e79cd4df6de..e9c747ac7e4ef91c0c8b01e93ab74c10d5568577 100644 (file)
@@ -5614,14 +5614,6 @@ Decode @var{sym_name} and store the real name part in @var{var}, sans
 the characters that encode section info.  Define this macro if
 @code{ENCODE_SECTION_INFO} alters the symbol's name string.
 
-@findex UNIQUE_SECTION_P
-@item UNIQUE_SECTION_P (@var{decl})
-A C expression which evaluates to true if @var{decl} should be placed
-into a unique section for some target-specific reason.  If you do not
-define this macro, the default is @samp{0}.  Note that the flag
-@option{-ffunction-sections} will also cause functions to be placed into
-unique sections.
-
 @findex UNIQUE_SECTION
 @item UNIQUE_SECTION (@var{decl}, @var{reloc})
 A C statement to build up a unique section name, expressed as a
@@ -5803,21 +5795,6 @@ A C statement to output something to the assembler file to handle a
 @samp{#ident} directive containing the text @var{string}.  If this
 macro is not defined, nothing is output for a @samp{#ident} directive.
 
-@findex ASM_OUTPUT_SECTION_NAME
-@item ASM_OUTPUT_SECTION_NAME (@var{stream}, @var{decl}, @var{name}, @var{reloc})
-A C statement to output something to the assembler file to switch to section
-@var{name} for object @var{decl} which is either a @code{FUNCTION_DECL}, a
-@code{VAR_DECL} or @code{NULL_TREE}.  @var{reloc}
-indicates whether the initial value of @var{exp} requires link-time
-relocations.  The string given by @var{name} will always be the
-canonical version stored in the global stringpool.
-
-Some target formats do not support arbitrary sections.  Do not define
-this macro in such cases.
-
-At present this macro is only used to support section attributes.
-When this macro is undefined, section attributes are disabled.
-
 @findex OBJC_PROLOGUE
 @item OBJC_PROLOGUE
 A C statement to output any assembler statements which are required to
@@ -5825,6 +5802,32 @@ precede any Objective-C object definitions or message sending.  The
 statement is executed only when compiling an Objective-C program.
 @end table
 
+@deftypefn {Target Hook} void TARGET_ASM_NAMED_SECTION (const char *@var{name}, unsigned int @var{flags}, unsigned int @var{align})
+Output assembly directives to switch to section @var{name}.  The section
+should have attributes as specified by @var{flags}, which is a bit mask
+of the @code{SECTION_*} flags defined in @file{output.h}.  If @var{align}
+is non-zero, it contains an alignment in bytes to be used for the section,
+otherwise some target default should be used.  Only targets that must 
+specify an alignment within the section directive need pay attention to
+@var{align} -- we will still use @code{ASM_OUTPUT_ALIGN}.
+@end deftypefn
+
+@deftypefn {Target Hook} bool TARGET_HAVE_NAMED_SECTIONS
+This flag is true if the target supports @code{TARGET_ASM_NAMED_SECTION}.
+@end deftypefn
+
+@deftypefn {Target Hook} {unsigned int} TARGET_SECTION_TYPE_FLAGS (tree @var{decl}, const char *@var{name}, int @var{reloc})
+Choose a set of section attributes for use by @code{TARGET_ASM_NAMED_SECTION}
+based on a variable or function decl, a section name, and whether or not the
+declaration's initializer may contain runtime relocations.  @var{decl} may be
+ null, in which case read-write data should be assumed.
+
+The default version if this function handles choosing code vs data,
+read-only vs read-write data, and @code{flag_pic}.  You should only
+need to override this if your target has special flags that might be
+set via @code{__attribute__}.
+@end deftypefn
+
 @need 2000
 @node Data Output
 @subsection Output of Data
@@ -7058,17 +7061,16 @@ This macro need not be defined on most platforms.
 A C expression to switch to the section in which the main
 exception table is to be placed (@pxref{Sections}).  The default is a
 section named @code{.gcc_except_table} on machines that support named
-sections via @code{ASM_OUTPUT_SECTION_NAME}, otherwise if @option{-fpic}
+sections via @code{TARGET_ASM_NAMED_SECTION}, otherwise if @option{-fpic}
 or @option{-fPIC} is in effect, the @code{data_section}, otherwise the
 @code{readonly_data_section}.
 
-@findex EH_FRAME_SECTION_ASM_OP
-@item EH_FRAME_SECTION_ASM_OP
-If defined, a C string constant, including spacing, for the assembler
-operation to switch to the section for exception handling frame unwind
-information.  If not defined, GCC will provide a default definition if the
-target supports named sections.  @file{crtstuff.c} uses this macro to
-switch to the appropriate section.
+@findex EH_FRAME_SECTION_NAME
+@item EH_FRAME_SECTION_NAME
+If defined, a C string constant for the name of the section containing
+exception handling frame unwind information.  If not defined, GCC will
+provide a default definition if the target supports named sections.
+@file{crtstuff.c} uses this macro to switch to the appropriate section.
 
 You should define this symbol if your target supports DWARF 2 frame
 unwind information and the default definition does not work.
index bf72954243f2bb7ac044a825d02395bc9e416d71..bedbf8ec95753a3f050db8259d8af43ef4a9f25b 100644 (file)
@@ -277,18 +277,6 @@ static void def_cfa_1                      PARAMS ((const char *, dw_cfa_location *));
 #define SECTION_ASM_OP "\t.section\t"
 #endif
 
-/* The default format used by the ASM_OUTPUT_SECTION macro (see below) to
-   print the SECTION_ASM_OP and the section name.  The default here works for
-   almost all svr4 assemblers, except for the sparc, where the section name
-   must be enclosed in double quotes.  (See sparcv4.h).  */
-#ifndef SECTION_FORMAT
-#ifdef PUSHSECTION_FORMAT
-#define SECTION_FORMAT PUSHSECTION_FORMAT
-#else
-#define SECTION_FORMAT         "%s%s\n"
-#endif
-#endif
-
 #ifndef DEBUG_FRAME_SECTION
 #define DEBUG_FRAME_SECTION    ".debug_frame"
 #endif
@@ -316,11 +304,6 @@ static void def_cfa_1                      PARAMS ((const char *, dw_cfa_location *));
    output operations.  These may be overridden from within the tm.h file,
    but typically, that is unnecessary.  */
 
-#ifndef ASM_OUTPUT_SECTION
-#define ASM_OUTPUT_SECTION(FILE, SECTION) \
-  fprintf ((FILE), SECTION_FORMAT, SECTION_ASM_OP, SECTION)
-#endif
-
 #ifdef SET_ASM_OP
 #ifndef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
 #define ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL(FILE, SY, HI, LO)            \
@@ -1753,12 +1736,13 @@ output_call_frame_info (for_eh)
 
   if (for_eh)
     {
-#ifdef EH_FRAME_SECTION
-      EH_FRAME_SECTION ();
+#ifdef EH_FRAME_SECTION_NAME
+      named_section_flags (EH_FRAME_SECTION_NAME, SECTION_WRITE,
+                          DWARF_OFFSET_SIZE);
 #else
       tree label = get_file_function_name ('F');
 
-      force_data_section ();
+      data_section ();
       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
       ASM_GLOBALIZE_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
       ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
@@ -1766,7 +1750,7 @@ output_call_frame_info (for_eh)
       assemble_label ("__FRAME_BEGIN__");
     }
   else
-    ASM_OUTPUT_SECTION (asm_out_file, DEBUG_FRAME_SECTION);
+    named_section_flags (DEBUG_FRAME_SECTION, SECTION_DEBUG, 1);
 
   /* Output the CIE.  */
   ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh);
@@ -1984,7 +1968,7 @@ output_call_frame_info (for_eh)
       ASM_OUTPUT_LABEL (asm_out_file, l2);
     }
 
-#ifndef EH_FRAME_SECTION
+#ifndef EH_FRAME_SECTION_NAME
   if (for_eh)
     dw2_asm_output_data (4, 0, "End of Table");
 #endif
@@ -6336,7 +6320,7 @@ output_comp_unit (die)
     secname = (const char *) DEBUG_INFO_SECTION;
 
   /* Output debugging information.  */
-  ASM_OUTPUT_SECTION (asm_out_file, secname);
+  named_section_flags (secname, SECTION_DEBUG, 1);
   output_compilation_unit_header ();
   output_die (die);
 
@@ -11574,10 +11558,12 @@ dwarf2out_start_source_file (lineno, filename)
     }
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file");
-      dw2_asm_output_data_uleb128 (lineno, "Included from line number %d", lineno);
-      dw2_asm_output_data_uleb128 (lookup_filename (filename), "Filename we just started");
+      dw2_asm_output_data_uleb128 (lineno, "Included from line number %d",
+                                  lineno);
+      dw2_asm_output_data_uleb128 (lookup_filename (filename),
+                                  "Filename we just started");
     }
 }
 
@@ -11594,7 +11580,7 @@ dwarf2out_end_source_file (lineno)
     }
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       dw2_asm_output_data (1, DW_MACINFO_end_file, "End file");
     }
 }
@@ -11616,7 +11602,7 @@ dwarf2out_define (lineno, buffer)
     }
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       dw2_asm_output_data (1, DW_MACINFO_define, "Define macro");
       dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno);
       dw2_asm_output_nstring (buffer, -1, "The macro");
@@ -11634,7 +11620,7 @@ dwarf2out_undef (lineno, buffer)
 {
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       dw2_asm_output_data (1, DW_MACINFO_undef, "Undefine macro");
       dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno);
       dw2_asm_output_nstring (buffer, -1, "The macro");
@@ -11707,26 +11693,27 @@ dwarf2out_init (main_input_filename)
   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
                               DEBUG_LINE_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (loc_section_label, DEBUG_LOC_SECTION_LABEL, 0);
-  ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LOC_SECTION);
+  named_section_flags (DEBUG_LOC_SECTION, SECTION_DEBUG, 1);
   ASM_OUTPUT_LABEL (asm_out_file, loc_section_label);
-  ASM_OUTPUT_SECTION (asm_out_file, DEBUG_ABBREV_SECTION);
+  named_section_flags (DEBUG_ABBREV_SECTION, SECTION_DEBUG, 1);
   ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
-  if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
-    {
-      ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
-      ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
-    }
-  ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
+  named_section_flags (DEBUG_INFO_SECTION, SECTION_DEBUG, 1);
   ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
-  ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
+  named_section_flags (DEBUG_LINE_SECTION, SECTION_DEBUG, 1);
   ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label,
                                   DEBUG_MACINFO_SECTION_LABEL, 0);
       ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
     }
+
+  if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
+    {
+      text_section ();
+      ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
+    }
 }
 
 /* Output stuff that dwarf requires at the end of every file,
@@ -11783,19 +11770,9 @@ dwarf2out_finish (input_filename)
     add_sibling_attributes (node->die);
 
   /* Output a terminator label for the .text section.  */
-  ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
+  text_section ();
   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
 
-#if 0
-  /* Output a terminator label for the .data section.  */
-  ASM_OUTPUT_SECTION (asm_out_file, DATA_SECTION);
-  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, DATA_END_LABEL, 0);
-
-  /* Output a terminator label for the .bss section.  */
-  ASM_OUTPUT_SECTION (asm_out_file, BSS_SECTION);
-  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0);
-#endif
-
   /* Output the source line correspondence table.  We must do this
      even if there is no line information.  Otherwise, on an empty
      translation unit, we will generate a present, but empty,
@@ -11803,7 +11780,7 @@ dwarf2out_finish (input_filename)
      examining the file.  */
   if (! DWARF2_ASM_LINE_DEBUG_INFO)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
+      named_section_flags (DEBUG_LINE_SECTION, SECTION_DEBUG, 1);
       output_line_info ();
     }
 
@@ -11834,13 +11811,13 @@ dwarf2out_finish (input_filename)
   output_comp_unit (comp_unit_die);
 
   /* Output the abbreviation table.  */
-  ASM_OUTPUT_SECTION (asm_out_file, DEBUG_ABBREV_SECTION);
+  named_section_flags (DEBUG_ABBREV_SECTION, SECTION_DEBUG, 1);
   output_abbrev_section ();
 
   if (pubname_table_in_use)
     {
       /* Output public names table.  */
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_PUBNAMES_SECTION);
+      named_section_flags (DEBUG_PUBNAMES_SECTION, SECTION_DEBUG, 1);
       output_pubnames ();
     }
 
@@ -11849,7 +11826,7 @@ dwarf2out_finish (input_filename)
   if (fde_table_in_use)
     {
       /* Output the address range information.  */
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_ARANGES_SECTION);
+      named_section_flags (DEBUG_ARANGES_SECTION, SECTION_DEBUG, 1);
       output_aranges ();
     }
 
@@ -11857,7 +11834,7 @@ dwarf2out_finish (input_filename)
   if (have_location_lists)
     {
       /* Output the location lists info. */
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LOC_SECTION);
+      named_section_flags (DEBUG_LOC_SECTION, SECTION_DEBUG, 1);
       output_location_lists (die);
       have_location_lists = 0;
     }
@@ -11865,14 +11842,14 @@ dwarf2out_finish (input_filename)
   /* Output ranges section if necessary.  */
   if (ranges_table_in_use)
     {
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_RANGES_SECTION);
+      named_section_flags (DEBUG_RANGES_SECTION, SECTION_DEBUG, 1);
       output_ranges ();
     }
 
   /* Have to end the primary source file. */
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
     { 
-      ASM_OUTPUT_SECTION (asm_out_file, DEBUG_MACINFO_SECTION);
+      named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG, 1);
       dw2_asm_output_data (1, DW_MACINFO_end_file, "End file");
     }
 }
index 58c406259d95f4f418358058753bd88a5088493f..f28c7afe2a62c53a9bb563aebd92c4e337099ae3 100644 (file)
@@ -159,10 +159,6 @@ extern void readonly_data_section  PARAMS ((void));
 /* Determine if we're in the text section. */
 extern int in_text_section             PARAMS ((void));
 
-#ifdef EH_FRAME_SECTION_ASM_OP
-extern void eh_frame_section           PARAMS ((void));
-#endif
-
 #ifdef CTORS_SECTION_ASM_OP
 extern void ctors_section PARAMS ((void));
 #endif
@@ -459,3 +455,30 @@ extern void default_function_pro_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
 
 /* Default target hook that outputs nothing to a stream.  */
 extern void no_asm_to_stream PARAMS ((FILE *));
+
+/* Flags controling properties of a section.  */
+#define SECTION_CODE       1   /* contains code */
+#define SECTION_WRITE      2   /* data is writable */
+#define SECTION_DEBUG      4   /* contains debug data */
+#define SECTION_LINKONCE    8  /* is linkonce */
+#define SECTION_SMALL     16   /* contains "small data" */
+#define SECTION_BSS       32   /* contains zeros only */
+#define SECTION_FORGET    64   /* forget that we've entered the section */
+#define SECTION_MACH_DEP  128  /* subsequent bits reserved for target */
+
+extern void named_section_flags                PARAMS ((const char *, unsigned int,
+                                                unsigned int));
+
+union tree_node;
+extern unsigned int default_section_type_flags PARAMS ((union tree_node *,
+                                                       const char *, int));
+
+extern void default_no_named_section PARAMS ((const char *, unsigned int,
+                                             unsigned int));
+extern void default_elf_asm_named_section PARAMS ((const char *, unsigned int,
+                                             unsigned int));
+extern void default_coff_asm_named_section PARAMS ((const char *, unsigned int,
+                                             unsigned int));
+extern void default_pe_asm_named_section PARAMS ((const char *, unsigned int,
+                                             unsigned int));
+
index 264d22bda1af59fb2ad96c0eb719cbba365b86f0..939ca8fcbd28b41ab6373ff6d1238ee9797061e6 100644 (file)
@@ -33,12 +33,20 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #define TARGET_ASM_FUNCTION_END_PROLOGUE no_asm_to_stream
 #define TARGET_ASM_FUNCTION_BEGIN_EPILOGUE no_asm_to_stream
 
+#ifdef TARGET_ASM_NAMED_SECTION
+#define TARGET_HAVE_NAMED_SECTIONS true
+#else
+#define TARGET_ASM_NAMED_SECTION default_no_named_section
+#define TARGET_HAVE_NAMED_SECTIONS false
+#endif
+
 #define TARGET_ASM_OUT {TARGET_ASM_OPEN_PAREN,                 \
                        TARGET_ASM_CLOSE_PAREN,                 \
                        TARGET_ASM_FUNCTION_PROLOGUE,           \
                        TARGET_ASM_FUNCTION_END_PROLOGUE,       \
                        TARGET_ASM_FUNCTION_BEGIN_EPILOGUE,     \
-                       TARGET_ASM_FUNCTION_EPILOGUE}
+                       TARGET_ASM_FUNCTION_EPILOGUE,           \
+                       TARGET_ASM_NAMED_SECTION}
 
 /* All in tree.c.  */
 #define TARGET_MERGE_DECL_ATTRIBUTES merge_decl_attributes
@@ -53,6 +61,11 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #define TARGET_INIT_BUILTINS default_init_builtins
 #define TARGET_EXPAND_BUILTIN default_expand_builtin
 
+/* In varasm.c.  */
+#ifndef TARGET_SECTION_TYPE_FLAGS
+#define TARGET_SECTION_TYPE_FLAGS default_section_type_flags
+#endif
+
 /* The whole shebang.  */
 #define TARGET_INITIALIZER                     \
 {                                              \
@@ -65,5 +78,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   TARGET_SET_DEFAULT_TYPE_ATTRIBUTES,          \
   TARGET_INSERT_ATTRIBUTES,                    \
   TARGET_INIT_BUILTINS,                                \
-  TARGET_EXPAND_BUILTIN                                \
+  TARGET_EXPAND_BUILTIN,                       \
+  TARGET_SECTION_TYPE_FLAGS,                   \
+  TARGET_HAVE_NAMED_SECTIONS                   \
 }
index fdd0bb16aaa5ff8496c0125727690745328fca3e..d3f32faf9c797e9d4d942fe7959a47053458448b 100644 (file)
@@ -66,6 +66,12 @@ struct gcc_target
 
     /* Output the assembler code for function exit.  */
     void (* function_epilogue) PARAMS ((FILE *, HOST_WIDE_INT));
+
+    /* Switch to an arbitrary section NAME with attributes as specified
+       by FLAGS.  ALIGN specifies any known alignment requirements for
+       the section; 0 if the default should be used.  */
+    void (* named_section) PARAMS ((const char *, unsigned int,
+                                   unsigned int));
   } asm_out;
 
   /* Given two decls, merge their attributes and return the result.  */
@@ -106,6 +112,14 @@ struct gcc_target
                                               struct rtx_def *subtarget,
                                               enum machine_mode mode,
                                               int ignore));
+
+  /* Given a decl, a section name, and whether the decl initializer
+     has relocs, choose attributes for the section.  */
+  /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
+  unsigned int (* section_type_flags) PARAMS ((tree, const char *, int));
+
+  /* True if arbitrary sections are supported.  */
+  bool have_named_sections;
 };
 
 extern struct gcc_target targetm;
index f3b50d14025a847515530e08df4f35018c6caee5..b69ea3f4fb539792054708fbcb42c5596a850b71 100644 (file)
@@ -67,6 +67,7 @@ Boston, MA 02111-1307, USA.  */
 #include "dwarf2asm.h"
 #include "integrate.h"
 #include "debug.h"
+#include "target.h"
 
 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
 #include "dwarf2out.h"
@@ -2267,18 +2268,19 @@ compile_file (name)
     debug_hooks = &dwarf2_debug_hooks;
 #endif
 
-#ifndef ASM_OUTPUT_SECTION_NAME
-  if (flag_function_sections)
+  if (! targetm.have_named_sections)
     {
-      warning ("-ffunction-sections not supported for this target.");
-      flag_function_sections = 0;
-    }
-  if (flag_data_sections)
-    {
-      warning ("-fdata-sections not supported for this target.");
-      flag_data_sections = 0;
+      if (flag_function_sections)
+       {
+         warning ("-ffunction-sections not supported for this target.");
+         flag_function_sections = 0;
+       }
+      if (flag_data_sections)
+       {
+         warning ("-fdata-sections not supported for this target.");
+         flag_data_sections = 0;
+       }
     }
-#endif
 
   if (flag_function_sections
       && (profile_flag || profile_block_flag))
index bb723c8d99a137ef8e3f18be49550e86da2d1af1..d574a80253987e86ac55f5f16872c6bcb3819e62 100644 (file)
@@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA.  */
 #include "ggc.h"
 #include "tm_p.h"
 #include "debug.h"
+#include "target.h"
 
 #ifdef XCOFF_DEBUGGING_INFO
 #include "xcoffout.h"          /* Needed for external data
@@ -181,14 +182,12 @@ static hashval_t const_str_htab_hash      PARAMS ((const void *x));
 static int const_str_htab_eq           PARAMS ((const void *x, const void *y));
 static void const_str_htab_del         PARAMS ((void *));
 static void asm_emit_uninitialised     PARAMS ((tree, const char*, int, int));
+static void resolve_unique_section     PARAMS ((tree, int));
 \f
 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
@@ -281,6 +280,28 @@ in_data_section ()
   return in_section == in_data;
 }
 
+/* Tell assembler to change to section NAME with attributes FLAGS.  */
+
+void
+named_section_flags (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align;
+{
+  if (in_section != in_named || strcmp (name, in_named_name))
+    {
+      (* targetm.asm_out.named_section) (name, flags, align);
+
+      if (flags & SECTION_FORGET)
+       in_section = no_section;
+      else
+       {
+         in_named_name = ggc_strdup (name);
+         in_section = in_named;
+       }
+    }
+}
+
 /* 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.
@@ -290,27 +311,31 @@ void
 named_section (decl, name, reloc)
      tree decl;
      const char *name;
-     int reloc ATTRIBUTE_UNUSED;
+     int reloc;
 {
+  unsigned int flags;
+
   if (decl != NULL_TREE && !DECL_P (decl))
     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
+  flags = (* targetm.section_type_flags) (decl, name, reloc);
+  named_section_flags (name, flags, 0);
+}
 
-      in_named_name = ggc_strdup (name);
-      in_section = in_named;
-    }
+/* If required, set DECL_SECTION_NAME to a unique name.  */
+
+static void
+resolve_unique_section (decl, reloc)
+     tree decl;
+     int reloc;
+{
+  if (DECL_SECTION_NAME (decl) == NULL_TREE
+      && (flag_function_sections
+         || (targetm.have_named_sections
+             && DECL_ONE_ONLY (decl))))
+    UNIQUE_SECTION (decl, reloc);
 }
 
 #ifdef BSS_SECTION_ASM_OP
@@ -392,18 +417,6 @@ asm_output_aligned_bss (file, decl, name, size, align)
 
 #endif /* BSS_SECTION_ASM_OP */
 
-#ifdef EH_FRAME_SECTION_ASM_OP
-void
-eh_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.
@@ -467,15 +480,13 @@ exception_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)
+  if (targetm.have_named_sections)
+    named_section (NULL_TREE, ".gcc_except_table", 0);
+  else if (flag_pic)
     data_section ();
   else
     readonly_data_section ();
 #endif
-#endif
 }
 \f
 /* Given NAME, a putative register name, discard any customary prefixes.  */
@@ -896,15 +907,7 @@ assemble_start_function (decl, fnname)
   if (CONSTANT_POOL_BEFORE_FUNCTION)
     output_constant_pool (fnname, decl);
 
-#ifdef ASM_OUTPUT_SECTION_NAME
-  /* If the function is to be put in its own section and it's not in a section
-     already, indicate so.  */
-  if ((flag_function_sections
-       && DECL_SECTION_NAME (decl) == NULL_TREE)
-      || UNIQUE_SECTION_P (decl))
-    UNIQUE_SECTION (decl, 0);
-#endif
-
+  resolve_unique_section (decl, 0);
   function_section (decl);
 
   /* Tell assembler to move to target machine's alignment for functions.  */
@@ -1163,12 +1166,8 @@ asm_emit_uninitialised (decl, name, size, rounded)
        }
     }
 
-#ifdef ASM_OUTPUT_SECTION_NAME
-  /* We already know that DECL_SECTION_NAME() == NULL.  */
-  if (flag_data_sections != 0 || UNIQUE_SECTION_P (decl))
-    UNIQUE_SECTION (decl, 0);
-#endif
-  
+  resolve_unique_section (decl, 0);
+
   switch (destination)
     {
 #ifdef ASM_EMIT_BSS
@@ -1396,13 +1395,8 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
   else if (DECL_INITIAL (decl))
     reloc = output_addressed_constants (DECL_INITIAL (decl));
 
-#ifdef ASM_OUTPUT_SECTION_NAME
-  if ((flag_data_sections != 0 && DECL_SECTION_NAME (decl) == NULL_TREE)
-      || UNIQUE_SECTION_P (decl))
-    UNIQUE_SECTION (decl, reloc);
-#endif
-
   /* Switch to the appropriate section.  */
+  resolve_unique_section (decl, reloc);
   variable_section (decl, reloc);
 
   /* dbxout.c needs to know this.  */
@@ -4765,3 +4759,142 @@ init_varasm_once ()
   ggc_add_root (&const_str_htab, 1, sizeof const_str_htab,
                mark_const_str_htab);
 }
+
+/* Select a set of attributes for section NAME based on the properties
+   of DECL and whether or not RELOC indicates that DECL's initializer
+   might contain runtime relocations.
+
+   We make the section read-only and executable for a function decl,
+   read-only for a const data decl, and writable for a non-const data decl.
+
+   If the section has already been defined, to not allow it to have
+   different attributes, as (1) this is ambiguous since we're not seeing
+   all the declarations up front and (2) some assemblers (e.g. SVR4)
+   do not recoginize section redefinitions.  */
+
+unsigned int
+default_section_type_flags (decl, name, reloc)
+     tree decl;
+     const char *name;
+     int reloc;
+{
+  static htab_t htab;
+  unsigned int flags;
+  unsigned int **slot;
+
+  /* The names we put in the hashtable will always be the unique
+     versions gived to us by the stringtable, so we can just use
+     their addresses as the keys.  */
+  if (!htab)
+    htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
+
+  if (decl && TREE_CODE (decl) == FUNCTION_DECL)
+    flags = SECTION_CODE;
+  else if (decl && DECL_READONLY_SECTION (decl, reloc))
+    flags = 0;
+  else
+    flags = SECTION_WRITE;
+
+  if (decl && DECL_ONE_ONLY (decl))
+    flags |= SECTION_LINKONCE;
+
+  if (strcmp (name, ".bss") == 0
+      || strncmp (name, ".bss.", 5) == 0
+      || strncmp (name, ".gnu.linkonce.b.", 16) == 0
+      || strcmp (name, ".sbss") == 0
+      || strncmp (name, ".sbss.", 6) == 0
+      || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
+    flags |= SECTION_BSS;
+
+  /* See if we already have an entry for this section.  */
+  slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
+  if (!*slot)
+    {
+      *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
+      **slot = flags;
+    }
+  else
+    {
+      if (decl && **slot != flags)
+       error_with_decl (decl, "%s causes a section type conflict");
+    }
+
+  return flags;
+}
+
+/* Output assembly to switch to section NAME with attribute FLAGS.
+   Four variants for common object file formats.  */
+
+void
+default_no_named_section (name, flags, align)
+     const char *name ATTRIBUTE_UNUSED;
+     unsigned int flags ATTRIBUTE_UNUSED;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  /* Some object formats don't support named sections at all.  The
+     front-end should already have flagged this as an error.  */
+  abort ();
+}
+
+void
+default_elf_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  char flagchars[8], *f = flagchars;
+  const char *type;
+
+  if (!(flags & SECTION_DEBUG))
+    *f++ = 'a';
+  if (flags & SECTION_WRITE)
+    *f++ = 'w';
+  if (flags & SECTION_CODE)
+    *f++ = 'x';
+  if (flags & SECTION_SMALL)
+    *f++ = 's';
+  *f = '\0';
+
+  if (flags & SECTION_BSS)
+    type = "nobits";
+  else
+    type = "progbits";
+
+  fprintf (asm_out_file, "\t.section\t%s,\"%s\",@%s\n",
+          name, flagchars, type);
+}
+
+void
+default_coff_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  char flagchars[8], *f = flagchars;
+
+  if (flags & SECTION_WRITE)
+    *f++ = 'w';
+  if (flags & SECTION_CODE)
+    *f++ = 'x';
+  *f = '\0';
+
+  fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
+}
+
+void
+default_pe_asm_named_section (name, flags, align)
+     const char *name;
+     unsigned int flags;
+     unsigned int align ATTRIBUTE_UNUSED;
+{
+  default_coff_asm_named_section (name, flags, align);
+
+  if (flags & SECTION_LINKONCE)
+    {
+      /* Functions may have been compiled at various levels of
+         optimization so we can't use `same_size' here.
+         Instead, have the linker pick one.  */
+      fprintf (asm_out_file, "\t.linkonce %s\n",
+              (flags & SECTION_CODE ? "discard" : "same_size"));
+    }
+}