Message ID | ydd4mc4hgo5.fsf@CeBiTec.Uni-Bielefeld.DE |
---|---|
State | New |
Headers | show |
On Thu, Mar 17, 2016 at 11:40 PM, Rainer Orth <ro@cebitec.uni-bielefeld.de> wrote: > gcc.target/i386/pr58218.c currently FAILs on 64-bit Solaris/x86 with the > native assembler: > > FAIL: gcc.target/i386/pr58218.c (test for excess errors) > > Excess errors: > Assembler: pr58218.c > "/var/tmp//cciHFIO7.s", line 3 : Section attributes do not match > > .section .lbss,"aw",@nobits > > It turns out x86_64 large sections need to marked with a 'h' section > flag for as. gas implicitly sets SHF_AMD64_LARGE based on section > names, but also accepts an 'l' for the same purpose. > > The following patch fixes this by using the SECTION_MACH_DEP section > flag to mark large sections and emit the right flag in > default_elf_asm_named_section. > > Given this comment in output.h > > #define SECTION_MACH_DEP 0x4000000 /* subsequent bits reserved for target */ > > handling only a single SECTION_MACH_DEP can be considered a hack. > Currently, only one user of SECTION_MACH_DEP (avr) uses more than one > section flag, so maybe I can get away with this for now. > > A full solution would split out the part of > default_elf_asm_named_section that emits the flags into a new > default_elf_asm_section_flags which prints the flag string to a stream, > invoking it either via a macro than be overridden or perhaps a target > hook (which seems not fully right either since those are object file > format agnostic and this is just a small part of emitting ELF named > sections). > > The patch has been bootstrapped without regressions on > i386-pc-solaris2.12 (with both as and gas) and x86_64-pc-linux-gnu. > This is not a regression, so this may have to wait for GCC 7 stage 1. > > Ok for mainline now or then? I'd rather leave this and subsequent patch for gcc-7 at this point. The patch touches middle-end, and from the explanation above, it looks that some discussion with middle-end maintainers (relevant people CC'd) and their approval is still needed. Uros. > Thanks. > Rainer > > > 2016-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> > > PR target/59407 > * config/i386/i386.c (SECTION_LARGE): Define. > (x86_64_elf_select_section): Set it for large data/bss sections. > Only clear SECTION_WRITE for .lrodata. > (x86_64_elf_section_type_flags): Set SECTION_LARGE for large > data/bss sections. > * config/i386/sol2.h (MACH_DEP_SECTION_ASM_FLAG): Define. > * varasm.c (default_elf_asm_named_section): Grow flagchars. > [MACH_DEP_SECTION_ASM_FLAG] Emit MACH_DEP_SECTION_ASM_FLAG for > SECTION_MACH_DEP. > * doc/tm.texi.in (Sections, MACH_DEP_SECTION_ASM_FLAG): Describe. > * doc/tm.texi: Regenerate. > > > > -- > ----------------------------------------------------------------------------- > Rainer Orth, Center for Biotechnology, Bielefeld University >
Uros Bizjak <ubizjak@gmail.com> writes: > On Thu, Mar 17, 2016 at 11:40 PM, Rainer Orth > <ro@cebitec.uni-bielefeld.de> wrote: >> gcc.target/i386/pr58218.c currently FAILs on 64-bit Solaris/x86 with the >> native assembler: >> >> FAIL: gcc.target/i386/pr58218.c (test for excess errors) >> >> Excess errors: >> Assembler: pr58218.c >> "/var/tmp//cciHFIO7.s", line 3 : Section attributes do not match >> >> .section .lbss,"aw",@nobits >> >> It turns out x86_64 large sections need to marked with a 'h' section >> flag for as. gas implicitly sets SHF_AMD64_LARGE based on section >> names, but also accepts an 'l' for the same purpose. >> >> The following patch fixes this by using the SECTION_MACH_DEP section >> flag to mark large sections and emit the right flag in >> default_elf_asm_named_section. >> >> Given this comment in output.h >> >> #define SECTION_MACH_DEP 0x4000000 /* subsequent bits reserved for target >> */ >> >> handling only a single SECTION_MACH_DEP can be considered a hack. >> Currently, only one user of SECTION_MACH_DEP (avr) uses more than one >> section flag, so maybe I can get away with this for now. >> >> A full solution would split out the part of >> default_elf_asm_named_section that emits the flags into a new >> default_elf_asm_section_flags which prints the flag string to a stream, >> invoking it either via a macro than be overridden or perhaps a target >> hook (which seems not fully right either since those are object file >> format agnostic and this is just a small part of emitting ELF named >> sections). >> >> The patch has been bootstrapped without regressions on >> i386-pc-solaris2.12 (with both as and gas) and x86_64-pc-linux-gnu. >> This is not a regression, so this may have to wait for GCC 7 stage 1. >> >> Ok for mainline now or then? > > I'd rather leave this and subsequent patch for gcc-7 at this point. > The patch touches middle-end, and from the explanation above, it looks > that some discussion with middle-end maintainers (relevant people > CC'd) and their approval is still needed. Understood. It would be good if they could chime in so I know if the patch is acceptable in principle or needs considerable rework. Thanks. Rainer >> 2016-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> >> >> PR target/59407 >> * config/i386/i386.c (SECTION_LARGE): Define. >> (x86_64_elf_select_section): Set it for large data/bss sections. >> Only clear SECTION_WRITE for .lrodata. >> (x86_64_elf_section_type_flags): Set SECTION_LARGE for large >> data/bss sections. >> * config/i386/sol2.h (MACH_DEP_SECTION_ASM_FLAG): Define. >> * varasm.c (default_elf_asm_named_section): Grow flagchars. >> [MACH_DEP_SECTION_ASM_FLAG] Emit MACH_DEP_SECTION_ASM_FLAG for >> SECTION_MACH_DEP. >> * doc/tm.texi.in (Sections, MACH_DEP_SECTION_ASM_FLAG): Describe. >> * doc/tm.texi: Regenerate. >> >> >> >> -- >> ----------------------------------------------------------------------------- >> Rainer Orth, Center for Biotechnology, Bielefeld University >>
Uros Bizjak <ubizjak@gmail.com> writes: > On Thu, Mar 17, 2016 at 11:40 PM, Rainer Orth > <ro@cebitec.uni-bielefeld.de> wrote: >> gcc.target/i386/pr58218.c currently FAILs on 64-bit Solaris/x86 with the >> native assembler: >> >> FAIL: gcc.target/i386/pr58218.c (test for excess errors) >> >> Excess errors: >> Assembler: pr58218.c >> "/var/tmp//cciHFIO7.s", line 3 : Section attributes do not match >> >> .section .lbss,"aw",@nobits >> >> It turns out x86_64 large sections need to marked with a 'h' section >> flag for as. gas implicitly sets SHF_AMD64_LARGE based on section >> names, but also accepts an 'l' for the same purpose. >> >> The following patch fixes this by using the SECTION_MACH_DEP section >> flag to mark large sections and emit the right flag in >> default_elf_asm_named_section. >> >> Given this comment in output.h >> >> #define SECTION_MACH_DEP 0x4000000 /* subsequent bits reserved for target >> */ >> >> handling only a single SECTION_MACH_DEP can be considered a hack. >> Currently, only one user of SECTION_MACH_DEP (avr) uses more than one >> section flag, so maybe I can get away with this for now. >> >> A full solution would split out the part of >> default_elf_asm_named_section that emits the flags into a new >> default_elf_asm_section_flags which prints the flag string to a stream, >> invoking it either via a macro than be overridden or perhaps a target >> hook (which seems not fully right either since those are object file >> format agnostic and this is just a small part of emitting ELF named >> sections). >> >> The patch has been bootstrapped without regressions on >> i386-pc-solaris2.12 (with both as and gas) and x86_64-pc-linux-gnu. >> This is not a regression, so this may have to wait for GCC 7 stage 1. >> >> Ok for mainline now or then? > > I'd rather leave this and subsequent patch for gcc-7 at this point. > The patch touches middle-end, and from the explanation above, it looks > that some discussion with middle-end maintainers (relevant people > CC'd) and their approval is still needed. Given that gcc-6 has branched now, could I please get a review for this patch https://gcc.gnu.org/ml/gcc-patches/2016-03/msg01056.html and its companion https://gcc.gnu.org/ml/gcc-patches/2016-03/msg01059.html now? Thanks. Rainer >> 2016-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> >> >> PR target/59407 >> * config/i386/i386.c (SECTION_LARGE): Define. >> (x86_64_elf_select_section): Set it for large data/bss sections. >> Only clear SECTION_WRITE for .lrodata. >> (x86_64_elf_section_type_flags): Set SECTION_LARGE for large >> data/bss sections. >> * config/i386/sol2.h (MACH_DEP_SECTION_ASM_FLAG): Define. >> * varasm.c (default_elf_asm_named_section): Grow flagchars. >> [MACH_DEP_SECTION_ASM_FLAG] Emit MACH_DEP_SECTION_ASM_FLAG for >> SECTION_MACH_DEP. >> * doc/tm.texi.in (Sections, MACH_DEP_SECTION_ASM_FLAG): Describe. >> * doc/tm.texi: Regenerate. >> >> >> >> -- >> ----------------------------------------------------------------------------- >> Rainer Orth, Center for Biotechnology, Bielefeld University >>
# HG changeset patch # Parent 8470acf190fb0e7e0d710db9583ed9725f6a2888 Support .lbss etc. sections with Solaris as (PR target/59407) diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6473,6 +6473,9 @@ ix86_in_large_data_p (tree exp) return false; } +/* i386-specific section flag to mark large sections. */ +#define SECTION_LARGE SECTION_MACH_DEP + /* Switch to the appropriate section for output of DECL. DECL is either a `VAR_DECL' node or a constant of some sort. RELOC indicates whether forming the initial value of DECL requires @@ -6485,7 +6488,7 @@ x86_64_elf_select_section (tree decl, in if (ix86_in_large_data_p (decl)) { const char *sname = NULL; - unsigned int flags = SECTION_WRITE; + unsigned int flags = SECTION_WRITE | SECTION_LARGE; switch (categorize_decl_for_section (decl, reloc)) { case SECCAT_DATA: @@ -6512,7 +6515,7 @@ x86_64_elf_select_section (tree decl, in case SECCAT_RODATA_MERGE_STR_INIT: case SECCAT_RODATA_MERGE_CONST: sname = ".lrodata"; - flags = 0; + flags &= ~SECTION_WRITE; break; case SECCAT_SRODATA: case SECCAT_SDATA: @@ -6547,6 +6550,9 @@ x86_64_elf_section_type_flags (tree decl { unsigned int flags = default_section_type_flags (decl, name, reloc); + if (ix86_in_large_data_p (decl)) + flags |= SECTION_LARGE; + if (decl == NULL_TREE && (strcmp (name, ".ldata.rel.ro") == 0 || strcmp (name, ".ldata.rel.ro.local") == 0)) diff --git a/gcc/config/i386/sol2.h b/gcc/config/i386/sol2.h --- a/gcc/config/i386/sol2.h +++ b/gcc/config/i386/sol2.h @@ -208,6 +208,14 @@ along with GCC; see the file COPYING3. #undef TARGET_ASM_NAMED_SECTION #define TARGET_ASM_NAMED_SECTION i386_solaris_elf_named_section +/* Sun as requires "h" flag for large sections, GNU as can do without, but + accepts "l". */ +#ifdef USE_GAS +#define MACH_DEP_SECTION_ASM_FLAG 'l' +#else +#define MACH_DEP_SECTION_ASM_FLAG 'h' +#endif + #ifndef USE_GAS /* Emit COMDAT group signature symbols for Sun as. */ #undef TARGET_ASM_FILE_END diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -7097,6 +7097,12 @@ defined, GCC will assume such a section both this macro and @code{FINI_SECTION_ASM_OP}. @end defmac +@defmac MACH_DEP_SECTION_ASM_FLAG +If defined, a C expression whose value is a character constant +containing the flag used to mark a machine-dependent section. This +corresponds to the @code{SECTION_MACH_DEP} section flag. +@end defmac + @defmac CRT_CALL_STATIC_FUNCTION (@var{section_op}, @var{function}) If defined, an ASM statement that switches to a different section via @var{section_op}, calls @var{function}, and switches back to diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -4982,6 +4982,12 @@ defined, GCC will assume such a section both this macro and @code{FINI_SECTION_ASM_OP}. @end defmac +@defmac MACH_DEP_SECTION_ASM_FLAG +If defined, a C expression whose value is a character constant +containing the flag used to mark a machine-dependent section. This +corresponds to the @code{SECTION_MACH_DEP} section flag. +@end defmac + @defmac CRT_CALL_STATIC_FUNCTION (@var{section_op}, @var{function}) If defined, an ASM statement that switches to a different section via @var{section_op}, calls @var{function}, and switches back to diff --git a/gcc/varasm.c b/gcc/varasm.c --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -6233,7 +6233,7 @@ void default_elf_asm_named_section (const char *name, unsigned int flags, tree decl) { - char flagchars[10], *f = flagchars; + char flagchars[11], *f = flagchars; /* If we have already declared this section, we can use an abbreviated form to switch back to it -- unless this section is @@ -6266,6 +6266,10 @@ default_elf_asm_named_section (const cha *f++ = TLS_SECTION_ASM_FLAG; if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) *f++ = 'G'; +#ifdef MACH_DEP_SECTION_ASM_FLAG + if (flags & SECTION_MACH_DEP) + *f++ = MACH_DEP_SECTION_ASM_FLAG; +#endif *f = '\0'; fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);