This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: default_elf_select_section
On Mon, Nov 29, 2004 at 09:30:44PM +1030, Alan Modra wrote:
> On Mon, Nov 29, 2004 at 11:36:28AM +0100, Andreas Schwab wrote:
> > Alan Modra <amodra@bigpond.net.au> writes:
> >
> > > This fixes the assembler complaint in pr9571 by giving
> > > targetm.section_type_flags the decl that it needs. See
> > > default_section_type_flags_1. No problems fould with powerpc-linux
> > > and powerpc64-linux bootstraps and regression tests.
> > >
> > > PR target/9571
> > > * varasm.c (default_elf_select_section_1): Pass decl to named_section.
> >
> > Breaks libgfortran on ia64.
> >
> > ../../../libgfortran/generated/product_c4.c: In function '__product_c4':
> > ../../../libgfortran/generated/product_c4.c:143: internal compiler error: in named_section, at varasm.c:451
> > Please submit a full bug report,
> > with preprocessed source if appropriate.
> > See <URL:http://gcc.gnu.org/bugs.html> for instructions.
> >
> > The decl is actually a COMPLEX_CST, i.e. not a DECL_P.
>
> Ugh. So we've found why the decl isn't passed..
> This should fix it.
>
> * varasm.c (default_elf_select_section_1): Only pass DECL_P decl
> to named_section.
Sorry. Edited old source tree.
Index: gcc/varasm.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varasm.c,v
retrieving revision 1.462
diff -u -p -r1.462 varasm.c
--- gcc/varasm.c 29 Nov 2004 06:24:30 -0000 1.462
+++ gcc/varasm.c 29 Nov 2004 11:12:58 -0000
@@ -4897,6 +4897,7 @@ void
default_elf_select_section_1 (tree decl, int reloc,
unsigned HOST_WIDE_INT align, int shlib)
{
+ const char *sname;
switch (categorize_decl_for_section (decl, reloc, shlib))
{
case SECCAT_TEXT:
@@ -4904,56 +4905,61 @@ default_elf_select_section_1 (tree decl,
abort ();
case SECCAT_RODATA:
readonly_data_section ();
- break;
+ return;
case SECCAT_RODATA_MERGE_STR:
mergeable_string_section (decl, align, 0);
- break;
+ return;
case SECCAT_RODATA_MERGE_STR_INIT:
mergeable_string_section (DECL_INITIAL (decl), align, 0);
- break;
+ return;
case SECCAT_RODATA_MERGE_CONST:
mergeable_constant_section (DECL_MODE (decl), align, 0);
- break;
+ return;
case SECCAT_SRODATA:
- named_section (decl, ".sdata2", reloc);
+ sname = ".sdata2";
break;
case SECCAT_DATA:
data_section ();
- break;
+ return;
case SECCAT_DATA_REL:
- named_section (decl, ".data.rel", reloc);
+ sname = ".data.rel";
break;
case SECCAT_DATA_REL_LOCAL:
- named_section (decl, ".data.rel.local", reloc);
+ sname = ".data.rel.local";
break;
case SECCAT_DATA_REL_RO:
- named_section (decl, ".data.rel.ro", reloc);
+ sname = ".data.rel.ro";
break;
case SECCAT_DATA_REL_RO_LOCAL:
- named_section (decl, ".data.rel.ro.local", reloc);
+ sname = ".data.rel.ro.local";
break;
case SECCAT_SDATA:
- named_section (decl, ".sdata", reloc);
+ sname = ".sdata";
break;
case SECCAT_TDATA:
- named_section (decl, ".tdata", reloc);
+ sname = ".tdata";
break;
case SECCAT_BSS:
#ifdef BSS_SECTION_ASM_OP
bss_section ();
+ return;
#else
- named_section (decl, ".bss", reloc);
-#endif
+ sname = ".bss";
break;
+#endif
case SECCAT_SBSS:
- named_section (decl, ".sbss", reloc);
+ sname = ".sbss";
break;
case SECCAT_TBSS:
- named_section (decl, ".tbss", reloc);
+ sname = ".tbss";
break;
default:
abort ();
}
+
+ if (!DECL_P (decl))
+ decl = NULL_TREE;
+ named_section (decl, sname, reloc);
}
/* Construct a unique section name based on the decl name and the
--
Alan Modra
IBM OzLabs - Linux Technology Centre