> -----Original Message----- > From: Mike Stump [mailto:mikest...@comcast.net] > Sent: 2014年6月19日 1:42 > To: Richard Biener > Cc: Hale Wang; Mike Stump; GCC Patches > Subject: Re: [PATCH] PR61123 : Fix the ABI mis-matching error caused by LTO > > On Jun 18, 2014, at 3:22 AM, Richard Biener <richard.guent...@gmail.com> > wrote: > >> 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. > > The testsuite bits are Ok. My guidance on the test suite would be this, all lto > test cases in .*lto directories. 20 or fewer test cases for a given target, in the > main lto directory, more than 50, in the arm/lto directory. When one is > tracking down bugs and trying to clean test suite results if they break, it is > nice to be able to skip in mass all lto bugs first, and resolve all non-lto issues > and then come back to the lto issues last, in hopes that they are all then > resolved. Also, if one it redoing lto bits, and a test case with lto in the name > pops up as a regression, and you’re not an lto person, you can stop thinking > about it and just pass to the lto person, it is a slightly different mindset. :-)
Thanks! Patch was committed @r211832 with minimal format changes due to "TAB". The final change log and patch is: 2014-06-20 Hale Wang <hale.w...@arm.com> PR lto/61123 * c.opt (fshort-enums): Add to LTO. * c.opt (fshort-wchar): Likewise. testsuite/ChangeLog 2014-06-20 Hale Wang <hale.w...@arm.com> * 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. 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/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." + } +} + + 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; +}