aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHale Wang <hale.wang@arm.com>2014-06-20 04:52:11 +0000
committerZhenqiang Chen <zqchen@gcc.gnu.org>2014-06-20 04:52:11 +0000
commitdd6fe7d4a205dce721999955cd81355588180866 (patch)
tree94837c60008e70507f8d4044f13dc46961cc59ca
parent9981da24c04c6899b608076a6d8cfbb7c4be2073 (diff)
downloadgcc-dd6fe7d4a205dce721999955cd81355588180866.zip
gcc-dd6fe7d4a205dce721999955cd81355588180866.tar.gz
gcc-dd6fe7d4a205dce721999955cd81355588180866.tar.bz2
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 <hale.wang@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.wang@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. From-SVN: r211832
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/arm/lto/lto.exp59
-rw-r--r--gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_0.c22
-rw-r--r--gcc/testsuite/gcc.target/arm/lto/pr61123-enum-size_1.c5
-rw-r--r--gcc/testsuite/lib/lto.exp79
7 files changed, 181 insertions, 2 deletions
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 <hale.wang@arm.com>
+
+ PR lto/61123
+ * c.opt (fshort-enums): Add to LTO.
+ * c.opt (fshort-wchar): Likewise.
+
2014-06-16 Marek Polacek <polacek@redhat.com>
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 <hale.wang@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.
+
2014-06-19 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
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
+# <http://www.gnu.org/licenses/>.
+#
+# Contributed by Diego Novillo <dnovillo@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
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 <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 } } } */
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."
+ }
+}
+
+