On Wed, Jun 18, 2014 at 10:14 AM, Hale Wang <hale.w...@arm.com> wrote: > Hi, > > With LTO, -fno-short-enums is ignored, resulting in ABI mis-matching in > linking. > > Refer https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61123 for details. > > This patch add fshort-enums and fshout-wchar to LTO group. > > To check it, a new procedure object-readelf is added in > testsuite/lib/lto.exp and new lto tests are added in gcc.target/arm/lto. > > Bootstrap and no make check regression on X86-64. > > Patch also attached for convenience. Is It ok for trunk? > > Thanks and Best Regards, > Hale Wang > > c-family/ChangeLog > 2014-06-18 Hale Wang <hale.w...@arm.com> > > PR lto/61123 > *c.opt (fshort-enums): Add to LTO. > *c.opt (fshort-wchar): Likewise.
Space after the *. I think you don't need to copy the LTO harness but you can simply use dg.exp and sth similar to gcc.dg/20081223-1.c (there is an effective target 'lto' to guard for lto support). So simply place the testcase in gcc.target/arm/ (make sure to put a dg-do compile on the 2nd file and use dg-additional-sources). If that doesn't work I'd say put the testcase in gcc.dg/lto/ instead and do a dg-skip-if for non-arm targets. Ok with one of those changes. Thanks, Richard. > testsuite/ChangeLog > 2014-06-18 Hale Wang <hale.w...@arm.com> > > * gcc.target/arm/lto/: New folder to verify the LTO > option for ARM specific. > * 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 for ARM specific. > * lib/lto.exp (object-readelf): New procedure used to > catch the enum size in the final executable. > > Index: gcc/c-family/c.opt > =================================================================== > --- gcc/c-family/c.opt (revision 211394) > +++ gcc/c-family/c.opt (working copy) > @@ -1189,11 +1189,11 @@ > 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 > Index: gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c (revision > 0) > +++ gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c (revision 0) > @@ -0,0 +1,22 @@ > +/* { dg-lto-do link } */ > +/* { dg-lto-options { { -fno-short-enums -Wl,-Ur,--no-enum-size-warning -Os > -nostdlib -flto } } } */ > + > +#include <stdlib.h> > + > +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 } } > } */ > Index: gcc/testsuite/gcc.target/arm/lto/lto.exp > =================================================================== > --- gcc/testsuite/gcc.target/arm/lto/lto.exp (revision 0) > +++ gcc/testsuite/gcc.target/arm/lto/lto.exp (revision 0) > @@ -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 > +# <http://www.gnu.org/licenses/>. > +# > +# Contributed by Diego Novillo <dnovi...@google.com> > + > + > +# 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 > Index: gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c (revision > 0) > +++ gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c (revision 0) > @@ -0,0 +1,5 @@ > +int > +foo2 (int y) > +{ > + return y*10; > +} > Index: gcc/testsuite/lib/lto.exp > =================================================================== > --- gcc/testsuite/lib/lto.exp (revision 211394) > +++ gcc/testsuite/lib/lto.exp (working copy) > @@ -650,3 +650,82 @@ > 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." > + } > +} > + > +