On Wed, Jun 18, 2014 at 12:21 PM, Richard Biener <richard.guent...@gmail.com> wrote: > 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.
Oh, I see you need a new object-readelf ... I defer to a testsuite maintainer for this part. Richard. > 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." >> + } >> +} >> + >> +