From dd6fe7d4a205dce721999955cd81355588180866 Mon Sep 17 00:00:00 2001 From: Hale Wang Date: Fri, 20 Jun 2014 04:52:11 +0000 Subject: [PATCH] re PR lto/61123 (With LTO, -fno-short-enums is ignored, resulting in ABI mis-matching in linking.) c-family/ChangeLog 2014-06-20 Hale Wang PR lto/61123 * c.opt (fshort-enums): Add to LTO. * c.opt (fshort-wchar): Likewise. testsuite/ChangeLog 2014-06-20 Hale Wang * gcc.target/arm/lto/: New folder to verify the LTO option. * gcc.target/arm/lto/pr61123-enum-size_0.c: New test case. * gcc.target/arm/lto/pr61123-enum-size_1.c: Likewise. * gcc.target/arm/lto/lto.exp: New exp file used to test LTO option. * lib/lto.exp (object-readelf): New procedure. From-SVN: r211832 --- gcc/c-family/ChangeLog | 6 ++ gcc/c-family/c.opt | 4 +- gcc/testsuite/ChangeLog | 8 +++ gcc/testsuite/gcc.target/arm/lto/lto.exp | 59 ++++++++++++++++ .../gcc.target/arm/lto/pr61123-enum-size_0.c | 22 ++++++ .../gcc.target/arm/lto/pr61123-enum-size_1.c | 5 ++ gcc/testsuite/lib/lto.exp | 79 ++++++++++++++++++++++ 7 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/lto/lto.exp create mode 100644 gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c create mode 100644 gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index ffa94eb..d195db7 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2014-06-20 Hale Wang + + PR lto/61123 + * c.opt (fshort-enums): Add to LTO. + * c.opt (fshort-wchar): Likewise. + 2014-06-16 Marek Polacek PR c/60439 diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 91f8275..73abd26 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1197,11 +1197,11 @@ C ObjC C++ ObjC++ LTO Optimization Var(flag_short_double) Use the same size for double as for float fshort-enums -C ObjC C++ ObjC++ Optimization Var(flag_short_enums) +C ObjC C++ ObjC++ LTO Optimization Var(flag_short_enums) Use the narrowest integer type possible for enumeration types fshort-wchar -C ObjC C++ ObjC++ Optimization Var(flag_short_wchar) +C ObjC C++ ObjC++ LTO Optimization Var(flag_short_wchar) Force the underlying type for \"wchar_t\" to be \"unsigned short\" fsigned-bitfields diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5d58712..d6002c1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-06-20 Hale Wang + + * gcc.target/arm/lto/: New folder to verify the LTO option. + * gcc.target/arm/lto/pr61123-enum-size_0.c: New test case. + * gcc.target/arm/lto/pr61123-enum-size_1.c: Likewise. + * gcc.target/arm/lto/lto.exp: New exp file used to test LTO option. + * lib/lto.exp (object-readelf): New procedure. + 2014-06-19 Francois-Xavier Coudert PR fortran/61454 diff --git a/gcc/testsuite/gcc.target/arm/lto/lto.exp b/gcc/testsuite/gcc.target/arm/lto/lto.exp new file mode 100644 index 0000000..7513411 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/lto/lto.exp @@ -0,0 +1,59 @@ +# Copyright (C) 2009-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# . +# +# Contributed by Diego Novillo + + +# Test link-time optimization across multiple files. +# +# Programs are broken into multiple files. Each one is compiled +# separately with LTO information. The final executable is generated +# by collecting all the generated object files using regular LTO or WHOPR. + +if $tracelevel then { + strace $tracelevel +} + +# Load procedures from common libraries. +load_lib standard.exp +load_lib gcc.exp + +# Load the language-independent compabibility support procedures. +load_lib lto.exp + +# If LTO has not been enabled, bail. +if { ![check_effective_target_lto] } { + return +} + +gcc_init +lto_init no-mathlib + +# Define an identifier for use with this suite to avoid name conflicts +# with other lto tests running at the same time. +set sid "c_lto" + +# Main loop. +foreach src [lsort [find $srcdir/$subdir *_0.c]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + + lto-execute $src $sid +} + +lto_finish diff --git a/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c b/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c new file mode 100644 index 0000000..c23f9d8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c @@ -0,0 +1,22 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options { { -fno-short-enums -Wl,-Ur,--no-enum-size-warning -Os -nostdlib -flto } } } */ + +#include + +enum enum_size_attribute +{ + small_size, int_size +}; + +struct debug_ABI_enum_size +{ + enum enum_size_attribute es; +}; + +int +foo1 (struct debug_ABI_enum_size *x) +{ + return sizeof (x->es); +} + +/* { dg-final { object-readelf Tag_ABI_enum_size int { target arm_eabi } } } */ diff --git a/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c b/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c new file mode 100644 index 0000000..9561efa --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c @@ -0,0 +1,5 @@ +int +foo2 (int y) +{ + return y*10; +} diff --git a/gcc/testsuite/lib/lto.exp b/gcc/testsuite/lib/lto.exp index 997d5a3..5182558 100644 --- a/gcc/testsuite/lib/lto.exp +++ b/gcc/testsuite/lib/lto.exp @@ -650,3 +650,82 @@ proc scan-symbol { args } { fail "scan-symbol $args" } } + +# Call pass if object readelf is ok, otherwise fail. +# example: /* { dg-final { object-readelf Tag_ABI_enum_size int} } */ +proc object-readelf { args } { + global readelf + global base_dir + upvar 2 execname execname + + if { [llength $args] < 2 } { + error "object-readelf: too few arguments" + return + } + if { [llength $args] > 3 } { + error "object-readelf: too many arguments" + return + } + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "S" { } + "N" { return } + "F" { setup_xfail "*-*-*" } + "P" { } + } + } + + # Find size like we find g++ in g++.exp. + if ![info exists readelf] { + set readelf [findfile $base_dir/../../../binutils/readelf \ + $base_dir/../../../binutils/readelf \ + [findfile $base_dir/../../readelf $base_dir/../../readelf \ + [findfile $base_dir/readelf $base_dir/readelf \ + [transform readelf]]]] + verbose -log "readelf is $readelf" + } + + set what [lindex $args 0] + set with [lindex $args 1] + + if ![file_on_host exists $execname] { + verbose -log "$execname does not exist" + unresolved "object-readelf $what " + return + } + + set output [remote_exec host "$readelf -A" "$execname"] + set status [lindex $output 0] + if { $status != 0 } { + verbose -log "object-readelf: $readelf failed" + unresolved "object-readelf $what $execname" + return + } + + set text [lindex $output 1] + set lines [split $text "\n"] + + set done 0 + set i 0 + while { !$done } { + set line_tex [lindex $lines $i] + if { [llength ${line_tex}] > 1} { + incr i + if [regexp -- $what $line_tex] { + set match [regexp -- $with $line_tex] + set done 1 + } + } else { + set done 1 + } + } + + verbose -log "$what size is $with;" + if { $match == 1 } { + pass "object-readelf $what size is correct." + } else { + fail "object-readelf $what size is incorrect." + } +} + + -- 2.7.4