diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-12-14 12:00:50 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-12-14 12:00:50 +0100 |
commit | 3b10d286080e96f54509e7be39d5791da2527e01 (patch) | |
tree | 30fc47663bc7fc1421fbecedb0b2c6d00716536e /gcc | |
parent | 025509856a4457d15401a5d69962f451b23281c3 (diff) | |
download | gcc-3b10d286080e96f54509e7be39d5791da2527e01.zip gcc-3b10d286080e96f54509e7be39d5791da2527e01.tar.gz gcc-3b10d286080e96f54509e7be39d5791da2527e01.tar.bz2 |
re PR target/25254 (ICE with -mcmodel=medium -mlarge-data-threshold=1)
PR target/25254
PR target/24188
* config/i386/i386.c (x86_64_elf_select_section): If DECL is not
DECL_P, call get_section rather than get_named_section. Supply
section flags to it.
* gcc.target/i386/pr25254.c: New test.
* gfortran.dg/PR24188.f: New test.
From-SVN: r108506
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr25254.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/PR24188.f | 7 |
5 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 417d69f..a58022f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-12-14 Jakub Jelinek <jakub@redhat.com> + + PR target/25254 + PR target/24188 + * config/i386/i386.c (x86_64_elf_select_section): If DECL is not + DECL_P, call get_section rather than get_named_section. Supply + section flags to it. + 2005-12-14 Ben Elliston <bje@au.ibm.com> * c-common.c (c_common_truthvalue_conversion): Generalise warning diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 079ead8..33b9c6f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1703,6 +1703,7 @@ x86_64_elf_select_section (tree decl, int reloc, && ix86_in_large_data_p (decl)) { const char *sname = NULL; + unsigned int flags = SECTION_WRITE; switch (categorize_decl_for_section (decl, reloc, flag_pic)) { case SECCAT_DATA: @@ -1722,12 +1723,14 @@ x86_64_elf_select_section (tree decl, int reloc, break; case SECCAT_BSS: sname = ".lbss"; + flags |= SECTION_BSS; break; case SECCAT_RODATA: case SECCAT_RODATA_MERGE_STR: case SECCAT_RODATA_MERGE_STR_INIT: case SECCAT_RODATA_MERGE_CONST: sname = ".lrodata"; + flags = 0; break; case SECCAT_SRODATA: case SECCAT_SDATA: @@ -1741,7 +1744,14 @@ x86_64_elf_select_section (tree decl, int reloc, break; } if (sname) - return get_named_section (decl, sname, reloc); + { + /* We might get called with string constants, but get_named_section + doesn't like them as they are not DECLs. Also, we need to set + flags in that case. */ + if (!DECL_P (decl)) + return get_section (sname, flags, NULL); + return get_named_section (decl, sname, reloc); + } } return default_elf_select_section (decl, reloc, align); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d53230..1045181 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-12-14 Jakub Jelinek <jakub@redhat.com> + + PR target/25254 + PR target/24188 + * gcc.target/i386/pr25254.c: New test. + * gfortran.dg/PR24188.f: New test. + 2005-12-14 David Billinghurst (David.Billinghurst@riotinto.com) * lib/fortran-torture.exp: Catch remaining uses of diff --git a/gcc/testsuite/gcc.target/i386/pr25254.c b/gcc/testsuite/gcc.target/i386/pr25254.c new file mode 100644 index 0000000..b1eff6e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr25254.c @@ -0,0 +1,11 @@ +/* PR target/25254 */ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-mcmodel=medium -mlarge-data-threshold=1" } */ + +const struct { int i; int j; } c = { 2, 6 }; + +const char * +foo (void) +{ + return "OK"; +} diff --git a/gcc/testsuite/gfortran.dg/PR24188.f b/gcc/testsuite/gfortran.dg/PR24188.f new file mode 100644 index 0000000..a33141f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/PR24188.f @@ -0,0 +1,7 @@ +C PR target/24188 +C { dg-do compile } +C { dg-options "-O2" } +C { dg-options "-O2 -mcmodel=medium" { target { x86_64-*-* && lp64 } } } +C { dg-options "-O2 -mcmodel=medium" { target { i?86-*-* && lp64 } } } + WRITE(6,*) '' + END |