summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5.inc13
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/gcc-with-linker-hash-style.patch212
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99491.patch309
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99541.patch22
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99548.patch80
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99549.patch460
6 files changed, 760 insertions, 336 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
index 579280ff1c..a0c2a7b289 100644
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
@@ -14,7 +14,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
14 14
15 15
16PV = "4.5" 16PV = "4.5"
17PR = "r43" 17PR = "r44"
18 18
19# BINV should be incremented after updating to a revision 19# BINV should be incremented after updating to a revision
20# after a minor gcc release (e.g. 4.5.1 or 4.5.2) has been made 20# after a minor gcc release (e.g. 4.5.1 or 4.5.2) has been made
@@ -23,8 +23,7 @@ PR = "r43"
23# which will be next minor release and so on. 23# which will be next minor release and so on.
24 24
25BINV = "${PV}.4" 25BINV = "${PV}.4"
26 26SRCREV = 181733
27SRCREV = 178923
28BRANCH = "gcc-4_5-branch" 27BRANCH = "gcc-4_5-branch"
29PR_append = "+svnr${SRCPV}" 28PR_append = "+svnr${SRCPV}"
30 29
@@ -179,7 +178,6 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH};proto=http \
179 file://linaro/gcc-4.5-linaro-r99483.patch \ 178 file://linaro/gcc-4.5-linaro-r99483.patch \
180 file://linaro/gcc-4.5-linaro-r99488.patch \ 179 file://linaro/gcc-4.5-linaro-r99488.patch \
181 file://linaro/gcc-4.5-linaro-r99489.patch \ 180 file://linaro/gcc-4.5-linaro-r99489.patch \
182 file://linaro/gcc-4.5-linaro-r99491.patch \
183 file://linaro/gcc-4.5-linaro-r99494.patch \ 181 file://linaro/gcc-4.5-linaro-r99494.patch \
184 file://linaro/gcc-4.5-linaro-r99495.patch \ 182 file://linaro/gcc-4.5-linaro-r99495.patch \
185 file://linaro/gcc-4.5-linaro-r99498.patch \ 183 file://linaro/gcc-4.5-linaro-r99498.patch \
@@ -208,7 +206,8 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH};proto=http \
208 file://linaro/gcc-4.5-linaro-r99536.patch \ 206 file://linaro/gcc-4.5-linaro-r99536.patch \
209 file://linaro/gcc-4.5-linaro-r99537.patch \ 207 file://linaro/gcc-4.5-linaro-r99537.patch \
210 file://linaro/gcc-4.5-linaro-r99540.patch \ 208 file://linaro/gcc-4.5-linaro-r99540.patch \
211 file://linaro/gcc-4.5-linaro-r99541.patch \ 209 file://linaro/gcc-4.5-linaro-r99548.patch \
210 file://linaro/gcc-4.5-linaro-r99549.patch \
212 \ 211 \
213 file://more-epilogues.patch \ 212 file://more-epilogues.patch \
214 file://gcc-scalar-widening-pr45847.patch \ 213 file://gcc-scalar-widening-pr45847.patch \
@@ -233,6 +232,7 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH};proto=http \
233 file://gcc-poison-parameters.patch \ 232 file://gcc-poison-parameters.patch \
234 file://gcc-ppc-config-fix.patch \ 233 file://gcc-ppc-config-fix.patch \
235 file://use-defaults.h-and-t-oe-in-B.patch \ 234 file://use-defaults.h-and-t-oe-in-B.patch \
235 file://gcc-with-linker-hash-style.patch \
236 " 236 "
237 237
238# Language Overrides 238# Language Overrides
@@ -252,6 +252,9 @@ EXTRA_OECONF_BASE = "--enable-lto \
252 --disable-bootstrap \ 252 --disable-bootstrap \
253 --disable-libgomp \ 253 --disable-libgomp \
254 --disable-libmudflap \ 254 --disable-libmudflap \
255 --with-linker-hash-style=${LINKER_HASH_STYLE} \
256 --with-ppl=no \
257 --with-cloog=no \
255 --enable-cheaders=c_global " 258 --enable-cheaders=c_global "
256 259
257EXTRA_OECONF_INITIAL = "--disable-libmudflap \ 260EXTRA_OECONF_INITIAL = "--disable-libmudflap \
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/gcc-with-linker-hash-style.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/gcc-with-linker-hash-style.patch
new file mode 100644
index 0000000000..ac4281ac28
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/gcc-with-linker-hash-style.patch
@@ -0,0 +1,212 @@
1Upstream-Status: Backport
2Signed-off-by: Khem Raj <raj.khem@gmail.com>
3
4commit 3cb9bbfa927aa187048534f9069202c017a78e38
5Author: ppluzhnikov <ppluzhnikov@138bc75d-0d04-0410-961f-82ee72b054a4>
6Date: Wed May 11 18:28:14 2011 +0000
7
8 2011-05-11 Satoru Takabayashi <satorux@google.com>
9 Paul Pluzhnikov <ppluzhnikov@google.com>
10
11 * gcc/doc/install.texi (Configuration): Document
12 --with-linker-hash-style.
13 * gcc/gcc.c (init_spec): Handle LINKER_HASH_STYLE.
14 * gcc/config.in: Add LINKER_HASH_STYLE.
15 * gcc/configure.ac: Add --with-linker-hash-style.
16 * gcc/configure: Regenerate.
17
18
19
20 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173668 138bc75d-0d04-0410-961f-82ee72b054a4
21
22Index: gcc-4_5-branch/gcc/config.in
23===================================================================
24--- gcc-4_5-branch.orig/gcc/config.in 2011-12-03 13:41:00.000000000 -0800
25+++ gcc-4_5-branch/gcc/config.in 2011-12-03 13:44:46.287530329 -0800
26@@ -113,6 +113,12 @@
27 #endif
28
29
30+/* The linker hash style */
31+#ifndef USED_FOR_TARGET
32+#undef LINKER_HASH_STYLE
33+#endif
34+
35+
36 /* Define to enable LTO support. */
37 #ifndef USED_FOR_TARGET
38 #undef ENABLE_LTO
39Index: gcc-4_5-branch/gcc/configure
40===================================================================
41--- gcc-4_5-branch.orig/gcc/configure 2011-12-03 13:41:00.000000000 -0800
42+++ gcc-4_5-branch/gcc/configure 2011-12-03 13:46:12.747530321 -0800
43@@ -600,6 +600,7 @@
44
45 ac_subst_vars='LTLIBOBJS
46 LIBOBJS
47+enable_target_optspace
48 enable_plugin
49 pluginlibs
50 LIBELFINC
51@@ -915,7 +916,7 @@
52 with_slibdir
53 enable_poison_system_directories
54 enable_plugin
55-enable_target_optspace
56+with_linker_hash_style
57 '
58 ac_precious_vars='build_alias
59 host_alias
60@@ -1663,6 +1664,8 @@
61 with the compiler
62 --with-system-zlib use installed libz
63 --with-slibdir=DIR shared libraries in DIR [LIBDIR]
64+ --with-linker-hash-style={sysv,gnu,both}
65+ specify the linker hash style
66
67 Some influential environment variables:
68 CC C compiler command
69@@ -17115,7 +17118,7 @@
70 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
71 lt_status=$lt_dlunknown
72 cat > conftest.$ac_ext <<_LT_EOF
73-#line 17114 "configure"
74+#line 17121 "configure"
75 #include "confdefs.h"
76
77 #if HAVE_DLFCN_H
78@@ -17221,7 +17224,7 @@
79 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
80 lt_status=$lt_dlunknown
81 cat > conftest.$ac_ext <<_LT_EOF
82-#line 17220 "configure"
83+#line 17227 "configure"
84 #include "confdefs.h"
85
86 #if HAVE_DLFCN_H
87@@ -25659,12 +25662,42 @@
88
89 fi
90
91-if test x"$enable_target_optspace" != x; then :
92+
93+if test x"$enable_target_optspace" != x; then
94
95 $as_echo "#define ENABLE_TARGET_OPTSPACE 1" >>confdefs.h
96
97 fi
98
99+# Specify what hash style to use by default.
100+
101+# Check whether --with-linker-hash-style was given.
102+if test "${with_linker_hash_style+set}" = set; then :
103+ withval=$with_linker_hash_style; case x"$withval" in
104+ xsysv)
105+ LINKER_HASH_STYLE=sysv
106+ ;;
107+ xgnu)
108+ LINKER_HASH_STYLE=gnu
109+ ;;
110+ xboth)
111+ LINKER_HASH_STYLE=both
112+ ;;
113+ *)
114+ as_fn_error "$withval is an invalid option to --with-linker-hash-style" "$LINENO" 5
115+ ;;
116+ esac
117+else
118+ LINKER_HASH_STYLE=''
119+fi
120+
121+if test x"${LINKER_HASH_STYLE}" != x; then
122+
123+cat >>confdefs.h <<_ACEOF
124+#define LINKER_HASH_STYLE "$LINKER_HASH_STYLE"
125+_ACEOF
126+
127+fi
128
129 # Configure the subdirectories
130 # AC_CONFIG_SUBDIRS($subdirs)
131Index: gcc-4_5-branch/gcc/configure.ac
132===================================================================
133--- gcc-4_5-branch.orig/gcc/configure.ac 2011-12-03 13:41:00.000000000 -0800
134+++ gcc-4_5-branch/gcc/configure.ac 2011-12-03 13:41:04.499530358 -0800
135@@ -4664,6 +4664,30 @@
136 AC_DEFINE(ENABLE_TARGET_OPTSPACE, 1, [Define to enable target optspace support.])
137 fi
138
139+# Specify what hash style to use by default.
140+AC_ARG_WITH([linker-hash-style],
141+[AC_HELP_STRING([--with-linker-hash-style={sysv,gnu,both}],
142+ [specify the linker hash style])],
143+[case x"$withval" in
144+ xsysv)
145+ LINKER_HASH_STYLE=sysv
146+ ;;
147+ xgnu)
148+ LINKER_HASH_STYLE=gnu
149+ ;;
150+ xboth)
151+ LINKER_HASH_STYLE=both
152+ ;;
153+ *)
154+ AC_MSG_ERROR([$withval is an invalid option to --with-linker-hash-style])
155+ ;;
156+ esac],
157+[LINKER_HASH_STYLE=''])
158+if test x"${LINKER_HASH_STYLE}" != x; then
159+ AC_DEFINE_UNQUOTED(LINKER_HASH_STYLE, "$LINKER_HASH_STYLE",
160+ [The linker hash style])
161+fi
162+
163 # Configure the subdirectories
164 # AC_CONFIG_SUBDIRS($subdirs)
165
166Index: gcc-4_5-branch/gcc/doc/install.texi
167===================================================================
168--- gcc-4_5-branch.orig/gcc/doc/install.texi 2011-12-03 13:15:09.000000000 -0800
169+++ gcc-4_5-branch/gcc/doc/install.texi 2011-12-03 13:41:04.499530358 -0800
170@@ -1630,6 +1630,11 @@
171 support @option{--build-id} option, a warning is issued and the
172 @option{--enable-linker-build-id} option is ignored. The default is off.
173
174+@item --with-linker-hash-style=@var{choice}
175+Tells GCC to pass @option{--hash-style=@var{choice}} option to the
176+linker for all final links. @var{choice} can be one of
177+@samp{sysv}, @samp{gnu}, and @samp{both} where @samp{sysv} is the default.
178+
179 @item --enable-gnu-unique-object
180 @itemx --disable-gnu-unique-object
181 Tells GCC to use the gnu_unique_object relocation for C++ template
182Index: gcc-4_5-branch/gcc/gcc.c
183===================================================================
184--- gcc-4_5-branch.orig/gcc/gcc.c 2011-12-03 13:41:00.000000000 -0800
185+++ gcc-4_5-branch/gcc/gcc.c 2011-12-03 13:41:04.499530358 -0800
186@@ -1917,7 +1917,8 @@
187 }
188 #endif
189
190-#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
191+#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
192+ defined LINKER_HASH_STYLE
193 # ifdef LINK_BUILDID_SPEC
194 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
195 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
196@@ -1926,6 +1927,16 @@
197 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
198 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
199 # endif
200+# ifdef LINKER_HASH_STYLE
201+ /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
202+ before. */
203+ {
204+ static const char hash_style[] = "--hash-style=";
205+ obstack_grow (&obstack, hash_style, sizeof(hash_style) - 1);
206+ obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof(LINKER_HASH_STYLE) - 1);
207+ obstack_1grow (&obstack, ' ');
208+ }
209+# endif
210 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
211 link_spec = XOBFINISH (&obstack, const char *);
212 #endif
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99491.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99491.patch
deleted file mode 100644
index a2d6c6a69a..0000000000
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99491.patch
+++ /dev/null
@@ -1,309 +0,0 @@
12011-04-08 Richard Sandiford <richard.sandiford@linaro.org>
2
3 Backport from mainline:
4 gcc/
5 * dwarf2out.c (dw_loc_list_node): Add resolved_addr and replaced.
6 (cached_dw_loc_list_def): New structure.
7 (cached_dw_loc_list): New typedef.
8 (cached_dw_loc_list_table): New variable.
9 (cached_dw_loc_list_table_hash): New function.
10 (cached_dw_loc_list_table_eq): Likewise.
11 (add_location_or_const_value_attribute): Take a bool cache_p.
12 Cache the list when the parameter is true.
13 (gen_formal_parameter_die): Update caller.
14 (gen_variable_die): Likewise.
15 (dwarf2out_finish): Likewise.
16 (dwarf2out_abstract_function): Nullify cached_dw_loc_list_table
17 while generating debug info for the decl.
18 (dwarf2out_function_decl): Clear cached_dw_loc_list_table.
19 (dwarf2out_init): Initialize cached_dw_loc_list_table.
20 (resolve_addr): Cache the result of resolving a chain of
21 location lists.
22
23 From: 2010-10-12 Jakub Jelinek <jakub@redhat.com>
24 * dwarf2out.c (dw_loc_list_node): Add emitted field.
25 (output_loc_list): Return immediately if emitted is set, set it.
26
27=== modified file 'gcc/dwarf2out.c'
28--- old/gcc/dwarf2out.c 2011-03-10 14:55:10 +0000
29+++ new/gcc/dwarf2out.c 2011-03-28 09:43:50 +0000
30@@ -4256,6 +4256,12 @@
31 Only on head of list */
32 const char *section; /* Section this loclist is relative to */
33 dw_loc_descr_ref expr;
34+ /* True if all addresses in this and subsequent lists are known to be
35+ resolved. */
36+ bool resolved_addr;
37+ /* True if this list has been replaced by dw_loc_next. */
38+ bool replaced;
39+ bool emitted;
40 } dw_loc_list_node;
41
42 #if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
43@@ -5759,6 +5765,19 @@
44 /* Table of decl location linked lists. */
45 static GTY ((param_is (var_loc_list))) htab_t decl_loc_table;
46
47+/* A cached location list. */
48+struct GTY (()) cached_dw_loc_list_def {
49+ /* The DECL_UID of the decl that this entry describes. */
50+ unsigned int decl_id;
51+
52+ /* The cached location list. */
53+ dw_loc_list_ref loc_list;
54+};
55+typedef struct cached_dw_loc_list_def cached_dw_loc_list;
56+
57+/* Table of cached location lists. */
58+static GTY ((param_is (cached_dw_loc_list))) htab_t cached_dw_loc_list_table;
59+
60 /* A pointer to the base of a list of references to DIE's that
61 are uniquely identified by their tag, presence/absence of
62 children DIE's, and list of attribute/value pairs. */
63@@ -6112,7 +6131,7 @@
64 static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *);
65 static void insert_float (const_rtx, unsigned char *);
66 static rtx rtl_for_decl_location (tree);
67-static bool add_location_or_const_value_attribute (dw_die_ref, tree,
68+static bool add_location_or_const_value_attribute (dw_die_ref, tree, bool,
69 enum dwarf_attribute);
70 static bool tree_add_const_value_attribute (dw_die_ref, tree);
71 static bool tree_add_const_value_attribute_for_decl (dw_die_ref, tree);
72@@ -7731,6 +7750,24 @@
73 htab_find_with_hash (decl_loc_table, decl, DECL_UID (decl));
74 }
75
76+/* Returns a hash value for X (which really is a cached_dw_loc_list_list). */
77+
78+static hashval_t
79+cached_dw_loc_list_table_hash (const void *x)
80+{
81+ return (hashval_t) ((const cached_dw_loc_list *) x)->decl_id;
82+}
83+
84+/* Return nonzero if decl_id of cached_dw_loc_list X is the same as
85+ UID of decl *Y. */
86+
87+static int
88+cached_dw_loc_list_table_eq (const void *x, const void *y)
89+{
90+ return (((const cached_dw_loc_list *) x)->decl_id
91+ == DECL_UID ((const_tree) y));
92+}
93+
94 /* Equate a DIE to a particular declaration. */
95
96 static void
97@@ -10355,6 +10392,10 @@
98 {
99 dw_loc_list_ref curr = list_head;
100
101+ if (list_head->emitted)
102+ return;
103+ list_head->emitted = true;
104+
105 ASM_OUTPUT_LABEL (asm_out_file, list_head->ll_symbol);
106
107 /* Walk the location list, and output each range + expression. */
108@@ -15920,15 +15961,22 @@
109 these things can crop up in other ways also.) Note that one type of
110 constant value which can be passed into an inlined function is a constant
111 pointer. This can happen for example if an actual argument in an inlined
112- function call evaluates to a compile-time constant address. */
113+ function call evaluates to a compile-time constant address.
114+
115+ CACHE_P is true if it is worth caching the location list for DECL,
116+ so that future calls can reuse it rather than regenerate it from scratch.
117+ This is true for BLOCK_NONLOCALIZED_VARS in inlined subroutines,
118+ since we will need to refer to them each time the function is inlined. */
119
120 static bool
121-add_location_or_const_value_attribute (dw_die_ref die, tree decl,
122+add_location_or_const_value_attribute (dw_die_ref die, tree decl, bool cache_p,
123 enum dwarf_attribute attr)
124 {
125 rtx rtl;
126 dw_loc_list_ref list;
127 var_loc_list *loc_list;
128+ cached_dw_loc_list *cache;
129+ void **slot;
130
131 if (TREE_CODE (decl) == ERROR_MARK)
132 return false;
133@@ -15964,7 +16012,34 @@
134 && add_const_value_attribute (die, rtl))
135 return true;
136 }
137- list = loc_list_from_tree (decl, decl_by_reference_p (decl) ? 0 : 2);
138+ /* If this decl is from BLOCK_NONLOCALIZED_VARS, we might need its
139+ list several times. See if we've already cached the contents. */
140+ list = NULL;
141+ if (loc_list == NULL || cached_dw_loc_list_table == NULL)
142+ cache_p = false;
143+ if (cache_p)
144+ {
145+ cache = (cached_dw_loc_list *)
146+ htab_find_with_hash (cached_dw_loc_list_table, decl, DECL_UID (decl));
147+ if (cache)
148+ list = cache->loc_list;
149+ }
150+ if (list == NULL)
151+ {
152+ list = loc_list_from_tree (decl, decl_by_reference_p (decl) ? 0 : 2);
153+ /* It is usually worth caching this result if the decl is from
154+ BLOCK_NONLOCALIZED_VARS and if the list has at least two elements. */
155+ if (cache_p && list && list->dw_loc_next)
156+ {
157+ slot = htab_find_slot_with_hash (cached_dw_loc_list_table, decl,
158+ DECL_UID (decl), INSERT);
159+ cache = (cached_dw_loc_list *)
160+ ggc_alloc_cleared (sizeof (cached_dw_loc_list));
161+ cache->decl_id = DECL_UID (decl);
162+ cache->loc_list = list;
163+ *slot = cache;
164+ }
165+ }
166 if (list)
167 {
168 add_AT_location_description (die, attr, list);
169@@ -17532,7 +17607,7 @@
170 equate_decl_number_to_die (node, parm_die);
171 if (! DECL_ABSTRACT (node_or_origin))
172 add_location_or_const_value_attribute (parm_die, node_or_origin,
173- DW_AT_location);
174+ node == NULL, DW_AT_location);
175
176 break;
177
178@@ -17712,6 +17787,7 @@
179 tree context;
180 int was_abstract;
181 htab_t old_decl_loc_table;
182+ htab_t old_cached_dw_loc_list_table;
183
184 /* Make sure we have the actual abstract inline, not a clone. */
185 decl = DECL_ORIGIN (decl);
186@@ -17725,7 +17801,9 @@
187 DIE. Be sure to not clobber the outer location table nor use it or we would
188 get locations in abstract instantces. */
189 old_decl_loc_table = decl_loc_table;
190+ old_cached_dw_loc_list_table = cached_dw_loc_list_table;
191 decl_loc_table = NULL;
192+ cached_dw_loc_list_table = NULL;
193
194 /* Be sure we've emitted the in-class declaration DIE (if any) first, so
195 we don't get confused by DECL_ABSTRACT. */
196@@ -17750,6 +17828,7 @@
197
198 current_function_decl = save_fn;
199 decl_loc_table = old_decl_loc_table;
200+ cached_dw_loc_list_table = old_cached_dw_loc_list_table;
201 pop_cfun ();
202 }
203
204@@ -18431,9 +18510,8 @@
205 && !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl_or_origin)))
206 defer_location (decl_or_origin, var_die);
207 else
208- add_location_or_const_value_attribute (var_die,
209- decl_or_origin,
210- DW_AT_location);
211+ add_location_or_const_value_attribute (var_die, decl_or_origin,
212+ decl == NULL, DW_AT_location);
213 add_pubname (decl_or_origin, var_die);
214 }
215 else
216@@ -20049,6 +20127,7 @@
217 dwarf2out_decl (decl);
218
219 htab_empty (decl_loc_table);
220+ htab_empty (cached_dw_loc_list_table);
221 }
222
223 /* Output a marker (i.e. a label) for the beginning of the generated code for
224@@ -20649,6 +20728,11 @@
225 decl_loc_table = htab_create_ggc (10, decl_loc_table_hash,
226 decl_loc_table_eq, NULL);
227
228+ /* Allocate the cached_dw_loc_list_table. */
229+ cached_dw_loc_list_table
230+ = htab_create_ggc (10, cached_dw_loc_list_table_hash,
231+ cached_dw_loc_list_table_eq, NULL);
232+
233 /* Allocate the initial hunk of the decl_scope_table. */
234 decl_scope_table = VEC_alloc (tree, gc, 256);
235
236@@ -21278,30 +21362,53 @@
237 {
238 dw_die_ref c;
239 dw_attr_ref a;
240- dw_loc_list_ref *curr;
241+ dw_loc_list_ref *curr, *start, loc;
242 unsigned ix;
243
244 for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
245 switch (AT_class (a))
246 {
247 case dw_val_class_loc_list:
248- curr = AT_loc_list_ptr (a);
249- while (*curr)
250+ start = curr = AT_loc_list_ptr (a);
251+ loc = *curr;
252+ gcc_assert (loc);
253+ /* The same list can be referenced more than once. See if we have
254+ already recorded the result from a previous pass. */
255+ if (loc->replaced)
256+ *curr = loc->dw_loc_next;
257+ else if (!loc->resolved_addr)
258 {
259- if (!resolve_addr_in_expr ((*curr)->expr))
260+ /* As things stand, we do not expect or allow one die to
261+ reference a suffix of another die's location list chain.
262+ References must be identical or completely separate.
263+ There is therefore no need to cache the result of this
264+ pass on any list other than the first; doing so
265+ would lead to unnecessary writes. */
266+ while (*curr)
267 {
268- dw_loc_list_ref next = (*curr)->dw_loc_next;
269- if (next && (*curr)->ll_symbol)
270+ gcc_assert (!(*curr)->replaced && !(*curr)->resolved_addr);
271+ if (!resolve_addr_in_expr ((*curr)->expr))
272 {
273- gcc_assert (!next->ll_symbol);
274- next->ll_symbol = (*curr)->ll_symbol;
275+ dw_loc_list_ref next = (*curr)->dw_loc_next;
276+ if (next && (*curr)->ll_symbol)
277+ {
278+ gcc_assert (!next->ll_symbol);
279+ next->ll_symbol = (*curr)->ll_symbol;
280+ }
281+ *curr = next;
282 }
283- *curr = next;
284+ else
285+ curr = &(*curr)->dw_loc_next;
286 }
287+ if (loc == *start)
288+ loc->resolved_addr = 1;
289 else
290- curr = &(*curr)->dw_loc_next;
291+ {
292+ loc->replaced = 1;
293+ loc->dw_loc_next = *start;
294+ }
295 }
296- if (!AT_loc_list (a))
297+ if (!*start)
298 {
299 remove_AT (die, a->dw_attr);
300 ix--;
301@@ -21361,6 +21468,7 @@
302 add_location_or_const_value_attribute (
303 VEC_index (deferred_locations, deferred_locations_list, i)->die,
304 VEC_index (deferred_locations, deferred_locations_list, i)->variable,
305+ false,
306 DW_AT_location);
307 }
308
309
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99541.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99541.patch
deleted file mode 100644
index ae0e4bcd35..0000000000
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99541.patch
+++ /dev/null
@@ -1,22 +0,0 @@
12011-09-12 Richard Sandiford <richard.sandiford@linaro.org>
2
3 gcc/
4 Backport from mainline:
5
6 2010-12-06 Jakub Jelinek <jakub@redhat.com>
7
8 PR debug/46771
9 * reginfo.c (init_subregs_of_mode): Don't call find_subregs_of_mode
10 on DEBUG_INSNs.
11
12=== modified file 'gcc/reginfo.c'
13--- old/gcc/reginfo.c 2010-10-04 00:50:43 +0000
14+++ new/gcc/reginfo.c 2011-09-12 10:54:51 +0000
15@@ -1350,7 +1350,7 @@
16
17 FOR_EACH_BB (bb)
18 FOR_BB_INSNS (bb, insn)
19- if (INSN_P (insn))
20+ if (NONDEBUG_INSN_P (insn))
21 find_subregs_of_mode (PATTERN (insn));
22 }
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99548.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99548.patch
new file mode 100644
index 0000000000..b78319e8fa
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99548.patch
@@ -0,0 +1,80 @@
12011-09-22 Revital Eres <revital.eres@linaro.org>
2
3 gcc/
4 Backport from trunk -r178804:
5 modulo-sched.c (remove_node_from_ps): Return void
6 instead of bool.
7 (optimize_sc): Adjust call to remove_node_from_ps.
8 (sms_schedule): Add print info.
9
10=== modified file 'gcc/modulo-sched.c'
11--- old/gcc/modulo-sched.c 2011-08-09 04:31:10 +0000
12+++ new/gcc/modulo-sched.c 2011-09-22 13:58:43 +0000
13@@ -211,7 +211,7 @@
14 static bool try_scheduling_node_in_cycle (partial_schedule_ptr, ddg_node_ptr,
15 int, int, sbitmap, int *, sbitmap,
16 sbitmap);
17-static bool remove_node_from_ps (partial_schedule_ptr, ps_insn_ptr);
18+static void remove_node_from_ps (partial_schedule_ptr, ps_insn_ptr);
19
20 #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap)
21 #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time)
22@@ -834,8 +834,7 @@
23 if (next_ps_i->node->cuid == g->closing_branch->cuid)
24 break;
25
26- gcc_assert (next_ps_i);
27- gcc_assert (remove_node_from_ps (ps, next_ps_i));
28+ remove_node_from_ps (ps, next_ps_i);
29 success =
30 try_scheduling_node_in_cycle (ps, g->closing_branch,
31 g->closing_branch->cuid, c,
32@@ -1485,8 +1484,8 @@
33 if (dump_file)
34 {
35 fprintf (dump_file,
36- "SMS succeeded %d %d (with ii, sc)\n", ps->ii,
37- stage_count);
38+ "%s:%d SMS succeeded %d %d (with ii, sc)\n",
39+ insn_file (tail), insn_line (tail), ps->ii, stage_count);
40 print_partial_schedule (ps, dump_file);
41 }
42
43@@ -2810,22 +2809,18 @@
44 }
45
46
47-/* Removes the given PS_INSN from the partial schedule. Returns false if the
48- node is not found in the partial schedule, else returns true. */
49-static bool
50+/* Removes the given PS_INSN from the partial schedule. */
51+static void
52 remove_node_from_ps (partial_schedule_ptr ps, ps_insn_ptr ps_i)
53 {
54 int row;
55
56- if (!ps || !ps_i)
57- return false;
58-
59+ gcc_assert (ps && ps_i);
60+
61 row = SMODULO (ps_i->cycle, ps->ii);
62 if (! ps_i->prev_in_row)
63 {
64- if (ps_i != ps->rows[row])
65- return false;
66-
67+ gcc_assert (ps_i == ps->rows[row]);
68 ps->rows[row] = ps_i->next_in_row;
69 if (ps->rows[row])
70 ps->rows[row]->prev_in_row = NULL;
71@@ -2839,7 +2834,7 @@
72
73 ps->rows_length[row] -= 1;
74 free (ps_i);
75- return true;
76+ return;
77 }
78
79 /* Unlike what literature describes for modulo scheduling (which focuses
80
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99549.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99549.patch
new file mode 100644
index 0000000000..43617024a1
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99549.patch
@@ -0,0 +1,460 @@
12011-10-03 Richard Sandiford <richard.sandiford@linaro.org>
2
3 gcc/
4 Backport from mainline:
5
6 2010-12-06 Jakub Jelinek <jakub@redhat.com>
7
8 PR debug/46771
9 * reginfo.c (init_subregs_of_mode): Don't call find_subregs_of_mode
10 on DEBUG_INSNs.
11
122011-10-03 Richard Sandiford <richard.sandiford@linaro.org>
13
14 gcc/
15 Backport from mainline:
16
17 2011-09-22 Richard Sandiford <richard.sandiford@linaro.org>
18
19 * config/arm/predicates.md (expandable_comparison_operator): New
20 predicate, extracted from...
21 (arm_comparison_operator): ...here.
22 * config/arm/arm.md (cbranchsi4, cbranchsf4, cbranchdf4, cbranchdi4)
23 (cstoresi4, cstoresf4, cstoredf4, cstoredi4, movsicc, movsfcc)
24 (movdfcc): Use expandable_comparison_operator.
25
26 gcc/testsuite/
27 Backport from mainline:
28
29 2011-09-22 Richard Sandiford <richard.sandiford@linaro.org>
30
31 * gcc.target/arm/cmp-1.c: New test.
32 * gcc.target/arm/cmp-2.c: Likewise.
33
342011-10-03 Richard Sandiford <richard.sandiford@linaro.org>
35
36 gcc/
37 Backport from mainline:
38
39 2011-09-07 Richard Sandiford <richard.sandiford@linaro.org>
40
41 PR target/49030
42 * config/arm/arm-protos.h (maybe_get_arm_condition_code): Declare.
43 * config/arm/arm.c (maybe_get_arm_condition_code): New function,
44 reusing the old code from get_arm_condition_code. Return ARM_NV
45 for invalid comparison codes.
46 (get_arm_condition_code): Redefine in terms of
47 maybe_get_arm_condition_code.
48 * config/arm/predicates.md (arm_comparison_operator): Use
49 maybe_get_arm_condition_code.
50
51 gcc/testsuite/
52 Backport from mainline:
53
54 2011-09-07 Richard Sandiford <richard.sandiford@linaro.org>
55
56 PR target/49030
57 * gcc.dg/torture/pr49030.c: New test.
58
59=== modified file 'gcc/config/arm/arm-protos.h'
60--- old/gcc/config/arm/arm-protos.h 2011-09-15 10:06:35 +0000
61+++ new/gcc/config/arm/arm-protos.h 2011-10-03 10:09:06 +0000
62@@ -182,6 +182,7 @@
63 #endif
64 extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
65 #ifdef RTX_CODE
66+extern enum arm_cond_code maybe_get_arm_condition_code (rtx);
67 extern void thumb1_final_prescan_insn (rtx);
68 extern void thumb2_final_prescan_insn (rtx);
69 extern const char *thumb_load_double_from_address (rtx *);
70
71=== modified file 'gcc/config/arm/arm.c'
72--- old/gcc/config/arm/arm.c 2011-09-15 10:06:35 +0000
73+++ new/gcc/config/arm/arm.c 2011-10-03 10:09:06 +0000
74@@ -17196,10 +17196,10 @@
75 decremented/zeroed by arm_asm_output_opcode as the insns are output. */
76
77 /* Returns the index of the ARM condition code string in
78- `arm_condition_codes'. COMPARISON should be an rtx like
79- `(eq (...) (...))'. */
80-static enum arm_cond_code
81-get_arm_condition_code (rtx comparison)
82+ `arm_condition_codes', or ARM_NV if the comparison is invalid.
83+ COMPARISON should be an rtx like `(eq (...) (...))'. */
84+enum arm_cond_code
85+maybe_get_arm_condition_code (rtx comparison)
86 {
87 enum machine_mode mode = GET_MODE (XEXP (comparison, 0));
88 enum arm_cond_code code;
89@@ -17223,11 +17223,11 @@
90 case CC_DLTUmode: code = ARM_CC;
91
92 dominance:
93- gcc_assert (comp_code == EQ || comp_code == NE);
94-
95 if (comp_code == EQ)
96 return ARM_INVERSE_CONDITION_CODE (code);
97- return code;
98+ if (comp_code == NE)
99+ return code;
100+ return ARM_NV;
101
102 case CC_NOOVmode:
103 switch (comp_code)
104@@ -17236,7 +17236,7 @@
105 case EQ: return ARM_EQ;
106 case GE: return ARM_PL;
107 case LT: return ARM_MI;
108- default: gcc_unreachable ();
109+ default: return ARM_NV;
110 }
111
112 case CC_Zmode:
113@@ -17244,7 +17244,7 @@
114 {
115 case NE: return ARM_NE;
116 case EQ: return ARM_EQ;
117- default: gcc_unreachable ();
118+ default: return ARM_NV;
119 }
120
121 case CC_Nmode:
122@@ -17252,7 +17252,7 @@
123 {
124 case NE: return ARM_MI;
125 case EQ: return ARM_PL;
126- default: gcc_unreachable ();
127+ default: return ARM_NV;
128 }
129
130 case CCFPEmode:
131@@ -17277,7 +17277,7 @@
132 /* UNEQ and LTGT do not have a representation. */
133 case UNEQ: /* Fall through. */
134 case LTGT: /* Fall through. */
135- default: gcc_unreachable ();
136+ default: return ARM_NV;
137 }
138
139 case CC_SWPmode:
140@@ -17293,7 +17293,7 @@
141 case GTU: return ARM_CC;
142 case LEU: return ARM_CS;
143 case LTU: return ARM_HI;
144- default: gcc_unreachable ();
145+ default: return ARM_NV;
146 }
147
148 case CC_Cmode:
149@@ -17301,7 +17301,7 @@
150 {
151 case LTU: return ARM_CS;
152 case GEU: return ARM_CC;
153- default: gcc_unreachable ();
154+ default: return ARM_NV;
155 }
156
157 case CC_CZmode:
158@@ -17313,7 +17313,7 @@
159 case GTU: return ARM_HI;
160 case LEU: return ARM_LS;
161 case LTU: return ARM_CC;
162- default: gcc_unreachable ();
163+ default: return ARM_NV;
164 }
165
166 case CC_NCVmode:
167@@ -17323,7 +17323,7 @@
168 case LT: return ARM_LT;
169 case GEU: return ARM_CS;
170 case LTU: return ARM_CC;
171- default: gcc_unreachable ();
172+ default: return ARM_NV;
173 }
174
175 case CCmode:
176@@ -17339,13 +17339,22 @@
177 case GTU: return ARM_HI;
178 case LEU: return ARM_LS;
179 case LTU: return ARM_CC;
180- default: gcc_unreachable ();
181+ default: return ARM_NV;
182 }
183
184 default: gcc_unreachable ();
185 }
186 }
187
188+/* Like maybe_get_arm_condition_code, but never return ARM_NV. */
189+static enum arm_cond_code
190+get_arm_condition_code (rtx comparison)
191+{
192+ enum arm_cond_code code = maybe_get_arm_condition_code (comparison);
193+ gcc_assert (code != ARM_NV);
194+ return code;
195+}
196+
197 /* Tell arm_asm_output_opcode to output IT blocks for conditionally executed
198 instructions. */
199 void
200
201=== modified file 'gcc/config/arm/arm.md'
202--- old/gcc/config/arm/arm.md 2011-07-12 16:35:20 +0000
203+++ new/gcc/config/arm/arm.md 2011-10-03 10:09:55 +0000
204@@ -6428,7 +6428,7 @@
205
206 (define_expand "cbranchsi4"
207 [(set (pc) (if_then_else
208- (match_operator 0 "arm_comparison_operator"
209+ (match_operator 0 "expandable_comparison_operator"
210 [(match_operand:SI 1 "s_register_operand" "")
211 (match_operand:SI 2 "nonmemory_operand" "")])
212 (label_ref (match_operand 3 "" ""))
213@@ -6479,7 +6479,7 @@
214
215 (define_expand "cbranchsf4"
216 [(set (pc) (if_then_else
217- (match_operator 0 "arm_comparison_operator"
218+ (match_operator 0 "expandable_comparison_operator"
219 [(match_operand:SF 1 "s_register_operand" "")
220 (match_operand:SF 2 "arm_float_compare_operand" "")])
221 (label_ref (match_operand 3 "" ""))
222@@ -6491,7 +6491,7 @@
223
224 (define_expand "cbranchdf4"
225 [(set (pc) (if_then_else
226- (match_operator 0 "arm_comparison_operator"
227+ (match_operator 0 "expandable_comparison_operator"
228 [(match_operand:DF 1 "s_register_operand" "")
229 (match_operand:DF 2 "arm_float_compare_operand" "")])
230 (label_ref (match_operand 3 "" ""))
231@@ -6503,7 +6503,7 @@
232
233 (define_expand "cbranchdi4"
234 [(set (pc) (if_then_else
235- (match_operator 0 "arm_comparison_operator"
236+ (match_operator 0 "expandable_comparison_operator"
237 [(match_operand:DI 1 "cmpdi_operand" "")
238 (match_operand:DI 2 "cmpdi_operand" "")])
239 (label_ref (match_operand 3 "" ""))
240@@ -7898,7 +7898,7 @@
241
242 (define_expand "cstoresi4"
243 [(set (match_operand:SI 0 "s_register_operand" "")
244- (match_operator:SI 1 "arm_comparison_operator"
245+ (match_operator:SI 1 "expandable_comparison_operator"
246 [(match_operand:SI 2 "s_register_operand" "")
247 (match_operand:SI 3 "reg_or_int_operand" "")]))]
248 "TARGET_32BIT || TARGET_THUMB1"
249@@ -8034,7 +8034,7 @@
250
251 (define_expand "cstoresf4"
252 [(set (match_operand:SI 0 "s_register_operand" "")
253- (match_operator:SI 1 "arm_comparison_operator"
254+ (match_operator:SI 1 "expandable_comparison_operator"
255 [(match_operand:SF 2 "s_register_operand" "")
256 (match_operand:SF 3 "arm_float_compare_operand" "")]))]
257 "TARGET_32BIT && TARGET_HARD_FLOAT"
258@@ -8044,7 +8044,7 @@
259
260 (define_expand "cstoredf4"
261 [(set (match_operand:SI 0 "s_register_operand" "")
262- (match_operator:SI 1 "arm_comparison_operator"
263+ (match_operator:SI 1 "expandable_comparison_operator"
264 [(match_operand:DF 2 "s_register_operand" "")
265 (match_operand:DF 3 "arm_float_compare_operand" "")]))]
266 "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
267@@ -8054,7 +8054,7 @@
268
269 (define_expand "cstoredi4"
270 [(set (match_operand:SI 0 "s_register_operand" "")
271- (match_operator:SI 1 "arm_comparison_operator"
272+ (match_operator:SI 1 "expandable_comparison_operator"
273 [(match_operand:DI 2 "cmpdi_operand" "")
274 (match_operand:DI 3 "cmpdi_operand" "")]))]
275 "TARGET_32BIT"
276@@ -8174,7 +8174,7 @@
277
278 (define_expand "movsicc"
279 [(set (match_operand:SI 0 "s_register_operand" "")
280- (if_then_else:SI (match_operand 1 "arm_comparison_operator" "")
281+ (if_then_else:SI (match_operand 1 "expandable_comparison_operator" "")
282 (match_operand:SI 2 "arm_not_operand" "")
283 (match_operand:SI 3 "arm_not_operand" "")))]
284 "TARGET_32BIT"
285@@ -8194,7 +8194,7 @@
286
287 (define_expand "movsfcc"
288 [(set (match_operand:SF 0 "s_register_operand" "")
289- (if_then_else:SF (match_operand 1 "arm_comparison_operator" "")
290+ (if_then_else:SF (match_operand 1 "expandable_comparison_operator" "")
291 (match_operand:SF 2 "s_register_operand" "")
292 (match_operand:SF 3 "nonmemory_operand" "")))]
293 "TARGET_32BIT && TARGET_HARD_FLOAT"
294@@ -8220,7 +8220,7 @@
295
296 (define_expand "movdfcc"
297 [(set (match_operand:DF 0 "s_register_operand" "")
298- (if_then_else:DF (match_operand 1 "arm_comparison_operator" "")
299+ (if_then_else:DF (match_operand 1 "expandable_comparison_operator" "")
300 (match_operand:DF 2 "s_register_operand" "")
301 (match_operand:DF 3 "arm_float_add_operand" "")))]
302 "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE)"
303
304=== modified file 'gcc/config/arm/predicates.md'
305--- old/gcc/config/arm/predicates.md 2011-09-15 10:06:35 +0000
306+++ new/gcc/config/arm/predicates.md 2011-10-03 10:09:55 +0000
307@@ -236,11 +236,15 @@
308
309 ;; True for integer comparisons and, if FP is active, for comparisons
310 ;; other than LTGT or UNEQ.
311+(define_special_predicate "expandable_comparison_operator"
312+ (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,
313+ unordered,ordered,unlt,unle,unge,ungt"))
314+
315+;; Likewise, but only accept comparisons that are directly supported
316+;; by ARM condition codes.
317 (define_special_predicate "arm_comparison_operator"
318- (ior (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu")
319- (and (match_test "TARGET_32BIT && TARGET_HARD_FLOAT
320- && (TARGET_FPA || TARGET_VFP)")
321- (match_code "unordered,ordered,unlt,unle,unge,ungt"))))
322+ (and (match_operand 0 "expandable_comparison_operator")
323+ (match_test "maybe_get_arm_condition_code (op) != ARM_NV")))
324
325 (define_special_predicate "lt_ge_comparison_operator"
326 (match_code "lt,ge"))
327
328=== modified file 'gcc/reginfo.c'
329--- old/gcc/reginfo.c 2011-09-15 10:06:35 +0000
330+++ new/gcc/reginfo.c 2011-10-03 10:10:17 +0000
331@@ -1350,7 +1350,7 @@
332
333 FOR_EACH_BB (bb)
334 FOR_BB_INSNS (bb, insn)
335- if (INSN_P (insn))
336+ if (NONDEBUG_INSN_P (insn))
337 find_subregs_of_mode (PATTERN (insn));
338 }
339
340
341=== added file 'gcc/testsuite/gcc.dg/torture/pr49030.c'
342--- old/gcc/testsuite/gcc.dg/torture/pr49030.c 1970-01-01 00:00:00 +0000
343+++ new/gcc/testsuite/gcc.dg/torture/pr49030.c 2011-10-03 10:09:06 +0000
344@@ -0,0 +1,19 @@
345+void
346+sample_move_d32u24_sS (char *dst, float *src, unsigned long nsamples,
347+ unsigned long dst_skip)
348+{
349+ long long y;
350+ while (nsamples--)
351+ {
352+ y = (long long) (*src * 8388608.0f) << 8;
353+ if (y > 2147483647) {
354+ *(int *) dst = 2147483647;
355+ } else if (y < -2147483647 - 1) {
356+ *(int *) dst = -2147483647 - 1;
357+ } else {
358+ *(int *) dst = (int) y;
359+ }
360+ dst += dst_skip;
361+ src++;
362+ }
363+}
364
365=== added file 'gcc/testsuite/gcc.target/arm/cmp-1.c'
366--- old/gcc/testsuite/gcc.target/arm/cmp-1.c 1970-01-01 00:00:00 +0000
367+++ new/gcc/testsuite/gcc.target/arm/cmp-1.c 2011-10-03 10:09:55 +0000
368@@ -0,0 +1,37 @@
369+/* { dg-do compile } */
370+/* { dg-options "-O" } */
371+/* { dg-final { scan-assembler-not "\tbl\t" } } */
372+/* { dg-final { scan-assembler-not "__aeabi" } } */
373+int x, y;
374+
375+#define TEST_EXPR(NAME, ARGS, EXPR) \
376+ int NAME##1 ARGS { return (EXPR); } \
377+ int NAME##2 ARGS { return !(EXPR); } \
378+ int NAME##3 ARGS { return (EXPR) ? x : y; } \
379+ void NAME##4 ARGS { if (EXPR) x++; } \
380+ void NAME##5 ARGS { if (!(EXPR)) x++; }
381+
382+#define TEST(NAME, TYPE, OPERATOR) \
383+ TEST_EXPR (NAME##_rr, (TYPE a1, TYPE a2), a1 OPERATOR a2) \
384+ TEST_EXPR (NAME##_rm, (TYPE a1, TYPE *a2), a1 OPERATOR *a2) \
385+ TEST_EXPR (NAME##_mr, (TYPE *a1, TYPE a2), *a1 OPERATOR a2) \
386+ TEST_EXPR (NAME##_mm, (TYPE *a1, TYPE *a2), *a1 OPERATOR *a2) \
387+ TEST_EXPR (NAME##_rc, (TYPE a1), a1 OPERATOR 100) \
388+ TEST_EXPR (NAME##_cr, (TYPE a1), 100 OPERATOR a1)
389+
390+#define TEST_OP(NAME, OPERATOR) \
391+ TEST (sc_##NAME, signed char, OPERATOR) \
392+ TEST (uc_##NAME, unsigned char, OPERATOR) \
393+ TEST (ss_##NAME, short, OPERATOR) \
394+ TEST (us_##NAME, unsigned short, OPERATOR) \
395+ TEST (si_##NAME, int, OPERATOR) \
396+ TEST (ui_##NAME, unsigned int, OPERATOR) \
397+ TEST (sll_##NAME, long long, OPERATOR) \
398+ TEST (ull_##NAME, unsigned long long, OPERATOR)
399+
400+TEST_OP (eq, ==)
401+TEST_OP (ne, !=)
402+TEST_OP (lt, <)
403+TEST_OP (gt, >)
404+TEST_OP (le, <=)
405+TEST_OP (ge, >=)
406
407=== added file 'gcc/testsuite/gcc.target/arm/cmp-2.c'
408--- old/gcc/testsuite/gcc.target/arm/cmp-2.c 1970-01-01 00:00:00 +0000
409+++ new/gcc/testsuite/gcc.target/arm/cmp-2.c 2011-10-03 10:09:55 +0000
410@@ -0,0 +1,49 @@
411+/* { dg-do compile } */
412+/* { dg-require-effective-target arm_vfp_ok } */
413+/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
414+/* { dg-options "-O -mfpu=vfp -mfloat-abi=softfp" } */
415+/* { dg-final { scan-assembler-not "\tbl\t" } } */
416+/* { dg-final { scan-assembler-not "__aeabi" } } */
417+int x, y;
418+
419+#define EQ(X, Y) ((X) == (Y))
420+#define NE(X, Y) ((X) != (Y))
421+#define LT(X, Y) ((X) < (Y))
422+#define GT(X, Y) ((X) > (Y))
423+#define LE(X, Y) ((X) <= (Y))
424+#define GE(X, Y) ((X) >= (Y))
425+
426+#define TEST_EXPR(NAME, ARGS, EXPR) \
427+ int NAME##1 ARGS { return (EXPR); } \
428+ int NAME##2 ARGS { return !(EXPR); } \
429+ int NAME##3 ARGS { return (EXPR) ? x : y; } \
430+ void NAME##4 ARGS { if (EXPR) x++; } \
431+ void NAME##5 ARGS { if (!(EXPR)) x++; }
432+
433+#define TEST(NAME, TYPE, OPERATOR) \
434+ TEST_EXPR (NAME##_rr, (TYPE a1, TYPE a2), OPERATOR (a1, a2)) \
435+ TEST_EXPR (NAME##_rm, (TYPE a1, TYPE *a2), OPERATOR (a1, *a2)) \
436+ TEST_EXPR (NAME##_mr, (TYPE *a1, TYPE a2), OPERATOR (*a1, a2)) \
437+ TEST_EXPR (NAME##_mm, (TYPE *a1, TYPE *a2), OPERATOR (*a1, *a2)) \
438+ TEST_EXPR (NAME##_rc, (TYPE a1), OPERATOR (a1, 100)) \
439+ TEST_EXPR (NAME##_cr, (TYPE a1), OPERATOR (100, a1))
440+
441+#define TEST_OP(NAME, OPERATOR) \
442+ TEST (f_##NAME, float, OPERATOR) \
443+ TEST (d_##NAME, double, OPERATOR) \
444+ TEST (ld_##NAME, long double, OPERATOR)
445+
446+TEST_OP (eq, EQ)
447+TEST_OP (ne, NE)
448+TEST_OP (lt, LT)
449+TEST_OP (gt, GT)
450+TEST_OP (le, LE)
451+TEST_OP (ge, GE)
452+TEST_OP (blt, __builtin_isless)
453+TEST_OP (bgt, __builtin_isgreater)
454+TEST_OP (ble, __builtin_islessequal)
455+TEST_OP (bge, __builtin_isgreaterequal)
456+/* This one should be expanded into separate ordered and equality
457+ comparisons. */
458+TEST_OP (blg, __builtin_islessgreater)
459+TEST_OP (bun, __builtin_isunordered)
460