summaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-devtools
diff options
context:
space:
mode:
Diffstat (limited to 'meta-oe/recipes-devtools')
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5.inc25
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99301.patch119
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99481.patch40
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99482.patch84
-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-r99494.patch1272
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99495.patch784
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99498.patch186
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99502.patch134
9 files changed, 2754 insertions, 199 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
index 519a1e7af..4067d737d 100644
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc
@@ -13,21 +13,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
13 file://COPYING.RUNTIME;md5=fe60d87048567d4fe8c8a0ed2448bcc8" 13 file://COPYING.RUNTIME;md5=fe60d87048567d4fe8c8a0ed2448bcc8"
14 14
15 15
16SRCREV = "170880"
17PV = "4.5" 16PV = "4.5"
18INC_PR = "r35" 17INC_PR = "r36"
19 18# BINV should point to minor release
20# BINV should be incremented after updating to a revision
21# after a minor gcc release (e.g. 4.5.1 or 4.5.2) has been made
22# the value will be minor-release+1 e.g. if minor release was
23# 4.5.1 then the value below will be 2 which will mean 4.5.2
24# which will be next minor release and so on.
25
26BINV = "${PV}.3" 19BINV = "${PV}.3"
27BRANCH = "gcc-4_5-branch"
28PR_append = "+svnr${SRCPV}"
29 20
30SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH} \ 21SRC_URI = "${GNU_MIRROR}/gcc/gcc-${BINV}/gcc-${BINV}.tar.bz2 \
31 file://gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \ 22 file://gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
32 file://100-uclibc-conf.patch \ 23 file://100-uclibc-conf.patch \
33 file://gcc-uclibc-locale-ctype_touplow_t.patch \ 24 file://gcc-uclibc-locale-ctype_touplow_t.patch \
@@ -175,11 +166,15 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH} \
175 file://linaro/gcc-4.5-linaro-r99478.patch \ 166 file://linaro/gcc-4.5-linaro-r99478.patch \
176 file://linaro/gcc-4.5-linaro-r99479.patch \ 167 file://linaro/gcc-4.5-linaro-r99479.patch \
177 file://linaro/gcc-4.5-linaro-r99480.patch \ 168 file://linaro/gcc-4.5-linaro-r99480.patch \
178 file://linaro/gcc-4.5-linaro-r99481.patch \
179 file://linaro/gcc-4.5-linaro-r99482.patch \
180 file://linaro/gcc-4.5-linaro-r99483.patch \ 169 file://linaro/gcc-4.5-linaro-r99483.patch \
181 file://linaro/gcc-4.5-linaro-r99488.patch \ 170 file://linaro/gcc-4.5-linaro-r99488.patch \
182 file://linaro/gcc-4.5-linaro-r99489.patch \ 171 file://linaro/gcc-4.5-linaro-r99489.patch \
172 file://linaro/gcc-4.5-linaro-r99491.patch \
173 file://linaro/gcc-4.5-linaro-r99494.patch \
174 file://linaro/gcc-4.5-linaro-r99495.patch \
175 file://linaro/gcc-4.5-linaro-r99498.patch \
176# file://linaro/gcc-4.5-linaro-r99499.patch \
177 file://linaro/gcc-4.5-linaro-r99502.patch \
183 file://more-epilogues.patch \ 178 file://more-epilogues.patch \
184 file://gcc-scalar-widening-pr45847.patch \ 179 file://gcc-scalar-widening-pr45847.patch \
185 file://gcc-arm-volatile-bitfield-fix.patch \ 180 file://gcc-arm-volatile-bitfield-fix.patch \
@@ -207,7 +202,7 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH} \
207FORTRAN = "" 202FORTRAN = ""
208JAVA = "" 203JAVA = ""
209 204
210S = "${WORKDIR}/${BRANCH}" 205S = "${WORKDIR}/gcc-${BINV}"
211 206
212#EXTRA_OECONF_BASE = " --enable-cheaders=c_std \ 207#EXTRA_OECONF_BASE = " --enable-cheaders=c_std \
213# --enable-libssp \ 208# --enable-libssp \
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99301.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99301.patch
index 95907eeb8..0943130de 100644
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99301.patch
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99301.patch
@@ -37,9 +37,11 @@
37 gcc/ 37 gcc/
38 38
39=== modified file 'gcc/config/arm/arm-modes.def' 39=== modified file 'gcc/config/arm/arm-modes.def'
40--- old/gcc/config/arm/arm-modes.def 2009-06-18 11:24:10 +0000 40Index: gcc-4.5.3/gcc/config/arm/arm-modes.def
41+++ new/gcc/config/arm/arm-modes.def 2010-07-29 16:58:56 +0000 41===================================================================
42@@ -35,10 +35,16 @@ 42--- gcc-4.5.3.orig/gcc/config/arm/arm-modes.def
43+++ gcc-4.5.3/gcc/config/arm/arm-modes.def
44@@ -35,10 +35,16 @@ ADJUST_FLOAT_FORMAT (HF, ((arm_fp16_form
43 CC_NOOVmode should be used with SImode integer equalities. 45 CC_NOOVmode should be used with SImode integer equalities.
44 CC_Zmode should be used if only the Z flag is set correctly 46 CC_Zmode should be used if only the Z flag is set correctly
45 CC_Nmode should be used if only the N (sign) flag is set correctly 47 CC_Nmode should be used if only the N (sign) flag is set correctly
@@ -56,11 +58,11 @@
56 CC_MODE (CC_SWP); 58 CC_MODE (CC_SWP);
57 CC_MODE (CCFP); 59 CC_MODE (CCFP);
58 CC_MODE (CCFPE); 60 CC_MODE (CCFPE);
59 61Index: gcc-4.5.3/gcc/config/arm/arm-protos.h
60=== modified file 'gcc/config/arm/arm-protos.h' 62===================================================================
61--- old/gcc/config/arm/arm-protos.h 2009-11-11 14:23:03 +0000 63--- gcc-4.5.3.orig/gcc/config/arm/arm-protos.h
62+++ new/gcc/config/arm/arm-protos.h 2010-07-29 16:58:56 +0000 64+++ gcc-4.5.3/gcc/config/arm/arm-protos.h
63@@ -49,8 +49,7 @@ 65@@ -49,8 +49,7 @@ extern int arm_hard_regno_mode_ok (unsig
64 extern int const_ok_for_arm (HOST_WIDE_INT); 66 extern int const_ok_for_arm (HOST_WIDE_INT);
65 extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx, 67 extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
66 HOST_WIDE_INT, rtx, rtx, int); 68 HOST_WIDE_INT, rtx, rtx, int);
@@ -70,7 +72,7 @@
70 extern int legitimate_pic_operand_p (rtx); 72 extern int legitimate_pic_operand_p (rtx);
71 extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx); 73 extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
72 extern rtx legitimize_tls_address (rtx, rtx); 74 extern rtx legitimize_tls_address (rtx, rtx);
73@@ -116,6 +115,7 @@ 75@@ -116,6 +115,7 @@ extern void arm_reload_in_hi (rtx *);
74 extern void arm_reload_out_hi (rtx *); 76 extern void arm_reload_out_hi (rtx *);
75 extern int arm_const_double_inline_cost (rtx); 77 extern int arm_const_double_inline_cost (rtx);
76 extern bool arm_const_double_by_parts (rtx); 78 extern bool arm_const_double_by_parts (rtx);
@@ -78,11 +80,11 @@
78 extern const char *fp_immediate_constant (rtx); 80 extern const char *fp_immediate_constant (rtx);
79 extern void arm_emit_call_insn (rtx, rtx); 81 extern void arm_emit_call_insn (rtx, rtx);
80 extern const char *output_call (rtx *); 82 extern const char *output_call (rtx *);
81 83Index: gcc-4.5.3/gcc/config/arm/arm.c
82=== modified file 'gcc/config/arm/arm.c' 84===================================================================
83--- old/gcc/config/arm/arm.c 2010-07-29 15:59:12 +0000 85--- gcc-4.5.3.orig/gcc/config/arm/arm.c
84+++ new/gcc/config/arm/arm.c 2010-07-29 16:58:56 +0000 86+++ gcc-4.5.3/gcc/config/arm/arm.c
85@@ -3190,13 +3190,82 @@ 87@@ -3191,13 +3191,82 @@ arm_gen_constant (enum rtx_code code, en
86 immediate value easier to load. */ 88 immediate value easier to load. */
87 89
88 enum rtx_code 90 enum rtx_code
@@ -169,7 +171,7 @@
169 switch (code) 171 switch (code)
170 { 172 {
171 case EQ: 173 case EQ:
172@@ -9912,6 +9981,55 @@ 174@@ -9913,6 +9982,55 @@ arm_select_cc_mode (enum rtx_code op, rt
173 && (rtx_equal_p (XEXP (x, 0), y) || rtx_equal_p (XEXP (x, 1), y))) 175 && (rtx_equal_p (XEXP (x, 0), y) || rtx_equal_p (XEXP (x, 1), y)))
174 return CC_Cmode; 176 return CC_Cmode;
175 177
@@ -225,18 +227,17 @@
225 return CCmode; 227 return CCmode;
226 } 228 }
227 229
228@@ -9921,10 +10039,39 @@ 230@@ -9922,10 +10040,39 @@ arm_select_cc_mode (enum rtx_code op, rt
229 rtx 231 rtx
230 arm_gen_compare_reg (enum rtx_code code, rtx x, rtx y) 232 arm_gen_compare_reg (enum rtx_code code, rtx x, rtx y)
231 { 233 {
232- enum machine_mode mode = SELECT_CC_MODE (code, x, y); 234- enum machine_mode mode = SELECT_CC_MODE (code, x, y);
233- rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM); 235- rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM);
234-
235- emit_set_insn (cc_reg, gen_rtx_COMPARE (mode, x, y));
236+ enum machine_mode mode; 236+ enum machine_mode mode;
237+ rtx cc_reg; 237+ rtx cc_reg;
238+ int dimode_comparison = GET_MODE (x) == DImode || GET_MODE (y) == DImode; 238+ int dimode_comparison = GET_MODE (x) == DImode || GET_MODE (y) == DImode;
239+ 239
240- emit_set_insn (cc_reg, gen_rtx_COMPARE (mode, x, y));
240+ /* We might have X as a constant, Y as a register because of the predicates 241+ /* We might have X as a constant, Y as a register because of the predicates
241+ used for cmpdi. If so, force X to a register here. */ 242+ used for cmpdi. If so, force X to a register here. */
242+ if (dimode_comparison && !REG_P (x)) 243+ if (dimode_comparison && !REG_P (x))
@@ -269,7 +270,7 @@
269 270
270 return cc_reg; 271 return cc_reg;
271 } 272 }
272@@ -11253,6 +11400,34 @@ 273@@ -11254,6 +11401,34 @@ arm_const_double_by_parts (rtx val)
273 return false; 274 return false;
274 } 275 }
275 276
@@ -304,7 +305,7 @@
304 /* Scan INSN and note any of its operands that need fixing. 305 /* Scan INSN and note any of its operands that need fixing.
305 If DO_PUSHES is false we do not actually push any of the fixups 306 If DO_PUSHES is false we do not actually push any of the fixups
306 needed. The function returns TRUE if any fixups were needed/pushed. 307 needed. The function returns TRUE if any fixups were needed/pushed.
307@@ -15097,8 +15272,18 @@ 308@@ -15150,8 +15325,18 @@ arm_print_operand (FILE *stream, rtx x,
308 the value being loaded is big-wordian or little-wordian. The 309 the value being loaded is big-wordian or little-wordian. The
309 order of the two register loads can matter however, if the address 310 order of the two register loads can matter however, if the address
310 of the memory location is actually held in one of the registers 311 of the memory location is actually held in one of the registers
@@ -324,7 +325,7 @@
324 if (GET_CODE (x) != REG || REGNO (x) > LAST_ARM_REGNUM) 325 if (GET_CODE (x) != REG || REGNO (x) > LAST_ARM_REGNUM)
325 { 326 {
326 output_operand_lossage ("invalid operand for code '%c'", code); 327 output_operand_lossage ("invalid operand for code '%c'", code);
327@@ -15109,6 +15294,18 @@ 328@@ -15162,6 +15347,18 @@ arm_print_operand (FILE *stream, rtx x,
328 return; 329 return;
329 330
330 case 'R': 331 case 'R':
@@ -343,7 +344,7 @@
343 if (GET_CODE (x) != REG || REGNO (x) > LAST_ARM_REGNUM) 344 if (GET_CODE (x) != REG || REGNO (x) > LAST_ARM_REGNUM)
344 { 345 {
345 output_operand_lossage ("invalid operand for code '%c'", code); 346 output_operand_lossage ("invalid operand for code '%c'", code);
346@@ -15801,6 +15998,28 @@ 347@@ -15854,6 +16051,28 @@ get_arm_condition_code (rtx comparison)
347 default: gcc_unreachable (); 348 default: gcc_unreachable ();
348 } 349 }
349 350
@@ -372,11 +373,11 @@
372 case CCmode: 373 case CCmode:
373 switch (comp_code) 374 switch (comp_code)
374 { 375 {
375 376Index: gcc-4.5.3/gcc/config/arm/arm.h
376=== modified file 'gcc/config/arm/arm.h' 377===================================================================
377--- old/gcc/config/arm/arm.h 2009-12-23 16:36:40 +0000 378--- gcc-4.5.3.orig/gcc/config/arm/arm.h
378+++ new/gcc/config/arm/arm.h 2010-07-29 16:58:56 +0000 379+++ gcc-4.5.3/gcc/config/arm/arm.h
379@@ -2253,19 +2253,7 @@ 380@@ -2253,19 +2253,7 @@ extern int making_const_table;
380 : reverse_condition (code)) 381 : reverse_condition (code))
381 382
382 #define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \ 383 #define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \
@@ -397,10 +398,10 @@
397 398
398 /* The arm5 clz instruction returns 32. */ 399 /* The arm5 clz instruction returns 32. */
399 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1) 400 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
400 401Index: gcc-4.5.3/gcc/config/arm/arm.md
401=== modified file 'gcc/config/arm/arm.md' 402===================================================================
402--- old/gcc/config/arm/arm.md 2010-07-29 15:59:12 +0000 403--- gcc-4.5.3.orig/gcc/config/arm/arm.md
403+++ new/gcc/config/arm/arm.md 2010-07-29 16:58:56 +0000 404+++ gcc-4.5.3/gcc/config/arm/arm.md
404@@ -6718,17 +6718,45 @@ 405@@ -6718,17 +6718,45 @@
405 operands[3])); DONE;" 406 operands[3])); DONE;"
406 ) 407 )
@@ -506,7 +507,7 @@
506 ;; Cirrus SF compare instruction 507 ;; Cirrus SF compare instruction
507 (define_insn "*cirrus_cmpsf" 508 (define_insn "*cirrus_cmpsf"
508 [(set (reg:CCFP CC_REGNUM) 509 [(set (reg:CCFP CC_REGNUM)
509@@ -8183,18 +8257,45 @@ 510@@ -8183,17 +8257,44 @@
510 operands[2], operands[3])); DONE;" 511 operands[2], operands[3])); DONE;"
511 ) 512 )
512 513
@@ -519,13 +520,14 @@
519- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" 520- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
520- "emit_insn (gen_cstore_cc (operands[0], operands[1], 521- "emit_insn (gen_cstore_cc (operands[0], operands[1],
521- operands[2], operands[3])); DONE;" 522- operands[2], operands[3])); DONE;"
523-)
522+ [(match_operand:DI 2 "cmpdi_operand" "") 524+ [(match_operand:DI 2 "cmpdi_operand" "")
523+ (match_operand:DI 3 "cmpdi_operand" "")]))] 525+ (match_operand:DI 3 "cmpdi_operand" "")]))]
524+ "TARGET_32BIT" 526+ "TARGET_32BIT"
525+ "{ 527+ "{
526+ rtx swap = NULL_RTX; 528+ rtx swap = NULL_RTX;
527+ enum rtx_code code = GET_CODE (operands[1]); 529+ enum rtx_code code = GET_CODE (operands[1]);
528+ 530
529+ /* We should not have two constants. */ 531+ /* We should not have two constants. */
530+ gcc_assert (GET_MODE (operands[2]) == DImode 532+ gcc_assert (GET_MODE (operands[2]) == DImode
531+ || GET_MODE (operands[3]) == DImode); 533+ || GET_MODE (operands[3]) == DImode);
@@ -553,16 +555,14 @@
553+ operands[3])); 555+ operands[3]));
554+ DONE; 556+ DONE;
555+ }" 557+ }"
556 ) 558+)
557 559
558-
559 (define_expand "cstoresi_eq0_thumb1" 560 (define_expand "cstoresi_eq0_thumb1"
560 [(parallel 561 [(parallel
561 [(set (match_operand:SI 0 "s_register_operand" "") 562Index: gcc-4.5.3/gcc/config/arm/constraints.md
562 563===================================================================
563=== modified file 'gcc/config/arm/constraints.md' 564--- gcc-4.5.3.orig/gcc/config/arm/constraints.md
564--- old/gcc/config/arm/constraints.md 2009-12-07 20:34:53 +0000 565+++ gcc-4.5.3/gcc/config/arm/constraints.md
565+++ new/gcc/config/arm/constraints.md 2010-07-29 16:58:56 +0000
566@@ -29,7 +29,7 @@ 566@@ -29,7 +29,7 @@
567 ;; in Thumb-1 state: I, J, K, L, M, N, O 567 ;; in Thumb-1 state: I, J, K, L, M, N, O
568 568
@@ -586,11 +586,11 @@
586 (define_constraint "Dn" 586 (define_constraint "Dn"
587 "@internal 587 "@internal
588 In ARM/Thumb-2 state a const_vector which can be loaded with a Neon vmov 588 In ARM/Thumb-2 state a const_vector which can be loaded with a Neon vmov
589 589Index: gcc-4.5.3/gcc/config/arm/predicates.md
590=== modified file 'gcc/config/arm/predicates.md' 590===================================================================
591--- old/gcc/config/arm/predicates.md 2010-07-29 15:59:12 +0000 591--- gcc-4.5.3.orig/gcc/config/arm/predicates.md
592+++ new/gcc/config/arm/predicates.md 2010-07-29 16:58:56 +0000 592+++ gcc-4.5.3/gcc/config/arm/predicates.md
593@@ -86,6 +86,12 @@ 593@@ -101,6 +101,12 @@
594 (and (match_code "const_int") 594 (and (match_code "const_int")
595 (match_test "const_ok_for_arm (INTVAL (op))"))) 595 (match_test "const_ok_for_arm (INTVAL (op))")))
596 596
@@ -603,7 +603,7 @@
603 (define_predicate "arm_neg_immediate_operand" 603 (define_predicate "arm_neg_immediate_operand"
604 (and (match_code "const_int") 604 (and (match_code "const_int")
605 (match_test "const_ok_for_arm (-INTVAL (op))"))) 605 (match_test "const_ok_for_arm (-INTVAL (op))")))
606@@ -115,6 +121,10 @@ 606@@ -130,6 +136,10 @@
607 (ior (match_operand 0 "arm_rhs_operand") 607 (ior (match_operand 0 "arm_rhs_operand")
608 (match_operand 0 "arm_not_immediate_operand"))) 608 (match_operand 0 "arm_not_immediate_operand")))
609 609
@@ -614,23 +614,23 @@
614 ;; True if the operand is a memory reference which contains an 614 ;; True if the operand is a memory reference which contains an
615 ;; offsettable address. 615 ;; offsettable address.
616 (define_predicate "offsettable_memory_operand" 616 (define_predicate "offsettable_memory_operand"
617@@ -522,4 +532,12 @@ 617@@ -538,3 +548,12 @@
618 (define_predicate "neon_lane_number"
619 (and (match_code "const_int") 618 (and (match_code "const_int")
620 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7"))) 619 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 15")))
620
621+;; Predicates for named expanders that overlap multiple ISAs. 621+;; Predicates for named expanders that overlap multiple ISAs.
622+ 622+
623+(define_predicate "cmpdi_operand" 623+(define_predicate "cmpdi_operand"
624+ (if_then_else (match_test "TARGET_HARD_FLOAT && TARGET_MAVERICK") 624+ (if_then_else (match_test "TARGET_HARD_FLOAT && TARGET_MAVERICK")
625+ (and (match_test "TARGET_ARM") 625+ (and (match_test "TARGET_ARM")
626+ (match_operand 0 "cirrus_fp_register")) 626+ (match_operand 0 "cirrus_fp_register"))
627+ (and (match_test "TARGET_32BIT") 627+ (and (match_test "TARGET_32BIT")
628+ (match_operand 0 "arm_di_operand")))) 628+ (match_operand 0 "arm_di_operand"))))
629 629+
630 630Index: gcc-4.5.3/gcc/testsuite/gcc.c-torture/execute/20100416-1.c
631=== added file 'gcc/testsuite/gcc.c-torture/execute/20100416-1.c' 631===================================================================
632--- old/gcc/testsuite/gcc.c-torture/execute/20100416-1.c 1970-01-01 00:00:00 +0000 632--- /dev/null
633+++ new/gcc/testsuite/gcc.c-torture/execute/20100416-1.c 2010-07-29 16:58:56 +0000 633+++ gcc-4.5.3/gcc/testsuite/gcc.c-torture/execute/20100416-1.c
634@@ -0,0 +1,40 @@ 634@@ -0,0 +1,40 @@
635+void abort(void); 635+void abort(void);
636+ 636+
@@ -672,4 +672,3 @@
672+ } 672+ }
673+ return 0; 673+ return 0;
674+} 674+}
675
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99481.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99481.patch
deleted file mode 100644
index db53255de..000000000
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99481.patch
+++ /dev/null
@@ -1,40 +0,0 @@
1 2011-02-02 Richard Sandiford <richard.sandiford@linaro.org>
2
3 gcc/testsuite/
4 PR target/47553
5 * gcc.target/arm/neon-vld-1.c: New test.
6 gcc/
7 PR target/47553
8 * config/arm/predicates.md (neon_lane_number): Accept 0..15.
9
10=== modified file 'gcc/config/arm/predicates.md'
11--- old/gcc/config/arm/predicates.md 2011-02-08 12:07:29 +0000
12+++ new/gcc/config/arm/predicates.md 2011-03-02 12:28:41 +0000
13@@ -607,7 +607,7 @@
14 ;; TODO: We could check lane numbers more precisely based on the mode.
15 (define_predicate "neon_lane_number"
16 (and (match_code "const_int")
17- (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7")))
18+ (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 15")))
19 ;; Predicates for named expanders that overlap multiple ISAs.
20
21 (define_predicate "cmpdi_operand"
22
23=== added file 'gcc/testsuite/gcc.target/arm/neon-vld-1.c'
24--- old/gcc/testsuite/gcc.target/arm/neon-vld-1.c 1970-01-01 00:00:00 +0000
25+++ new/gcc/testsuite/gcc.target/arm/neon-vld-1.c 2011-02-02 13:57:54 +0000
26@@ -0,0 +1,13 @@
27+/* { dg-do compile } */
28+/* { dg-require-effective-target arm_neon_ok } */
29+/* { dg-options "-O1" } */
30+/* { dg-add-options arm_neon } */
31+
32+#include <arm_neon.h>
33+
34+uint8x16_t
35+foo (uint8_t *a, uint8x16_t b)
36+{
37+ vst1q_lane_u8 (a, b, 14);
38+ return vld1q_lane_u8 (a + 0x100, b, 15);
39+}
40
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99482.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99482.patch
deleted file mode 100644
index 334ac4ec1..000000000
--- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99482.patch
+++ /dev/null
@@ -1,84 +0,0 @@
1 2011-02-02 Richard Sandiford <richard.sandiford@linaro.org>
2
3 gcc/
4 Backport from mainline:
5
6 2011-01-23 Bernd Schmidt <bernds@codesourcery.com>
7 Richard Sandiford <rdsandiford@googlemail.com>
8
9 PR rtl-optimization/47166
10 * reload1.c (emit_reload_insns): Disable the spill_reg_store
11 mechanism for PRE_MODIFY and POST_MODIFY.
12 (inc_for_reload): For PRE_MODIFY, return the insn that sets the
13 reloadreg.
14
15 gcc/testsuite/
16 * gcc.c-torture/execute/postmod-1.c: New test.
17
18=== added file 'gcc/testsuite/gcc.c-torture/execute/postmod-1.c'
19--- old/gcc/testsuite/gcc.c-torture/execute/postmod-1.c 1970-01-01 00:00:00 +0000
20+++ new/gcc/testsuite/gcc.c-torture/execute/postmod-1.c 2011-02-02 14:23:10 +0000
21@@ -0,0 +1,62 @@
22+#define DECLARE_ARRAY(A) array##A[0x10]
23+#define DECLARE_COUNTER(A) counter##A = 0
24+#define DECLARE_POINTER(A) *pointer##A = array##A + x
25+/* Create a loop that allows post-modification of pointerA, followed by
26+ a use of the post-modified address. */
27+#define BEFORE(A) counter##A += *pointer##A, pointer##A += 3
28+#define AFTER(A) counter##A += pointer##A[x]
29+
30+/* Set up the arrays so that one iteration of the loop sets the counter
31+ to 3.0f. */
32+#define INIT_ARRAY(A) array##A[1] = 1.0f, array##A[5] = 2.0f
33+
34+/* Check that the loop worked correctly for all values. */
35+#define CHECK_ARRAY(A) exit_code |= (counter##A != 3.0f)
36+
37+/* Having 6 copies triggered the bug for ARM and Thumb. */
38+#define MANY(A) A (0), A (1), A (2), A (3), A (4), A (5)
39+
40+/* Each addendA should be allocated a register. */
41+#define INIT_VOLATILE(A) addend##A = vol
42+#define ADD_VOLATILE(A) vol += addend##A
43+
44+/* Having 5 copies triggered the bug for ARM and Thumb. */
45+#define MANY2(A) A (0), A (1), A (2), A (3), A (4)
46+
47+float MANY (DECLARE_ARRAY);
48+float MANY (DECLARE_COUNTER);
49+
50+volatile int stop = 1;
51+volatile int vol;
52+
53+void __attribute__((noinline))
54+foo (int x)
55+{
56+ float MANY (DECLARE_POINTER);
57+ int i;
58+
59+ do
60+ {
61+ MANY (BEFORE);
62+ MANY (AFTER);
63+ /* Create an inner loop that should ensure the code above
64+ has registers free for reload inheritance. */
65+ {
66+ int MANY2 (INIT_VOLATILE);
67+ for (i = 0; i < 10; i++)
68+ MANY2 (ADD_VOLATILE);
69+ }
70+ }
71+ while (!stop);
72+}
73+
74+int
75+main (void)
76+{
77+ int exit_code = 0;
78+
79+ MANY (INIT_ARRAY);
80+ foo (1);
81+ MANY (CHECK_ARRAY);
82+ return exit_code;
83+}
84
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
new file mode 100644
index 000000000..a2d6c6a69
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99491.patch
@@ -0,0 +1,309 @@
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-r99494.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99494.patch
new file mode 100644
index 000000000..56897e984
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99494.patch
@@ -0,0 +1,1272 @@
12011-04-09 Andrew Stubbs <ams@codesourcery.com>
2
3 Backport from mainline:
4
5 Maxim Kuvyrkov <maxim@codesourcery.com>
6
7 * config.sub: Recognize *-linux-android*.
8
9 2010-05-27 Maxim Kuvyrkov <maxim@codesourcery.com>
10
11 Add support for Bionic C library
12 gcc/
13 * config.gcc (LIBC_GLIBC, LIBC_BIONIC, LIBC_UCLIBC): New tm_define
14 macro.
15 (DEFAULT_LIBC): New tm_define macro set to one of LIBC_*.
16 (bfin*-uclinux, moxie-*-uclinux*, m68k-*-uclinux*): Update.
17
18 * config/linux.h (OPTION_GLIBC, OPTION_UCLIBC, OPTION_BIONIC): Define.
19 (LINUX_TARGET_OS_CPP_BUILTINS): Define __gnu_linux__ only for GLIBC.
20 (CHOOSE_DYNAMIC_LINKER1, CHOOSE_DYNAMIC_LINKER): Make it easier
21 to support multiple C libraries. Handle Bionic.
22 (BIONIC_DYNAMIC_LINKER, BIONIC_DYNAMIC_LINKER32,)
23 (BIONIC_DYNAMIC_LINKER64): Define.
24 (LINUX_DYNAMIC_LINKER, LINUX_DYNAMIC_LINKER32, LINUX_DYNAMIC_LINKER64):
25 Update.
26 (TARGET_HAS_SINCOS): Enable for Bionic.
27
28 * config/linux.opt: Rewrite to handle more than 2 C libraries. Make
29 the last option specified on command line take effect.
30 (linux_uclibc): Rename to linux_libc, initialize using DEFAULT_LIBC.
31 (mbionic): New.
32 (mglibc, muclibc): Update.
33
34 * config/alpha/linux-elf.h, config/rs6000/linux64.h,
35 * config/rs6000/sysv4.h (CHOOSE_DYNAMIC_LINKER): Update to use
36 DEFAULT_LIBC.
37
38 * doc/invoke.texi (-mglibc, -muclibc): Update.
39 (-mbionic): Document.
40
41 gcc/testsuite/
42 * gcc.dg/glibc-uclibc-1.c, gcc.dg/glibc-uclibc-2.c: Remove, no longer
43 necessary.
44
45 2010-05-27 Maxim Kuvyrkov <maxim@codesourcery.com>
46
47 Support compilation for Android platform. Reimplement -mandroid.
48 gcc/
49 * config.gcc (*linux*): Include linux-android.h and linux-android.opt.
50 (*android*): Set ANDROID_DEFAULT.
51 (arm*-*-linux*): Include linux-android.h.
52 (arm*-*-eabi*): Don't include previous -mandroid implementation.
53 * config/arm/eabi.h: Remove, move Android-specific parts ...
54 * config/linux-android.h: ... here. New file.
55 * config/arm/eabi.opt: Rename to ...
56 * config/linux-android.opt: ... this.
57 (mandroid): Allow -mno-android option. Initialize based on
58 ANDROID_DEFAULT.
59 * config/linux.h (STARTFILE_SPEC, ENDFILE_SPEC, CC1_SPEC, LIB_SPEC):
60 Move logic to corresponding LINUX_TARGET_* macros.
61 (TARGET_OS_CPP_BUILTINS): Define __ANDROID__, when appropriate.
62 * config/linux-eabi.h (LINK_SPEC, CC1_SPEC, CC1PLUS_SPEC, LIB_SPEC,)
63 (STARTFILE_SPEC, ENDFILE_SPEC): Define to choose between Linux and
64 Android definitions.
65 (LINUX_TARGET_OS_CPP_BUILTINS): Define __ANDROID__ if TARGET_ANDROID.
66 * doc/invoke.texi (-mandroid, -tno-android-cc, -tno-android-ld):
67 Document.
68
69 2010-06-01 Maxim Kuvyrkov <maxim@codesourcery.com>
70
71 gcc/
72 * config/arm/t-linux-androideabi: New.
73 * config.gcc (arm*-*-linux-androideabi): Include multilib configuration.
74
75 2010-05-27 Maxim Kuvyrkov <maxim@codesourcery.com>
76
77 gcc/
78 * gthr-posix.h (pthread_cancel): Don't declare if compiling against
79 Bionic C library.
80 (__gthread_active_p): Check for pthread_create if compiling against
81 Bionic C library.
82
83 2010-06-01 Maxim Kuvyrkov <maxim@codesourcery.com>
84
85 libstdc++-v3/
86 * acinclude.m4: Support Bionic C library.
87 Explicitly specify -fexceptions for exception check.
88 * configure.host: Support Bionic C library.
89 * configure: Regenerate.
90 * config/os/bionic/ctype_base.h, config/os/bionic/ctype_inline.h,
91 * config/os/bionic/ctype_noincline.h, config/os/bionic/os_defines.h:
92 New files, based on config/os/newlib/*.
93
94=== modified file 'config.sub'
95Index: gcc-4.5.3/config.sub
96===================================================================
97--- gcc-4.5.3.orig/config.sub
98+++ gcc-4.5.3/config.sub
99@@ -4,7 +4,7 @@
100 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
101 # Free Software Foundation, Inc.
102
103-timestamp='2010-03-22'
104+timestamp='2010-04-23'
105
106 # This file is (in principle) common to ALL GNU software.
107 # The presence of a machine in this file suggests that SOME GNU software
108@@ -124,8 +124,9 @@ esac
109 # Here we must recognize all the valid KERNEL-OS combinations.
110 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
111 case $maybe_os in
112- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
113- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
114+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
115+ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
116+ knetbsd*-gnu* | netbsd*-gnu* | \
117 kopensolaris*-gnu* | \
118 storm-chaos* | os2-emx* | rtmk-nova*)
119 os=-$maybe_os
120@@ -1307,7 +1308,8 @@ case $os in
121 | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
122 | -chorusos* | -chorusrdb* | -cegcc* \
123 | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
124- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
125+ | -mingw32* | -linux-gnu* | -linux-android* \
126+ | -linux-newlib* | -linux-uclibc* \
127 | -uxpv* | -beos* | -mpeix* | -udk* \
128 | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
129 | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
130Index: gcc-4.5.3/gcc/config.gcc
131===================================================================
132--- gcc-4.5.3.orig/gcc/config.gcc
133+++ gcc-4.5.3/gcc/config.gcc
134@@ -513,26 +513,48 @@ case ${target} in
135 *-*-gnu*)
136 tmake_file="$tmake_file t-gnu";;
137 esac
138- # glibc / uclibc switch. uclibc isn't usable for GNU/Hurd and neither for
139- # GNU/k*BSD.
140+ # Common C libraries.
141+ tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3"
142+ # glibc / uclibc / bionic switch.
143+ # uclibc and bionic aren't usable for GNU/Hurd and neither for GNU/k*BSD.
144 case $target in
145 *linux*)
146 extra_options="$extra_options linux.opt";;
147 *)
148 tm_defines="$tm_defines OPTION_GLIBC=1";;
149 esac
150- case ${target} in
151+ case $target in
152+ *-*-*android*)
153+ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC"
154+ ;;
155 *-*-*uclibc*)
156- tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
157+ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
158 ;;
159 *)
160- tm_defines="${tm_defines} UCLIBC_DEFAULT=0"
161+ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC"
162 ;;
163 esac
164- # Assume that glibc or uClibc are being used and so __cxa_atexit is provided.
165+ # Assume that glibc or uClibc or Bionic are being used and so __cxa_atexit
166+ # is provided.
167 default_use_cxa_atexit=yes
168 use_gcc_tgmath=no
169 use_gcc_stdint=wrap
170+ # Add Android userspace support to Linux targets.
171+ case $target in
172+ *linux*)
173+ tm_file="$tm_file linux-android.h"
174+ extra_options="$extra_options linux-android.opt"
175+ ;;
176+ esac
177+ # Enable compilation for Android by default for *android* targets.
178+ case $target in
179+ *-*-*android*)
180+ tm_defines="$tm_defines ANDROID_DEFAULT=1"
181+ ;;
182+ *)
183+ tm_defines="$tm_defines ANDROID_DEFAULT=0"
184+ ;;
185+ esac
186 ;;
187 *-*-netbsd*)
188 tmake_file="t-slibgcc-elf-ver t-libc-ok t-netbsd t-libgcc-pic"
189@@ -728,7 +750,7 @@ arm*-*-netbsd*)
190 use_collect2=yes
191 ;;
192 arm*-*-linux*) # ARM GNU/Linux with ELF
193- tm_file="dbxelf.h elfos.h linux.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
194+ tm_file="dbxelf.h elfos.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
195 case $target in
196 arm*b-*)
197 tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
198@@ -739,6 +761,12 @@ arm*-*-linux*) # ARM GNU/Linux with EL
199 arm*-*-linux-*eabi)
200 tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h"
201 tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
202+ # Define multilib configuration for arm-linux-androideabi.
203+ case ${target} in
204+ *-androideabi)
205+ tmake_file="$tmake_file arm/t-linux-androideabi"
206+ ;;
207+ esac
208 # The BPABI long long divmod functions return a 128-bit value in
209 # registers r0-r3. Correctly modeling that requires the use of
210 # TImode.
211@@ -785,9 +813,8 @@ arm*-*-eabi* | arm*-*-symbianelf* )
212 tmake_file="arm/t-arm arm/t-arm-elf"
213 case ${target} in
214 arm*-*-eabi*)
215- tm_file="$tm_file arm/eabi.h newlib-stdint.h"
216+ tm_file="$tm_file newlib-stdint.h"
217 tmake_file="${tmake_file} arm/t-bpabi"
218- extra_options="${extra_options} arm/eabi.opt"
219 use_gcc_stdint=wrap
220 ;;
221 arm*-*-symbianelf*)
222@@ -843,7 +870,7 @@ bfin*-elf*)
223 bfin*-uclinux*)
224 tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h glibc-stdint.h bfin/uclinux.h"
225 tmake_file=bfin/t-bfin-uclinux
226- tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
227+ tm_defines="${tm_defines} DEFAULT_LIBC=LIBC_UCLIBC"
228 extra_options="${extra_options} linux.opt"
229 use_collect2=no
230 ;;
231@@ -924,7 +951,7 @@ moxie-*-uclinux*)
232 tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h glibc-stdint.h moxie/uclinux.h"
233 extra_parts="crti.o crtn.o crtbegin.o crtend.o"
234 tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp"
235- tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
236+ tm_defines="${tm_defines} DEFAULT_LIBC=LIBC_UCLIBC"
237 extra_options="${extra_options} linux.opt"
238 ;;
239 h8300-*-rtems*)
240@@ -1644,7 +1671,7 @@ m68k-*-uclinux*) # Motorola m68k/ColdFi
241 default_m68k_cpu=68020
242 default_cf_cpu=5206
243 tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h glibc-stdint.h flat.h m68k/linux.h m68k/uclinux.h ./sysroot-suffix.h"
244- tm_defines="${tm_defines} MOTOROLA=1 UCLIBC_DEFAULT=1"
245+ tm_defines="${tm_defines} MOTOROLA=1 DEFAULT_LIBC=LIBC_UCLIBC"
246 extra_options="${extra_options} linux.opt"
247 tmake_file="m68k/t-floatlib m68k/t-uclinux m68k/t-mlibs"
248 ;;
249Index: gcc-4.5.3/gcc/config/alpha/linux-elf.h
250===================================================================
251--- gcc-4.5.3.orig/gcc/config/alpha/linux-elf.h
252+++ gcc-4.5.3/gcc/config/alpha/linux-elf.h
253@@ -29,10 +29,12 @@ along with GCC; see the file COPYING3.
254
255 #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
256 #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
257-#if UCLIBC_DEFAULT
258-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
259+#if DEFAULT_LIBC == LIBC_UCLIBC
260+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
261+#elif DEFAULT_LIBC == LIBC_GLIBC
262+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
263 #else
264-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
265+#error "Unsupported DEFAULT_LIBC"
266 #endif
267 #define LINUX_DYNAMIC_LINKER \
268 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
269Index: gcc-4.5.3/gcc/config/arm/eabi.h
270===================================================================
271--- gcc-4.5.3.orig/gcc/config/arm/eabi.h
272+++ /dev/null
273@@ -1,125 +0,0 @@
274-/* Configuration file for ARM EABI targets.
275- Copyright (C) 2008
276- Free Software Foundation, Inc.
277- Contributed by Doug Kwan (dougkwan@google.com)
278-
279- This file is part of GCC.
280-
281- GCC is free software; you can redistribute it and/or modify it
282- under the terms of the GNU General Public License as published
283- by the Free Software Foundation; either version 3, or (at your
284- option) any later version.
285-
286- GCC is distributed in the hope that it will be useful, but WITHOUT
287- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
288- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
289- License for more details.
290-
291- You should have received a copy of the GNU General Public License
292- along with GCC; see the file COPYING3. If not see
293- <http://www.gnu.org/licenses/>. */
294-
295-/* This file contains macro overrides for EABI targets. */
296-
297-#undef TARGET_OS_CPP_BUILTINS
298-#define TARGET_OS_CPP_BUILTINS() \
299- do \
300- { \
301- TARGET_BPABI_CPP_BUILTINS (); \
302- if (TARGET_ANDROID) \
303- builtin_define ("__ANDROID__"); \
304- } \
305- while (false)
306-
307-#undef SUBSUBTARGET_EXTRA_SPECS
308-#define SUBSUBTARGET_EXTRA_SPECS \
309- { "link_android", ANDROID_LINK_SPEC }, \
310- { "link_default", BPABI_LINK_SPEC }, \
311- { "cc1_android", ANDROID_CC1_SPEC }, \
312- { "cc1_default", CC1_DEFAULT_SPEC }, \
313- { "cc1plus_android", ANDROID_CC1PLUS_SPEC }, \
314- { "cc1plus_default", CC1PLUS_DEFAULT_SPEC }, \
315- { "lib_android", ANDROID_LIB_SPEC }, \
316- { "lib_default", LIB_DEFAULT_SPEC }, \
317- { "startfile_android", ANDROID_STARTFILE_SPEC }, \
318- { "startfile_default", UNKNOWN_ELF_STARTFILE_SPEC }, \
319- { "endfile_android", ANDROID_ENDFILE_SPEC }, \
320- { "endfile_default", UNKNOWN_ELF_ENDFILE_SPEC }, \
321-
322-#undef ANDROID_LINK_SPEC
323-#define ANDROID_LINK_SPEC \
324-"%{mbig-endian:-EB} %{mlittle-endian:-EL} " \
325-"%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} " \
326-"%{!static:" \
327- "%{shared: -Bsymbolic} " \
328- "%{!shared:" \
329- "%{rdynamic:-export-dynamic} " \
330- "%{!dynamic-linker:-dynamic-linker /system/bin/linker}}} " \
331-"-X" SUBTARGET_EXTRA_LINK_SPEC
332-
333-/* Override LINK_SPEC in bpabi.h. */
334-#undef LINK_SPEC
335-#define LINK_SPEC \
336-"%{mandroid: %(link_android) ;" \
337-" : %(link_default)}"
338-
339-/* Android uses -fno-exceptions by default. */
340-#undef ANDROID_CC1_SPEC
341-#define ANDROID_CC1_SPEC "%{!fexceptions:-fno-exceptions}"
342-
343-/* Default CC1_SPEC as in arm.h. */
344-#undef CC1_DEFAULT_SPEC
345-#define CC1_DEFAULT_SPEC ""
346-
347-#undef CC1_SPEC
348-#define CC1_SPEC \
349-"%{mandroid: %(cc1_android) ;" \
350-" : %(cc1_default)}"
351-
352-/* Android uses -fno-rtti by default. */
353-#undef ANDROID_CC1PLUS_SPEC
354-#define ANDROID_CC1PLUS_SPEC "%{!frtti:-fno-rtti}"
355-
356-/* Default CC1PLUS_SPEC as in gcc.c. */
357-#undef CC1PLUS_DEFAULT_SPEC
358-#define CC1PLUS_DEFAULT_SPEC ""
359-
360-#undef CC1PLUS_SPEC
361-#define CC1PLUS_SPEC \
362-"%{mandroid: %(cc1plus_android) ;" \
363-" : %(cc1plus_default)}"
364-
365-#undef ANDROID_LIB_SPEC
366-#define ANDROID_LIB_SPEC "-lc %{!static:-ldl}"
367-
368-/* Default LIB_SPEC as in gcc.c. */
369-#undef LIB_DEFAULT_SPEC
370-#define LIB_DEFAULT_SPEC \
371-"%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
372-
373-#undef LIB_SPEC
374-#define LIB_SPEC \
375-"%{mandroid: %(lib_android) ;" \
376-" : %(lib_default)}"
377-
378-#undef ANDROID_STARTFILE_SPEC
379-#define ANDROID_STARTFILE_SPEC \
380-"%{!shared:" \
381- "%{static: crtbegin_static%O%s ;" \
382- " : crtbegin_dynamic%O%s}}"
383-
384-/* Override STARTFILE_SPEC in unknown-elf.h. */
385-#undef STARTFILE_SPEC
386-#define STARTFILE_SPEC \
387-"%{mandroid: %(startfile_android) ;" \
388-" : %(startfile_default)}"
389-
390-#undef ANDROID_ENDFILE_SPEC
391-#define ANDROID_ENDFILE_SPEC "%{!shared:crtend_android%O%s}"
392-
393-/* Override ENDFILE_SPEC in unknown-elf.h. */
394-#undef ENDFILE_SPEC
395-#define ENDFILE_SPEC \
396-"%{mandroid: %(endfile_android) ;" \
397-" : %(endfile_default)}"
398-
399Index: gcc-4.5.3/gcc/config/arm/eabi.opt
400===================================================================
401--- gcc-4.5.3.orig/gcc/config/arm/eabi.opt
402+++ /dev/null
403@@ -1,23 +0,0 @@
404-; EABI specific options for ARM port of the compiler.
405-
406-; Copyright (C) 2008 Free Software Foundation, Inc.
407-;
408-; This file is part of GCC.
409-;
410-; GCC is free software; you can redistribute it and/or modify it under
411-; the terms of the GNU General Public License as published by the Free
412-; Software Foundation; either version 3, or (at your option) any later
413-; version.
414-;
415-; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
416-; WARRANTY; without even the implied warranty of MERCHANTABILITY or
417-; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
418-; for more details.
419-;
420-; You should have received a copy of the GNU General Public License
421-; along with GCC; see the file COPYING3. If not see
422-; <http://www.gnu.org/licenses/>.
423-
424-mandroid
425-Target Report RejectNegative Mask(ANDROID)
426-Generate code for the Android operating system.
427Index: gcc-4.5.3/gcc/config/arm/linux-eabi.h
428===================================================================
429--- gcc-4.5.3.orig/gcc/config/arm/linux-eabi.h
430+++ gcc-4.5.3/gcc/config/arm/linux-eabi.h
431@@ -70,7 +70,30 @@
432 /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
433 use the GNU/Linux version, not the generic BPABI version. */
434 #undef LINK_SPEC
435-#define LINK_SPEC LINUX_TARGET_LINK_SPEC BE8_LINK_SPEC TARGET_FIX_V4BX_SPEC
436+#define LINK_SPEC BE8_LINK_SPEC TARGET_FIX_V4BX_SPEC \
437+ LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
438+ LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
439+
440+#undef CC1_SPEC
441+#define CC1_SPEC \
442+ LINUX_OR_ANDROID_CC (LINUX_TARGET_CC1_SPEC, \
443+ LINUX_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
444+
445+#define CC1PLUS_SPEC \
446+ LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
447+
448+#undef LIB_SPEC
449+#define LIB_SPEC \
450+ LINUX_OR_ANDROID_LD (LINUX_TARGET_LIB_SPEC, \
451+ LINUX_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
452+
453+#undef STARTFILE_SPEC
454+#define STARTFILE_SPEC \
455+ LINUX_OR_ANDROID_LD (LINUX_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
456+
457+#undef ENDFILE_SPEC
458+#define ENDFILE_SPEC \
459+ LINUX_OR_ANDROID_LD (LINUX_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
460
461 /* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we
462 do not use -lfloat. */
463Index: gcc-4.5.3/gcc/config/arm/t-linux-androideabi
464===================================================================
465--- /dev/null
466+++ gcc-4.5.3/gcc/config/arm/t-linux-androideabi
467@@ -0,0 +1,10 @@
468+MULTILIB_OPTIONS = march=armv7-a mthumb
469+MULTILIB_DIRNAMES = armv7-a thumb
470+MULTILIB_EXCEPTIONS =
471+MULTILIB_MATCHES =
472+MULTILIB_OSDIRNAMES =
473+
474+# The "special" multilib can be used to build native applications for Android,
475+# as opposed to native shared libraries that are then called via JNI.
476+#MULTILIB_OPTIONS += tno-android-cc
477+#MULTILIB_DIRNAMES += special
478Index: gcc-4.5.3/gcc/config/linux-android.h
479===================================================================
480--- /dev/null
481+++ gcc-4.5.3/gcc/config/linux-android.h
482@@ -0,0 +1,53 @@
483+/* Configuration file for Linux Android targets.
484+ Copyright (C) 2010
485+ Free Software Foundation, Inc.
486+ Contributed by CodeSourcery, Inc.
487+
488+ This file is part of GCC.
489+
490+ GCC is free software; you can redistribute it and/or modify it
491+ under the terms of the GNU General Public License as published
492+ by the Free Software Foundation; either version 3, or (at your
493+ option) any later version.
494+
495+ GCC is distributed in the hope that it will be useful, but WITHOUT
496+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
497+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
498+ License for more details.
499+
500+ You should have received a copy of the GNU General Public License
501+ along with GCC; see the file COPYING3. If not see
502+ <http://www.gnu.org/licenses/>. */
503+
504+#if ANDROID_DEFAULT
505+# define NOANDROID "mno-android"
506+#else
507+# define NOANDROID "!mandroid"
508+#endif
509+
510+#define LINUX_OR_ANDROID_CC(LINUX_SPEC, ANDROID_SPEC) \
511+ "%{" NOANDROID "|tno-android-cc:" LINUX_SPEC ";:" ANDROID_SPEC "}"
512+
513+#define LINUX_OR_ANDROID_LD(LINUX_SPEC, ANDROID_SPEC) \
514+ "%{" NOANDROID "|tno-android-ld:" LINUX_SPEC ";:" ANDROID_SPEC "}"
515+
516+#define ANDROID_LINK_SPEC \
517+ "%{shared: -Bsymbolic}"
518+
519+#define ANDROID_CC1_SPEC \
520+ "%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} " \
521+ "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}"
522+
523+#define ANDROID_CC1PLUS_SPEC \
524+ "%{!fexceptions:%{!fno-exceptions: -fno-exceptions}} " \
525+ "%{!frtti:%{!fno-rtti: -fno-rtti}}"
526+
527+#define ANDROID_LIB_SPEC \
528+ "%{!static: -ldl}"
529+
530+#define ANDROID_STARTFILE_SPEC \
531+ "%{!shared:" \
532+ " %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}"
533+
534+#define ANDROID_ENDFILE_SPEC \
535+ "%{!shared: crtend_android%O%s}"
536Index: gcc-4.5.3/gcc/config/linux-android.opt
537===================================================================
538--- /dev/null
539+++ gcc-4.5.3/gcc/config/linux-android.opt
540@@ -0,0 +1,23 @@
541+; Android specific options.
542+
543+; Copyright (C) 2010 Free Software Foundation, Inc.
544+;
545+; This file is part of GCC.
546+;
547+; GCC is free software; you can redistribute it and/or modify it under
548+; the terms of the GNU General Public License as published by the Free
549+; Software Foundation; either version 3, or (at your option) any later
550+; version.
551+;
552+; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
553+; WARRANTY; without even the implied warranty of MERCHANTABILITY or
554+; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
555+; for more details.
556+;
557+; You should have received a copy of the GNU General Public License
558+; along with GCC; see the file COPYING3. If not see
559+; <http://www.gnu.org/licenses/>.
560+
561+mandroid
562+Target Report Mask(ANDROID) Var(flag_android) Init(ANDROID_DEFAULT ? OPTION_MASK_ANDROID : 0)
563+Generate code for the Android platform.
564Index: gcc-4.5.3/gcc/config/linux.h
565===================================================================
566--- gcc-4.5.3.orig/gcc/config/linux.h
567+++ gcc-4.5.3/gcc/config/linux.h
568@@ -1,6 +1,6 @@
569 /* Definitions for Linux-based GNU systems with ELF format
570 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2006,
571- 2007, 2009 Free Software Foundation, Inc.
572+ 2007, 2009, 2010 Free Software Foundation, Inc.
573 Contributed by Eric Youngdale.
574 Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
575
576@@ -42,16 +42,17 @@ see the files COPYING3 and COPYING.RUNTI
577 provides part of the support for getting C++ file-scope static
578 object constructed before entering `main'. */
579
580-#undef STARTFILE_SPEC
581 #if defined HAVE_LD_PIE
582-#define STARTFILE_SPEC \
583+#define LINUX_TARGET_STARTFILE_SPEC \
584 "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
585 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
586 #else
587-#define STARTFILE_SPEC \
588+#define LINUX_TARGET_STARTFILE_SPEC \
589 "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
590 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
591 #endif
592+#undef STARTFILE_SPEC
593+#define STARTFILE_SPEC LINUX_TARGET_STARTFILE_SPEC
594
595 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on
596 the GNU/Linux magical crtend.o file (see crtstuff.c) which
597@@ -59,33 +60,44 @@ see the files COPYING3 and COPYING.RUNTI
598 object constructed before entering `main', followed by a normal
599 GNU/Linux "finalizer" file, `crtn.o'. */
600
601-#undef ENDFILE_SPEC
602-#define ENDFILE_SPEC \
603+#define LINUX_TARGET_ENDFILE_SPEC \
604 "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
605+#undef ENDFILE_SPEC
606+#define ENDFILE_SPEC LINUX_TARGET_ENDFILE_SPEC
607
608 /* This is for -profile to use -lc_p instead of -lc. */
609+#define LINUX_TARGET_CC1_SPEC "%{profile:-p}"
610 #ifndef CC1_SPEC
611-#define CC1_SPEC "%{profile:-p}"
612+#define CC1_SPEC LINUX_TARGET_CC1_SPEC
613 #endif
614
615 /* The GNU C++ standard library requires that these macros be defined. */
616 #undef CPLUSPLUS_CPP_SPEC
617 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
618
619-#undef LIB_SPEC
620-#define LIB_SPEC \
621+#define LINUX_TARGET_LIB_SPEC \
622 "%{pthread:-lpthread} \
623 %{shared:-lc} \
624 %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
625+#undef LIB_SPEC
626+#define LIB_SPEC LINUX_TARGET_LIB_SPEC
627+
628+/* C libraries supported on Linux. */
629+#define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
630+#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
631+#define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
632
633 #define LINUX_TARGET_OS_CPP_BUILTINS() \
634 do { \
635- builtin_define ("__gnu_linux__"); \
636+ if (OPTION_GLIBC) \
637+ builtin_define ("__gnu_linux__"); \
638 builtin_define_std ("linux"); \
639 builtin_define_std ("unix"); \
640 builtin_assert ("system=linux"); \
641 builtin_assert ("system=unix"); \
642 builtin_assert ("system=posix"); \
643+ if (OPTION_ANDROID) \
644+ builtin_define ("__ANDROID__"); \
645 } while (0)
646
647 #if defined(HAVE_LD_EH_FRAME_HDR)
648@@ -105,13 +117,24 @@ see the files COPYING3 and COPYING.RUNTI
649 #endif
650
651 /* Determine which dynamic linker to use depending on whether GLIBC or
652- uClibc is the default C library and whether -muclibc or -mglibc has
653- been passed to change the default. */
654-#if UCLIBC_DEFAULT
655-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
656+ uClibc or Bionic is the default C library and whether
657+ -muclibc or -mglibc or -mbionic has been passed to change the default. */
658+
659+#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LD1, LD2, LD3) \
660+ "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:" LD1 "}}"
661+
662+#if DEFAULT_LIBC == LIBC_GLIBC
663+#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
664+ CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", G, U, B)
665+#elif DEFAULT_LIBC == LIBC_UCLIBC
666+#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
667+ CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", U, G, B)
668+#elif DEFAULT_LIBC == LIBC_BIONIC
669+#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
670+ CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", B, G, U)
671 #else
672-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
673-#endif
674+#error "Unsupported DEFAULT_LIBC"
675+#endif /* DEFAULT_LIBC */
676
677 /* For most targets the following definitions suffice;
678 GLIBC_DYNAMIC_LINKER must be defined for each target using them, or
679@@ -120,18 +143,25 @@ see the files COPYING3 and COPYING.RUNTI
680 #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
681 #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
682 #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
683-#define LINUX_DYNAMIC_LINKER \
684- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
685-#define LINUX_DYNAMIC_LINKER32 \
686- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32)
687-#define LINUX_DYNAMIC_LINKER64 \
688- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
689+#define BIONIC_DYNAMIC_LINKER "/system/bin/linker"
690+#define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker"
691+#define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64"
692+
693+#define LINUX_DYNAMIC_LINKER \
694+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
695+ BIONIC_DYNAMIC_LINKER)
696+#define LINUX_DYNAMIC_LINKER32 \
697+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
698+ BIONIC_DYNAMIC_LINKER32)
699+#define LINUX_DYNAMIC_LINKER64 \
700+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
701+ BIONIC_DYNAMIC_LINKER64)
702
703 /* Determine whether the entire c99 runtime
704 is present in the runtime library. */
705 #define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
706
707 /* Whether we have sincos that follows the GNU extension. */
708-#define TARGET_HAS_SINCOS (OPTION_GLIBC)
709+#define TARGET_HAS_SINCOS (OPTION_GLIBC | OPTION_BIONIC)
710
711 #define TARGET_POSIX_IO
712Index: gcc-4.5.3/gcc/config/linux.opt
713===================================================================
714--- gcc-4.5.3.orig/gcc/config/linux.opt
715+++ gcc-4.5.3/gcc/config/linux.opt
716@@ -1,6 +1,6 @@
717 ; Processor-independent options for GNU/Linux.
718 ;
719-; Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc.
720+; Copyright (C) 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
721 ; Contributed by CodeSourcery.
722 ;
723 ; This file is part of GCC.
724@@ -19,10 +19,14 @@
725 ; along with GCC; see the file COPYING3. If not see
726 ; <http://www.gnu.org/licenses/>.
727
728+mbionic
729+Target Report RejectNegative Var(linux_libc,LIBC_BIONIC) Init(DEFAULT_LIBC) Negative(mglibc)
730+Use Bionic C library
731+
732 mglibc
733-Target RejectNegative Report InverseMask(UCLIBC, GLIBC) Var(linux_uclibc) Init(UCLIBC_DEFAULT ? OPTION_MASK_UCLIBC : 0)
734-Use GNU libc instead of uClibc
735+Target Report RejectNegative Var(linux_libc,LIBC_GLIBC) VarExists Negative(muclibc)
736+Use GNU C library
737
738 muclibc
739-Target RejectNegative Report Mask(UCLIBC) Var(linux_uclibc) VarExists
740-Use uClibc instead of GNU libc
741+Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) VarExists Negative(mbionic)
742+Use uClibc C library
743Index: gcc-4.5.3/gcc/config/rs6000/linux64.h
744===================================================================
745--- gcc-4.5.3.orig/gcc/config/rs6000/linux64.h
746+++ gcc-4.5.3/gcc/config/rs6000/linux64.h
747@@ -344,10 +344,12 @@ extern int dot_symbols;
748 #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1"
749 #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
750 #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
751-#if UCLIBC_DEFAULT
752-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
753+#if DEFAULT_LIBC == LIBC_UCLIBC
754+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
755+#elif DEFAULT_LIBC == LIBC_GLIBC
756+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
757 #else
758-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
759+#error "Unsupported DEFAULT_LIBC"
760 #endif
761 #define LINUX_DYNAMIC_LINKER32 \
762 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32)
763Index: gcc-4.5.3/gcc/config/rs6000/sysv4.h
764===================================================================
765--- gcc-4.5.3.orig/gcc/config/rs6000/sysv4.h
766+++ gcc-4.5.3/gcc/config/rs6000/sysv4.h
767@@ -901,10 +901,12 @@ SVR4_ASM_SPEC \
768
769 #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
770 #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
771-#if UCLIBC_DEFAULT
772-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
773+#if DEFAULT_LIBC == LIBC_UCLIBC
774+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
775+#elif DEFAULT_LIBC == LIBC_GLIBC
776+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
777 #else
778-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
779+#error "Unsupported DEFAULT_LIBC"
780 #endif
781 #define LINUX_DYNAMIC_LINKER \
782 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
783Index: gcc-4.5.3/gcc/doc/invoke.texi
784===================================================================
785--- gcc-4.5.3.orig/gcc/doc/invoke.texi
786+++ gcc-4.5.3/gcc/doc/invoke.texi
787@@ -565,7 +565,8 @@ Objective-C and Objective-C++ Dialects}.
788 -mcpu=@var{cpu}}
789
790 @emph{GNU/Linux Options}
791-@gccoptlist{-muclibc}
792+@gccoptlist{-mglibc -muclibc -mbionic -mandroid @gol
793+-tno-android-cc -tno-android-ld}
794
795 @emph{H8/300 Options}
796 @gccoptlist{-mrelax -mh -ms -mn -mint32 -malign-300}
797@@ -11469,13 +11470,41 @@ These @samp{-m} options are defined for
798 @table @gcctabopt
799 @item -mglibc
800 @opindex mglibc
801-Use the GNU C library instead of uClibc. This is the default except
802-on @samp{*-*-linux-*uclibc*} targets.
803+Use the GNU C library. This is the default except
804+on @samp{*-*-linux-*uclibc*} and @samp{*-*-linux-*android*} targets.
805
806 @item -muclibc
807 @opindex muclibc
808-Use uClibc instead of the GNU C library. This is the default on
809+Use uClibc C library. This is the default on
810 @samp{*-*-linux-*uclibc*} targets.
811+
812+@item -mbionic
813+@opindex mbionic
814+Use Bionic C library. This is the default on
815+@samp{*-*-linux-*android*} targets.
816+
817+@item -mandroid
818+@opindex mandroid
819+Compile code compatible with Android platform. This is the default on
820+@samp{*-*-linux-*android*} targets.
821+
822+When compiling, this option enables @option{-mbionic}, @option{-fPIC},
823+@option{-fno-exceptions} and @option{-fno-rtti} by default. When linking,
824+this option makes the GCC driver pass Android-specific options to the linker.
825+Finally, this option causes the preprocessor macro @code{__ANDROID__}
826+to be defined.
827+
828+@item -tno-android-cc
829+@opindex tno-android-cc
830+Disable compilation effects of @option{-mandroid}, i.e., do not enable
831+@option{-mbionic}, @option{-fPIC}, @option{-fno-exceptions} and
832+@option{-fno-rtti} by default.
833+
834+@item -tno-android-ld
835+@opindex tno-android-ld
836+Disable linking effects of @option{-mandroid}, i.e., pass standard Linux
837+linking options to the linker.
838+
839 @end table
840
841 @node H8/300 Options
842Index: gcc-4.5.3/gcc/gthr-posix.h
843===================================================================
844--- gcc-4.5.3.orig/gcc/gthr-posix.h
845+++ gcc-4.5.3/gcc/gthr-posix.h
846@@ -124,7 +124,9 @@ __gthrw(pthread_join)
847 __gthrw(pthread_equal)
848 __gthrw(pthread_self)
849 __gthrw(pthread_detach)
850+#ifndef __BIONIC__
851 __gthrw(pthread_cancel)
852+#endif
853 __gthrw(sched_yield)
854
855 __gthrw(pthread_mutex_lock)
856@@ -238,7 +240,15 @@ static inline int
857 __gthread_active_p (void)
858 {
859 static void *const __gthread_active_ptr
860- = __extension__ (void *) &__gthrw_(pthread_cancel);
861+ = __extension__ (void *) &__gthrw_(
862+/* Android's C library does not provide pthread_cancel, check for
863+ `pthread_create' instead. */
864+#ifndef __BIONIC__
865+ pthread_cancel
866+#else
867+ pthread_create
868+#endif
869+ );
870 return __gthread_active_ptr != 0;
871 }
872
873Index: gcc-4.5.3/gcc/testsuite/gcc.dg/glibc-uclibc-1.c
874===================================================================
875--- gcc-4.5.3.orig/gcc/testsuite/gcc.dg/glibc-uclibc-1.c
876+++ /dev/null
877@@ -1,6 +0,0 @@
878-/* Test -mglibc and -muclibc not allowed together. */
879-/* Origin: Joseph Myers <joseph@codesourcery.com> */
880-/* { dg-do link { target *-*-linux* } } */
881-/* { dg-options "-mglibc -muclibc" } */
882-
883-/* { dg-message "-mglibc and -muclibc used together" "" { target *-*-* } 0 } */
884Index: gcc-4.5.3/gcc/testsuite/gcc.dg/glibc-uclibc-2.c
885===================================================================
886--- gcc-4.5.3.orig/gcc/testsuite/gcc.dg/glibc-uclibc-2.c
887+++ /dev/null
888@@ -1,6 +0,0 @@
889-/* Test -mglibc and -muclibc not allowed together. */
890-/* Origin: Joseph Myers <joseph@codesourcery.com> */
891-/* { dg-do link { target *-*-linux* } } */
892-/* { dg-options "-muclibc -mglibc" } */
893-
894-/* { dg-message "-mglibc and -muclibc used together" "" { target *-*-* } 0 } */
895Index: gcc-4.5.3/libstdc++-v3/acinclude.m4
896===================================================================
897--- gcc-4.5.3.orig/libstdc++-v3/acinclude.m4
898+++ gcc-4.5.3/libstdc++-v3/acinclude.m4
899@@ -95,7 +95,7 @@ AC_DEFUN([GLIBCXX_CONFIGURE], [
900 ## (Right now, this only matters for enable_wchar_t, but nothing prevents
901 ## other macros from doing the same. This should be automated.) -pme
902
903- # Check for uClibc since Linux platforms use different configuration
904+ # Check for C library flavor since Linux platforms use different configuration
905 # directories depending on the C library in use.
906 AC_EGREP_CPP([_using_uclibc], [
907 #include <stdio.h>
908@@ -104,6 +104,13 @@ AC_DEFUN([GLIBCXX_CONFIGURE], [
909 #endif
910 ], uclibc=yes, uclibc=no)
911
912+ AC_EGREP_CPP([_using_bionic], [
913+ #include <stdio.h>
914+ #if __BIONIC__
915+ _using_bionic
916+ #endif
917+ ], bionic=yes, bionic=no)
918+
919 # Find platform-specific directories containing configuration info.
920 # Also possibly modify flags used elsewhere, as needed by the platform.
921 GLIBCXX_CHECK_HOST
922@@ -2722,7 +2729,7 @@ void foo()
923 }
924 EOF
925 old_CXXFLAGS="$CXXFLAGS"
926- CXXFLAGS=-S
927+ CXXFLAGS="-S -fexceptions"
928 if AC_TRY_EVAL(ac_compile); then
929 if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
930 enable_sjlj_exceptions=yes
931Index: gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_base.h
932===================================================================
933--- /dev/null
934+++ gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_base.h
935@@ -0,0 +1,57 @@
936+// Locale support -*- C++ -*-
937+
938+// Copyright (C) 2010 Free Software Foundation, Inc.
939+//
940+// This file is part of the GNU ISO C++ Library. This library is free
941+// software; you can redistribute it and/or modify it under the
942+// terms of the GNU General Public License as published by the
943+// Free Software Foundation; either version 3, or (at your option)
944+// any later version.
945+
946+// This library is distributed in the hope that it will be useful,
947+// but WITHOUT ANY WARRANTY; without even the implied warranty of
948+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
949+// GNU General Public License for more details.
950+
951+// Under Section 7 of GPL version 3, you are granted additional
952+// permissions described in the GCC Runtime Library Exception, version
953+// 3.1, as published by the Free Software Foundation.
954+
955+// You should have received a copy of the GNU General Public License and
956+// a copy of the GCC Runtime Library Exception along with this program;
957+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
958+// <http://www.gnu.org/licenses/>.
959+
960+//
961+// ISO C++ 14882: 22.1 Locales
962+//
963+
964+// Information as gleaned from /usr/include/ctype.h, for solaris2.5.1
965+
966+// Support for Solaris 2.5.1
967+
968+_GLIBCXX_BEGIN_NAMESPACE(std)
969+
970+ /// @brief Base class for ctype.
971+ struct ctype_base
972+ {
973+ // Non-standard typedefs.
974+ typedef const int* __to_type;
975+
976+ // NB: Offsets into ctype<char>::_M_table force a particular size
977+ // on the mask type. Because of this, we don't use an enum.
978+ typedef char mask;
979+ static const mask upper = _U;
980+ static const mask lower = _L;
981+ static const mask alpha = _U | _L;
982+ static const mask digit = _N;
983+ static const mask xdigit = _X | _N;
984+ static const mask space = _S;
985+ static const mask print = _P | _U | _L | _N | _B;
986+ static const mask graph = _P | _U | _L | _N;
987+ static const mask cntrl = _C;
988+ static const mask punct = _P;
989+ static const mask alnum = _U | _L | _N;
990+ };
991+
992+_GLIBCXX_END_NAMESPACE
993Index: gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_inline.h
994===================================================================
995--- /dev/null
996+++ gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_inline.h
997@@ -0,0 +1,71 @@
998+// Locale support -*- C++ -*-
999+
1000+// Copyright (C) 2010 Free Software Foundation, Inc.
1001+//
1002+// This file is part of the GNU ISO C++ Library. This library is free
1003+// software; you can redistribute it and/or modify it under the
1004+// terms of the GNU General Public License as published by the
1005+// Free Software Foundation; either version 3, or (at your option)
1006+// any later version.
1007+
1008+// This library is distributed in the hope that it will be useful,
1009+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1010+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1011+// GNU General Public License for more details.
1012+
1013+// Under Section 7 of GPL version 3, you are granted additional
1014+// permissions described in the GCC Runtime Library Exception, version
1015+// 3.1, as published by the Free Software Foundation.
1016+
1017+// You should have received a copy of the GNU General Public License and
1018+// a copy of the GCC Runtime Library Exception along with this program;
1019+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
1020+// <http://www.gnu.org/licenses/>.
1021+
1022+/** @file ctype_inline.h
1023+ * This is an internal header file, included by other library headers.
1024+ * You should not attempt to use it directly.
1025+ */
1026+
1027+//
1028+// ISO C++ 14882: 22.1 Locales
1029+//
1030+
1031+// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
1032+// functions go in ctype.cc
1033+
1034+_GLIBCXX_BEGIN_NAMESPACE(std)
1035+
1036+ bool
1037+ ctype<char>::
1038+ is(mask __m, char __c) const
1039+ { return _M_table[static_cast<unsigned char>(__c)] & __m; }
1040+
1041+ const char*
1042+ ctype<char>::
1043+ is(const char* __low, const char* __high, mask* __vec) const
1044+ {
1045+ while (__low < __high)
1046+ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
1047+ return __high;
1048+ }
1049+
1050+ const char*
1051+ ctype<char>::
1052+ scan_is(mask __m, const char* __low, const char* __high) const
1053+ {
1054+ while (__low < __high && !this->is(__m, *__low))
1055+ ++__low;
1056+ return __low;
1057+ }
1058+
1059+ const char*
1060+ ctype<char>::
1061+ scan_not(mask __m, const char* __low, const char* __high) const
1062+ {
1063+ while (__low < __high && this->is(__m, *__low) != 0)
1064+ ++__low;
1065+ return __low;
1066+ }
1067+
1068+_GLIBCXX_END_NAMESPACE
1069Index: gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_noninline.h
1070===================================================================
1071--- /dev/null
1072+++ gcc-4.5.3/libstdc++-v3/config/os/bionic/ctype_noninline.h
1073@@ -0,0 +1,98 @@
1074+// Locale support -*- C++ -*-
1075+
1076+// Copyright (C) 2010 Free Software Foundation, Inc.
1077+//
1078+// This file is part of the GNU ISO C++ Library. This library is free
1079+// software; you can redistribute it and/or modify it under the
1080+// terms of the GNU General Public License as published by the
1081+// Free Software Foundation; either version 3, or (at your option)
1082+// any later version.
1083+
1084+// This library is distributed in the hope that it will be useful,
1085+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1086+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1087+// GNU General Public License for more details.
1088+
1089+// Under Section 7 of GPL version 3, you are granted additional
1090+// permissions described in the GCC Runtime Library Exception, version
1091+// 3.1, as published by the Free Software Foundation.
1092+
1093+// You should have received a copy of the GNU General Public License and
1094+// a copy of the GCC Runtime Library Exception along with this program;
1095+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
1096+// <http://www.gnu.org/licenses/>.
1097+
1098+/** @file ctype_noninline.h
1099+ * This is an internal header file, included by other library headers.
1100+ * You should not attempt to use it directly.
1101+ */
1102+
1103+//
1104+// ISO C++ 14882: 22.1 Locales
1105+//
1106+
1107+// Information as gleaned from /usr/include/ctype.h
1108+
1109+ const ctype_base::mask*
1110+ ctype<char>::classic_table() throw()
1111+ { return _ctype_ + 1; }
1112+
1113+ ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
1114+ size_t __refs)
1115+ : facet(__refs), _M_del(__table != 0 && __del),
1116+ _M_toupper(NULL), _M_tolower(NULL),
1117+ _M_table(__table ? __table : classic_table())
1118+ {
1119+ memset(_M_widen, 0, sizeof(_M_widen));
1120+ _M_widen_ok = 0;
1121+ memset(_M_narrow, 0, sizeof(_M_narrow));
1122+ _M_narrow_ok = 0;
1123+ }
1124+
1125+ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
1126+ : facet(__refs), _M_del(__table != 0 && __del),
1127+ _M_toupper(NULL), _M_tolower(NULL),
1128+ _M_table(__table ? __table : classic_table())
1129+ {
1130+ memset(_M_widen, 0, sizeof(_M_widen));
1131+ _M_widen_ok = 0;
1132+ memset(_M_narrow, 0, sizeof(_M_narrow));
1133+ _M_narrow_ok = 0;
1134+ }
1135+
1136+ char
1137+ ctype<char>::do_toupper(char __c) const
1138+ {
1139+ int __x = __c;
1140+ return (this->is(ctype_base::lower, __c) ? (__x - 'a' + 'A') : __x);
1141+ }
1142+
1143+ const char*
1144+ ctype<char>::do_toupper(char* __low, const char* __high) const
1145+ {
1146+ while (__low < __high)
1147+ {
1148+ *__low = this->do_toupper(*__low);
1149+ ++__low;
1150+ }
1151+ return __high;
1152+ }
1153+
1154+ char
1155+ ctype<char>::do_tolower(char __c) const
1156+ {
1157+ int __x = __c;
1158+ return (this->is(ctype_base::upper, __c) ? (__x - 'A' + 'a') : __x);
1159+ }
1160+
1161+ const char*
1162+ ctype<char>::do_tolower(char* __low, const char* __high) const
1163+ {
1164+ while (__low < __high)
1165+ {
1166+ *__low = this->do_tolower(*__low);
1167+ ++__low;
1168+ }
1169+ return __high;
1170+ }
1171+
1172Index: gcc-4.5.3/libstdc++-v3/config/os/bionic/os_defines.h
1173===================================================================
1174--- /dev/null
1175+++ gcc-4.5.3/libstdc++-v3/config/os/bionic/os_defines.h
1176@@ -0,0 +1,36 @@
1177+// Specific definitions for Bionic -*- C++ -*-
1178+
1179+// Copyright (C) 2010 Free Software Foundation, Inc.
1180+//
1181+// This file is part of the GNU ISO C++ Library. This library is free
1182+// software; you can redistribute it and/or modify it under the
1183+// terms of the GNU General Public License as published by the
1184+// Free Software Foundation; either version 3, or (at your option)
1185+// any later version.
1186+
1187+// This library is distributed in the hope that it will be useful,
1188+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1189+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1190+// GNU General Public License for more details.
1191+
1192+// Under Section 7 of GPL version 3, you are granted additional
1193+// permissions described in the GCC Runtime Library Exception, version
1194+// 3.1, as published by the Free Software Foundation.
1195+
1196+// You should have received a copy of the GNU General Public License and
1197+// a copy of the GCC Runtime Library Exception along with this program;
1198+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
1199+// <http://www.gnu.org/licenses/>.
1200+
1201+/** @file os_defines.h
1202+ * This is an internal header file, included by other library headers.
1203+ * You should not attempt to use it directly.
1204+ */
1205+
1206+#ifndef _GLIBCXX_OS_DEFINES
1207+#define _GLIBCXX_OS_DEFINES 1
1208+
1209+// System-specific #define, typedefs, corrections, etc, go here. This
1210+// file will come before all others.
1211+
1212+#endif
1213Index: gcc-4.5.3/libstdc++-v3/configure
1214===================================================================
1215--- gcc-4.5.3.orig/libstdc++-v3/configure
1216+++ gcc-4.5.3/libstdc++-v3/configure
1217@@ -5185,7 +5185,7 @@ fi
1218 ## (Right now, this only matters for enable_wchar_t, but nothing prevents
1219 ## other macros from doing the same. This should be automated.) -pme
1220
1221- # Check for uClibc since Linux platforms use different configuration
1222+ # Check for C library flavor since Linux platforms use different configuration
1223 # directories depending on the C library in use.
1224 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
1225 /* end confdefs.h. */
1226@@ -5205,6 +5205,24 @@ fi
1227 rm -f conftest*
1228
1229
1230+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
1231+/* end confdefs.h. */
1232+
1233+ #include <stdio.h>
1234+ #if __BIONIC__
1235+ _using_bionic
1236+ #endif
1237+
1238+_ACEOF
1239+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
1240+ $EGREP "_using_bionic" >/dev/null 2>&1; then :
1241+ bionic=yes
1242+else
1243+ bionic=no
1244+fi
1245+rm -f conftest*
1246+
1247+
1248 # Find platform-specific directories containing configuration info.
1249 # Also possibly modify flags used elsewhere, as needed by the platform.
1250
1251@@ -14897,7 +14915,7 @@ void foo()
1252 }
1253 EOF
1254 old_CXXFLAGS="$CXXFLAGS"
1255- CXXFLAGS=-S
1256+ CXXFLAGS="-S -fexceptions"
1257 if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
1258 (eval $ac_compile) 2>&5
1259 ac_status=$?
1260Index: gcc-4.5.3/libstdc++-v3/configure.host
1261===================================================================
1262--- gcc-4.5.3.orig/libstdc++-v3/configure.host
1263+++ gcc-4.5.3/libstdc++-v3/configure.host
1264@@ -238,6 +238,8 @@ case "${host_os}" in
1265 gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1266 if [ "$uclibc" = "yes" ]; then
1267 os_include_dir="os/uclibc"
1268+ elif [ "$bionic" = "yes" ]; then
1269+ os_include_dir="os/bionic"
1270 else
1271 os_include_dir="os/gnu-linux"
1272 fi
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99495.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99495.patch
new file mode 100644
index 000000000..bb866ce8d
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99495.patch
@@ -0,0 +1,784 @@
12011-03-24 Revital Eres <revital.eres@linaro.org>
2
3 gcc/
4 * loop-doloop.c (doloop_condition_get): Support new form of
5 doloop pattern and use prev_nondebug_insn instead of PREV_INSN.
6 * config/arm/thumb2.md (*thumb2_addsi3_compare0): Remove "*".
7 (doloop_end): New.
8 * config/arm/arm.md (*addsi3_compare0): Remove "*".
9 * ddg.c (check_closing_branch_deps, get_node_of_insn_uid):
10 New functions.
11 (create_ddg): Pass sbitmap containing do-loop related
12 instructions instead of closing_branch_deps parameter and call
13 check_closing_branch_deps function.
14 * ddg.h (create_ddg): Adjust the function declaration.
15 * modulo-sched.c (PS_STAGE_COUNT): Rename to CALC_STAGE_COUNT
16 and redefine.
17 (doloop_register_get): Handle NONDEBUG_INSN_P.
18 (stage_count): New field in struct partial_schedule.
19 (mark_doloop_insns, calculate_stage_count): New functions.
20 (normalize_sched_times): Rename to reset_sched_times and handle
21 incrementing the sched time of the nodes by a constant value
22 passed as parameter.
23 (duplicate_insns_of_cycles): Skip closing branch.
24 (sms_schedule_by_order): Schedule closing branch when
25 closing_branch_deps is true.
26 (ps_insn_find_column): Handle closing branch.
27 (sms_schedule): Call reset_sched_times and handle case where
28 do-loop pattern is not decoupled from the other loop instructions.
29 Support new form of doloop pattern.
30 (ps_insert_empty_row): Update calls to normalize_sched_times
31 and rotate_partial_schedule functions.
32
33=== modified file 'gcc/config/arm/arm.md'
34--- old/gcc/config/arm/arm.md 2011-03-11 14:26:34 +0000
35+++ new/gcc/config/arm/arm.md 2011-03-24 07:45:38 +0000
36@@ -734,7 +734,7 @@
37 ""
38 )
39
40-(define_insn "*addsi3_compare0"
41+(define_insn "addsi3_compare0"
42 [(set (reg:CC_NOOV CC_REGNUM)
43 (compare:CC_NOOV
44 (plus:SI (match_operand:SI 1 "s_register_operand" "r, r")
45
46=== modified file 'gcc/config/arm/thumb2.md'
47--- old/gcc/config/arm/thumb2.md 2011-02-08 10:51:58 +0000
48+++ new/gcc/config/arm/thumb2.md 2011-03-24 07:45:38 +0000
49@@ -1194,7 +1194,7 @@
50 (set_attr "length" "2")]
51 )
52
53-(define_insn "*thumb2_addsi3_compare0"
54+(define_insn "thumb2_addsi3_compare0"
55 [(set (reg:CC_NOOV CC_REGNUM)
56 (compare:CC_NOOV
57 (plus:SI (match_operand:SI 1 "s_register_operand" "l, 0, r")
58@@ -1445,3 +1445,56 @@
59 [(set_attr "length" "4,4,16")
60 (set_attr "predicable" "yes")]
61 )
62+
63+
64+;; Define the subtract-one-and-jump insns so loop.c
65+;; knows what to generate.
66+(define_expand "doloop_end"
67+ [(use (match_operand 0 "" "")) ; loop pseudo
68+ (use (match_operand 1 "" "")) ; iterations; zero if unknown
69+ (use (match_operand 2 "" "")) ; max iterations
70+ (use (match_operand 3 "" "")) ; loop level
71+ (use (match_operand 4 "" ""))] ; label
72+ "TARGET_32BIT"
73+ "
74+ {
75+ /* Currently SMS relies on the do-loop pattern to recognize loops
76+ where (1) the control part consists of all insns defining and/or
77+ using a certain 'count' register and (2) the loop count can be
78+ adjusted by modifying this register prior to the loop.
79+ ??? The possible introduction of a new block to initialize the
80+ new IV can potentially affect branch optimizations. */
81+ if (optimize > 0 && flag_modulo_sched)
82+ {
83+ rtx s0;
84+ rtx bcomp;
85+ rtx loc_ref;
86+ rtx cc_reg;
87+ rtx insn;
88+ rtx cmp;
89+
90+ /* Only use this on innermost loops. */
91+ if (INTVAL (operands[3]) > 1)
92+ FAIL;
93+
94+ if (GET_MODE (operands[0]) != SImode)
95+ FAIL;
96+
97+ s0 = operands [0];
98+ if (TARGET_THUMB2)
99+ insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, GEN_INT (-1)));
100+ else
101+ insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1)));
102+
103+ cmp = XVECEXP (PATTERN (insn), 0, 0);
104+ cc_reg = SET_DEST (cmp);
105+ bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx);
106+ loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]);
107+ emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
108+ gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
109+ loc_ref, pc_rtx)));
110+ DONE;
111+ }else
112+ FAIL;
113+ }")
114+
115
116=== modified file 'gcc/ddg.c'
117--- old/gcc/ddg.c 2010-07-19 08:58:53 +0000
118+++ new/gcc/ddg.c 2011-03-24 07:45:38 +0000
119@@ -60,6 +60,8 @@
120 static ddg_edge_ptr create_ddg_edge (ddg_node_ptr, ddg_node_ptr, dep_type,
121 dep_data_type, int, int);
122 static void add_edge_to_ddg (ddg_ptr g, ddg_edge_ptr);
123+static ddg_node_ptr get_node_of_insn_uid (ddg_ptr, int);
124+
125
126 /* Auxiliary variable for mem_read_insn_p/mem_write_insn_p. */
127 static bool mem_ref_p;
128@@ -450,12 +452,65 @@
129 sched_free_deps (head, tail, false);
130 }
131
132+/* Given DOLOOP_INSNS which holds the instructions that
133+ belong to the do-loop part; mark closing_branch_deps field in ddg G
134+ as TRUE if the do-loop part's instructions are dependent on the other
135+ loop instructions. Otherwise mark it as FALSE. */
136+static void
137+check_closing_branch_deps (ddg_ptr g, sbitmap doloop_insns)
138+{
139+ sbitmap_iterator sbi;
140+ unsigned int u = 0;
141+
142+ EXECUTE_IF_SET_IN_SBITMAP (doloop_insns, 0, u, sbi)
143+ {
144+ ddg_edge_ptr e;
145+ ddg_node_ptr u_node = get_node_of_insn_uid (g, u);
146+
147+ gcc_assert (u_node);
148+
149+ for (e = u_node->in; e != 0; e = e->next_in)
150+ {
151+ ddg_node_ptr v_node = e->src;
152+
153+ if (((unsigned int) INSN_UID (v_node->insn) == u)
154+ || DEBUG_INSN_P (v_node->insn))
155+ continue;
156+
157+ /* Ignore dependencies between memory writes and the
158+ jump. */
159+ if (JUMP_P (u_node->insn)
160+ && e->type == OUTPUT_DEP
161+ && mem_write_insn_p (v_node->insn))
162+ continue;
163+ if (!TEST_BIT (doloop_insns, INSN_UID (v_node->insn)))
164+ {
165+ g->closing_branch_deps = 1;
166+ return;
167+ }
168+ }
169+ for (e = u_node->out; e != 0; e = e->next_out)
170+ {
171+ ddg_node_ptr v_node = e->dest;
172+
173+ if (((unsigned int) INSN_UID (v_node->insn) == u)
174+ || DEBUG_INSN_P (v_node->insn))
175+ continue;
176+ if (!TEST_BIT (doloop_insns, INSN_UID (v_node->insn)))
177+ {
178+ g->closing_branch_deps = 1;
179+ return;
180+ }
181+ }
182+ }
183+ g->closing_branch_deps = 0;
184+}
185
186 /* Given a basic block, create its DDG and return a pointer to a variable
187 of ddg type that represents it.
188 Initialize the ddg structure fields to the appropriate values. */
189 ddg_ptr
190-create_ddg (basic_block bb, int closing_branch_deps)
191+create_ddg (basic_block bb, sbitmap doloop_insns)
192 {
193 ddg_ptr g;
194 rtx insn, first_note;
195@@ -465,7 +520,6 @@
196 g = (ddg_ptr) xcalloc (1, sizeof (struct ddg));
197
198 g->bb = bb;
199- g->closing_branch_deps = closing_branch_deps;
200
201 /* Count the number of insns in the BB. */
202 for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
203@@ -538,6 +592,11 @@
204 /* Build the data dependency graph. */
205 build_intra_loop_deps (g);
206 build_inter_loop_deps (g);
207+
208+ /* Check whether the do-loop part is decoupled from the other loop
209+ instructions. */
210+ check_closing_branch_deps (g, doloop_insns);
211+
212 return g;
213 }
214
215@@ -831,6 +890,18 @@
216 return NULL;
217 }
218
219+/* Given the uid of an instruction UID return the node that represents it. */
220+static ddg_node_ptr
221+get_node_of_insn_uid (ddg_ptr g, int uid)
222+{
223+ int i;
224+
225+ for (i = 0; i < g->num_nodes; i++)
226+ if (uid == INSN_UID (g->nodes[i].insn))
227+ return &g->nodes[i];
228+ return NULL;
229+}
230+
231 /* Given a set OPS of nodes in the DDG, find the set of their successors
232 which are not in OPS, and set their bits in SUCC. Bits corresponding to
233 OPS are cleared from SUCC. Leaves the other bits in SUCC unchanged. */
234
235=== modified file 'gcc/ddg.h'
236--- old/gcc/ddg.h 2009-11-25 10:55:54 +0000
237+++ new/gcc/ddg.h 2011-03-24 07:45:38 +0000
238@@ -167,7 +167,7 @@
239 };
240
241
242-ddg_ptr create_ddg (basic_block, int closing_branch_deps);
243+ddg_ptr create_ddg (basic_block, sbitmap);
244 void free_ddg (ddg_ptr);
245
246 void print_ddg (FILE *, ddg_ptr);
247
248=== modified file 'gcc/loop-doloop.c'
249--- old/gcc/loop-doloop.c 2010-07-19 08:58:53 +0000
250+++ new/gcc/loop-doloop.c 2011-03-24 07:45:38 +0000
251@@ -78,6 +78,8 @@
252 rtx inc_src;
253 rtx condition;
254 rtx pattern;
255+ rtx cc_reg = NULL_RTX;
256+ rtx reg_orig = NULL_RTX;
257
258 /* The canonical doloop pattern we expect has one of the following
259 forms:
260@@ -96,7 +98,16 @@
261 2) (set (reg) (plus (reg) (const_int -1))
262 (set (pc) (if_then_else (reg != 0)
263 (label_ref (label))
264- (pc))). */
265+ (pc))).
266+
267+ Some targets (ARM) do the comparison before the branch, as in the
268+ following form:
269+
270+ 3) (parallel [(set (cc) (compare ((plus (reg) (const_int -1), 0)))
271+ (set (reg) (plus (reg) (const_int -1)))])
272+ (set (pc) (if_then_else (cc == NE)
273+ (label_ref (label))
274+ (pc))) */
275
276 pattern = PATTERN (doloop_pat);
277
278@@ -104,19 +115,47 @@
279 {
280 rtx cond;
281 rtx prev_insn = prev_nondebug_insn (doloop_pat);
282+ rtx cmp_arg1, cmp_arg2;
283+ rtx cmp_orig;
284
285- /* We expect the decrement to immediately precede the branch. */
286+ /* In case the pattern is not PARALLEL we expect two forms
287+ of doloop which are cases 2) and 3) above: in case 2) the
288+ decrement immediately precedes the branch, while in case 3)
289+ the compare and decrement instructions immediately precede
290+ the branch. */
291
292 if (prev_insn == NULL_RTX || !INSN_P (prev_insn))
293 return 0;
294
295 cmp = pattern;
296- inc = PATTERN (PREV_INSN (doloop_pat));
297+ if (GET_CODE (PATTERN (prev_insn)) == PARALLEL)
298+ {
299+ /* The third case: the compare and decrement instructions
300+ immediately precede the branch. */
301+ cmp_orig = XVECEXP (PATTERN (prev_insn), 0, 0);
302+ if (GET_CODE (cmp_orig) != SET)
303+ return 0;
304+ if (GET_CODE (SET_SRC (cmp_orig)) != COMPARE)
305+ return 0;
306+ cmp_arg1 = XEXP (SET_SRC (cmp_orig), 0);
307+ cmp_arg2 = XEXP (SET_SRC (cmp_orig), 1);
308+ if (cmp_arg2 != const0_rtx
309+ || GET_CODE (cmp_arg1) != PLUS)
310+ return 0;
311+ reg_orig = XEXP (cmp_arg1, 0);
312+ if (XEXP (cmp_arg1, 1) != GEN_INT (-1)
313+ || !REG_P (reg_orig))
314+ return 0;
315+ cc_reg = SET_DEST (cmp_orig);
316+
317+ inc = XVECEXP (PATTERN (prev_insn), 0, 1);
318+ }
319+ else
320+ inc = PATTERN (prev_insn);
321 /* We expect the condition to be of the form (reg != 0) */
322 cond = XEXP (SET_SRC (cmp), 0);
323 if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx)
324 return 0;
325-
326 }
327 else
328 {
329@@ -162,11 +201,15 @@
330 return 0;
331
332 if ((XEXP (condition, 0) == reg)
333+ /* For the third case: */
334+ || ((cc_reg != NULL_RTX)
335+ && (XEXP (condition, 0) == cc_reg)
336+ && (reg_orig == reg))
337 || (GET_CODE (XEXP (condition, 0)) == PLUS
338- && XEXP (XEXP (condition, 0), 0) == reg))
339+ && XEXP (XEXP (condition, 0), 0) == reg))
340 {
341 if (GET_CODE (pattern) != PARALLEL)
342- /* The second form we expect:
343+ /* For the second form we expect:
344
345 (set (reg) (plus (reg) (const_int -1))
346 (set (pc) (if_then_else (reg != 0)
347@@ -181,7 +224,24 @@
348 (set (reg) (plus (reg) (const_int -1)))
349 (additional clobbers and uses)])
350
351- So we return that form instead.
352+ For the third form we expect:
353+
354+ (parallel [(set (cc) (compare ((plus (reg) (const_int -1)), 0))
355+ (set (reg) (plus (reg) (const_int -1)))])
356+ (set (pc) (if_then_else (cc == NE)
357+ (label_ref (label))
358+ (pc)))
359+
360+ which is equivalent to the following:
361+
362+ (parallel [(set (cc) (compare (reg, 1))
363+ (set (reg) (plus (reg) (const_int -1)))
364+ (set (pc) (if_then_else (NE == cc)
365+ (label_ref (label))
366+ (pc))))])
367+
368+ So we return the second form instead for the two cases.
369+
370 */
371 condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);
372
373
374=== modified file 'gcc/modulo-sched.c'
375--- old/gcc/modulo-sched.c 2009-11-25 10:55:54 +0000
376+++ new/gcc/modulo-sched.c 2011-03-24 07:45:38 +0000
377@@ -116,8 +116,10 @@
378
379 /* The number of different iterations the nodes in ps span, assuming
380 the stage boundaries are placed efficiently. */
381-#define PS_STAGE_COUNT(ps) ((PS_MAX_CYCLE (ps) - PS_MIN_CYCLE (ps) \
382- + 1 + (ps)->ii - 1) / (ps)->ii)
383+#define CALC_STAGE_COUNT(min_cycle,max_cycle,ii) ((max_cycle - min_cycle \
384+ + 1 + ii - 1) / ii)
385+/* The stage count of ps. */
386+#define PS_STAGE_COUNT(ps) (((partial_schedule_ptr)(ps))->stage_count)
387
388 /* A single instruction in the partial schedule. */
389 struct ps_insn
390@@ -155,6 +157,8 @@
391 int max_cycle;
392
393 ddg_ptr g; /* The DDG of the insns in the partial schedule. */
394+
395+ int stage_count; /* The stage count of the partial schedule. */
396 };
397
398 /* We use this to record all the register replacements we do in
399@@ -195,6 +199,7 @@
400 rtx, rtx);
401 static void duplicate_insns_of_cycles (partial_schedule_ptr,
402 int, int, int, rtx);
403+static int calculate_stage_count (partial_schedule_ptr ps);
404
405 #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap)
406 #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time)
407@@ -310,10 +315,10 @@
408 either a single (parallel) branch-on-count or a (non-parallel)
409 branch immediately preceded by a single (decrement) insn. */
410 first_insn_not_to_check = (GET_CODE (PATTERN (tail)) == PARALLEL ? tail
411- : PREV_INSN (tail));
412+ : prev_nondebug_insn (tail));
413
414 for (insn = head; insn != first_insn_not_to_check; insn = NEXT_INSN (insn))
415- if (reg_mentioned_p (reg, insn))
416+ if (reg_mentioned_p (reg, insn) && NONDEBUG_INSN_P (insn))
417 {
418 if (dump_file)
419 {
420@@ -332,6 +337,24 @@
421 #endif
422 }
423
424+/* Mark in DOLOOP_INSNS the instructions that belong to the do-loop part.
425+ Use TAIL to recognize that part. */
426+static void
427+mark_doloop_insns (sbitmap doloop_insns, rtx tail)
428+{
429+ rtx first_insn_not_to_check, insn;
430+
431+ /* This is the first instruction which belongs the doloop part. */
432+ first_insn_not_to_check = (GET_CODE (PATTERN (tail)) == PARALLEL ? tail
433+ : prev_nondebug_insn (tail));
434+
435+ sbitmap_zero (doloop_insns);
436+ for (insn = first_insn_not_to_check; insn != NEXT_INSN (tail);
437+ insn = NEXT_INSN (insn))
438+ if (NONDEBUG_INSN_P (insn))
439+ SET_BIT (doloop_insns, INSN_UID (insn));
440+}
441+
442 /* Check if COUNT_REG is set to a constant in the PRE_HEADER block, so
443 that the number of iterations is a compile-time constant. If so,
444 return the rtx that sets COUNT_REG to a constant, and set COUNT to
445@@ -569,13 +592,12 @@
446 }
447 }
448
449-/* Bump the SCHED_TIMEs of all nodes to start from zero. Set the values
450- of SCHED_ROW and SCHED_STAGE. */
451+/* Bump the SCHED_TIMEs of all nodes by AMOUNT. Set the values of
452+ SCHED_ROW and SCHED_STAGE. */
453 static void
454-normalize_sched_times (partial_schedule_ptr ps)
455+reset_sched_times (partial_schedule_ptr ps, int amount)
456 {
457 int row;
458- int amount = PS_MIN_CYCLE (ps);
459 int ii = ps->ii;
460 ps_insn_ptr crr_insn;
461
462@@ -584,6 +606,10 @@
463 {
464 ddg_node_ptr u = crr_insn->node;
465 int normalized_time = SCHED_TIME (u) - amount;
466+ int new_min_cycle = PS_MIN_CYCLE (ps) - amount;
467+ /* The first cycle in row zero after the rotation. */
468+ int new_first_cycle_in_row_zero =
469+ new_min_cycle + ii - SMODULO (new_min_cycle, ii);
470
471 if (dump_file)
472 fprintf (dump_file, "crr_insn->node=%d, crr_insn->cycle=%d,\
473@@ -592,8 +618,30 @@
474 gcc_assert (SCHED_TIME (u) >= ps->min_cycle);
475 gcc_assert (SCHED_TIME (u) <= ps->max_cycle);
476 SCHED_TIME (u) = normalized_time;
477- SCHED_ROW (u) = normalized_time % ii;
478- SCHED_STAGE (u) = normalized_time / ii;
479+ crr_insn->cycle = normalized_time;
480+ SCHED_ROW (u) = SMODULO (normalized_time, ii);
481+
482+ /* If min_cycle is in row zero after the rotation then
483+ the stage count can be calculated by dividing the cycle
484+ with ii. Otherwise, the calculation is done by dividing the
485+ SMSed kernel into two intervals:
486+
487+ 1) min_cycle <= interval 0 < first_cycle_in_row_zero
488+ 2) first_cycle_in_row_zero <= interval 1 < max_cycle
489+
490+ Cycles in interval 0 are in stage 0. The stage of cycles
491+ in interval 1 should be added by 1 to take interval 0 into
492+ account. */
493+ if (SMODULO (new_min_cycle, ii) == 0)
494+ SCHED_STAGE (u) = normalized_time / ii;
495+ else
496+ {
497+ if (crr_insn->cycle < new_first_cycle_in_row_zero)
498+ SCHED_STAGE (u) = 0;
499+ else
500+ SCHED_STAGE (u) =
501+ ((SCHED_TIME (u) - new_first_cycle_in_row_zero) / ii) + 1;
502+ }
503 }
504 }
505
506@@ -646,9 +694,12 @@
507
508 /* Do not duplicate any insn which refers to count_reg as it
509 belongs to the control part.
510+ If closing_branch_deps is true the closing branch is scheduled
511+ as well and thus should be ignored.
512 TODO: This should be done by analyzing the control part of
513 the loop. */
514- if (reg_mentioned_p (count_reg, u_node->insn))
515+ if (reg_mentioned_p (count_reg, u_node->insn)
516+ || JUMP_P (ps_ij->node->insn))
517 continue;
518
519 if (for_prolog)
520@@ -894,7 +945,8 @@
521 basic_block condition_bb = NULL;
522 edge latch_edge;
523 gcov_type trip_count = 0;
524-
525+ sbitmap doloop_insns;
526+
527 loop_optimizer_init (LOOPS_HAVE_PREHEADERS
528 | LOOPS_HAVE_RECORDED_EXITS);
529 if (number_of_loops () <= 1)
530@@ -919,6 +971,7 @@
531 setup_sched_infos ();
532 haifa_sched_init ();
533
534+ doloop_insns = sbitmap_alloc (get_max_uid () + 1);
535 /* Allocate memory to hold the DDG array one entry for each loop.
536 We use loop->num as index into this array. */
537 g_arr = XCNEWVEC (ddg_ptr, number_of_loops ());
538@@ -1009,9 +1062,11 @@
539 continue;
540 }
541
542- /* Don't handle BBs with calls or barriers, or !single_set insns,
543- or auto-increment insns (to avoid creating invalid reg-moves
544- for the auto-increment insns).
545+ /* Don't handle BBs with calls or barriers or auto-increment insns
546+ (to avoid creating invalid reg-moves for the auto-increment insns),
547+ or !single_set with the exception of instructions that include
548+ count_reg---these instructions are part of the control part
549+ that do-loop recognizes.
550 ??? Should handle auto-increment insns.
551 ??? Should handle insns defining subregs. */
552 for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn))
553@@ -1021,7 +1076,8 @@
554 if (CALL_P (insn)
555 || BARRIER_P (insn)
556 || (NONDEBUG_INSN_P (insn) && !JUMP_P (insn)
557- && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE)
558+ && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE
559+ && !reg_mentioned_p (count_reg, insn))
560 || (FIND_REG_INC_NOTE (insn, NULL_RTX) != 0)
561 || (INSN_P (insn) && (set = single_set (insn))
562 && GET_CODE (SET_DEST (set)) == SUBREG))
563@@ -1048,14 +1104,16 @@
564
565 continue;
566 }
567-
568- if (! (g = create_ddg (bb, 0)))
569+ mark_doloop_insns (doloop_insns, tail);
570+ if (! (g = create_ddg (bb, doloop_insns)))
571 {
572 if (dump_file)
573 fprintf (dump_file, "SMS create_ddg failed\n");
574 continue;
575 }
576-
577+ if (dump_file)
578+ fprintf (dump_file, "SMS closing_branch_deps: %d\n",
579+ g->closing_branch_deps);
580 g_arr[loop->num] = g;
581 if (dump_file)
582 fprintf (dump_file, "...OK\n");
583@@ -1157,11 +1215,13 @@
584
585 ps = sms_schedule_by_order (g, mii, maxii, node_order);
586
587- if (ps){
588- stage_count = PS_STAGE_COUNT (ps);
589- gcc_assert(stage_count >= 1);
590- }
591-
592+ if (ps)
593+ {
594+ stage_count = calculate_stage_count (ps);
595+ gcc_assert(stage_count >= 1);
596+ PS_STAGE_COUNT(ps) = stage_count;
597+ }
598+
599 /* Stage count of 1 means that there is no interleaving between
600 iterations, let the scheduling passes do the job. */
601 if (stage_count <= 1
602@@ -1182,17 +1242,7 @@
603 else
604 {
605 struct undo_replace_buff_elem *reg_move_replaces;
606-
607- if (dump_file)
608- {
609- fprintf (dump_file,
610- "SMS succeeded %d %d (with ii, sc)\n", ps->ii,
611- stage_count);
612- print_partial_schedule (ps, dump_file);
613- fprintf (dump_file,
614- "SMS Branch (%d) will later be scheduled at cycle %d.\n",
615- g->closing_branch->cuid, PS_MIN_CYCLE (ps) - 1);
616- }
617+ int amount;
618
619 /* Set the stage boundaries. If the DDG is built with closing_branch_deps,
620 the closing_branch was scheduled and should appear in the last (ii-1)
621@@ -1202,12 +1252,28 @@
622 TODO: Revisit the issue of scheduling the insns of the
623 control part relative to the branch when the control part
624 has more than one insn. */
625- normalize_sched_times (ps);
626- rotate_partial_schedule (ps, PS_MIN_CYCLE (ps));
627+ amount = (g->closing_branch_deps)? SCHED_TIME (g->closing_branch) + 1:
628+ PS_MIN_CYCLE (ps);
629+ reset_sched_times (ps, amount);
630+ rotate_partial_schedule (ps, amount);
631+
632 set_columns_for_ps (ps);
633
634 canon_loop (loop);
635
636+ if (dump_file)
637+ {
638+ fprintf (dump_file,
639+ "SMS succeeded %d %d (with ii, sc)\n", ps->ii,
640+ stage_count);
641+ print_partial_schedule (ps, dump_file);
642+ if (!g->closing_branch_deps)
643+ fprintf (dump_file,
644+ "SMS Branch (%d) will later be scheduled at \
645+ cycle %d.\n",
646+ g->closing_branch->cuid, PS_MIN_CYCLE (ps) - 1);
647+ }
648+
649 /* case the BCT count is not known , Do loop-versioning */
650 if (count_reg && ! count_init)
651 {
652@@ -1252,6 +1318,7 @@
653 }
654
655 free (g_arr);
656+ sbitmap_free (doloop_insns);
657
658 /* Release scheduler data, needed until now because of DFA. */
659 haifa_sched_finish ();
660@@ -1759,8 +1826,9 @@
661 RESET_BIT (tobe_scheduled, u);
662 continue;
663 }
664-
665- if (JUMP_P (insn)) /* Closing branch handled later. */
666+ /* Closing branch handled later unless closing_branch_deps
667+ is true. */
668+ if (JUMP_P (insn) && !g->closing_branch_deps)
669 {
670 RESET_BIT (tobe_scheduled, u);
671 continue;
672@@ -1893,8 +1961,8 @@
673 if (dump_file)
674 fprintf (dump_file, "split_row=%d\n", split_row);
675
676- normalize_sched_times (ps);
677- rotate_partial_schedule (ps, ps->min_cycle);
678+ reset_sched_times (ps, PS_MIN_CYCLE (ps));
679+ rotate_partial_schedule (ps, PS_MIN_CYCLE (ps));
680
681 rows_new = (ps_insn_ptr *) xcalloc (new_ii, sizeof (ps_insn_ptr));
682 for (row = 0; row < split_row; row++)
683@@ -2571,6 +2639,7 @@
684 ps_insn_ptr next_ps_i;
685 ps_insn_ptr first_must_follow = NULL;
686 ps_insn_ptr last_must_precede = NULL;
687+ ps_insn_ptr last_in_row = NULL;
688 int row;
689
690 if (! ps_i)
691@@ -2597,8 +2666,37 @@
692 else
693 last_must_precede = next_ps_i;
694 }
695+ /* The closing branch must be the last in the row. */
696+ if (must_precede
697+ && TEST_BIT (must_precede, next_ps_i->node->cuid)
698+ && JUMP_P (next_ps_i->node->insn))
699+ return false;
700+
701+ last_in_row = next_ps_i;
702 }
703
704+ /* If closing_branch_deps is true we are scheduling the closing
705+ branch as well. Make sure there is no dependent instruction after
706+ it as the branch should be the last instruction. */
707+ if (JUMP_P (ps_i->node->insn))
708+ {
709+ if (first_must_follow)
710+ return false;
711+ if (last_in_row)
712+ {
713+ /* Make the branch the last in the row. New instructions
714+ will be inserted at the beginning of the row or after the
715+ last must_precede instruction thus the branch is guaranteed
716+ to remain the last instruction in the row. */
717+ last_in_row->next_in_row = ps_i;
718+ ps_i->prev_in_row = last_in_row;
719+ ps_i->next_in_row = NULL;
720+ }
721+ else
722+ ps->rows[row] = ps_i;
723+ return true;
724+ }
725+
726 /* Now insert the node after INSERT_AFTER_PSI. */
727
728 if (! last_must_precede)
729@@ -2820,6 +2918,54 @@
730 return ps_i;
731 }
732
733+/* Calculate the stage count of the partial schedule PS. */
734+int
735+calculate_stage_count (partial_schedule_ptr ps)
736+{
737+ int stage_count;
738+
739+ /* If closing_branch_deps is false then the stage
740+ boundaries are placed efficiently, meaning that min_cycle will be
741+ placed at row 0. Otherwise, the closing branch will be placed in
742+ row ii-1. For the later case we assume the final SMSed kernel can
743+ be divided into two intervals. This assumption is used for the
744+ stage count calculation:
745+
746+ 1) min_cycle <= interval 0 < first_cycle_in_row_zero
747+ 2) first_cycle_in_row_zero <= interval 1 < max_cycle
748+ */
749+ stage_count =
750+ CALC_STAGE_COUNT (PS_MIN_CYCLE (ps), PS_MAX_CYCLE (ps), ps->ii);
751+ if (ps->g->closing_branch_deps)
752+ {
753+ int new_min_cycle;
754+ int new_min_cycle_row;
755+ int rotation_amount = SCHED_TIME (ps->g->closing_branch) + 1;
756+
757+ /* This is the new value of min_cycle after the final rotation to
758+ bring closing branch into row ii-1. */
759+ new_min_cycle = PS_MIN_CYCLE (ps) - rotation_amount;
760+ /* This is the row which the the new min_cycle will be placed in. */
761+ new_min_cycle_row = SMODULO (new_min_cycle, ps->ii);
762+ /* If the row of min_cycle is zero then interval 0 is empty.
763+ Otherwise, we need to calculate interval 1 and add it by one
764+ to take interval 0 into account. */
765+ if (new_min_cycle_row != 0)
766+ {
767+ int new_max_cycle, first_cycle_in_row_zero;
768+
769+ new_max_cycle = PS_MAX_CYCLE (ps) - rotation_amount;
770+ first_cycle_in_row_zero =
771+ new_min_cycle + ps->ii - new_min_cycle_row;
772+
773+ stage_count =
774+ CALC_STAGE_COUNT (first_cycle_in_row_zero, new_max_cycle,
775+ ps->ii) + 1;
776+ }
777+ }
778+ return stage_count;
779+}
780+
781 /* Rotate the rows of PS such that insns scheduled at time
782 START_CYCLE will appear in row 0. Updates max/min_cycles. */
783 void
784
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99498.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99498.patch
new file mode 100644
index 000000000..9c305cc65
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99498.patch
@@ -0,0 +1,186 @@
12011-02-16 Nathan Sidwell <nathan@codesourcery.com>
2
3 Issue #10439
4 gcc/
5 * config/arm/unwind-arm.c (enum __cxa_type_match_result): New.
6 (cxa_type_match): Correct declaration.
7 (__gnu_unwind_pr_common): Reconstruct
8 additional indirection when __cxa_type_match returns
9 succeeded_with_ptr_to_base.
10
11 libstdc++/
12 * libsupc++/eh_arm.c (__cxa_type_match): Construct address of
13 thrown object here. Return succeded_with_ptr_to_base for all
14 pointer cases.
15
16=== modified file 'gcc/config/arm/unwind-arm.c'
17--- old/gcc/config/arm/unwind-arm.c 2010-08-12 12:39:35 +0000
18+++ new/gcc/config/arm/unwind-arm.c 2011-04-08 10:41:46 +0000
19@@ -32,13 +32,18 @@
20 typedef unsigned char bool;
21
22 typedef struct _ZSt9type_info type_info; /* This names C++ type_info type */
23+enum __cxa_type_match_result
24+ {
25+ ctm_failed = 0,
26+ ctm_succeeded = 1,
27+ ctm_succeeded_with_ptr_to_base = 2
28+ };
29
30 void __attribute__((weak)) __cxa_call_unexpected(_Unwind_Control_Block *ucbp);
31 bool __attribute__((weak)) __cxa_begin_cleanup(_Unwind_Control_Block *ucbp);
32-bool __attribute__((weak)) __cxa_type_match(_Unwind_Control_Block *ucbp,
33- const type_info *rttip,
34- bool is_reference,
35- void **matched_object);
36+enum __cxa_type_match_result __attribute__((weak)) __cxa_type_match
37+ (_Unwind_Control_Block *ucbp, const type_info *rttip,
38+ bool is_reference, void **matched_object);
39
40 _Unwind_Ptr __attribute__((weak))
41 __gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
42@@ -1107,6 +1112,7 @@
43 _uw rtti;
44 bool is_reference = (data[0] & uint32_highbit) != 0;
45 void *matched;
46+ enum __cxa_type_match_result match_type;
47
48 /* Check for no-throw areas. */
49 if (data[1] == (_uw) -2)
50@@ -1118,17 +1124,31 @@
51 {
52 /* Match a catch specification. */
53 rtti = _Unwind_decode_target2 ((_uw) &data[1]);
54- if (!__cxa_type_match (ucbp, (type_info *) rtti,
55- is_reference,
56- &matched))
57- matched = (void *)0;
58+ match_type = __cxa_type_match (ucbp,
59+ (type_info *) rtti,
60+ is_reference,
61+ &matched);
62 }
63+ else
64+ match_type = ctm_succeeded;
65
66- if (matched)
67+ if (match_type)
68 {
69 ucbp->barrier_cache.sp =
70 _Unwind_GetGR (context, R_SP);
71- ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
72+ // ctm_succeeded_with_ptr_to_base really
73+ // means _c_t_m indirected the pointer
74+ // object. We have to reconstruct the
75+ // additional pointer layer by using a temporary.
76+ if (match_type == ctm_succeeded_with_ptr_to_base)
77+ {
78+ ucbp->barrier_cache.bitpattern[2]
79+ = (_uw) matched;
80+ ucbp->barrier_cache.bitpattern[0]
81+ = (_uw) &ucbp->barrier_cache.bitpattern[2];
82+ }
83+ else
84+ ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
85 ucbp->barrier_cache.bitpattern[1] = (_uw) data;
86 return _URC_HANDLER_FOUND;
87 }
88
89=== modified file 'libstdc++-v3/libsupc++/eh_arm.cc'
90--- old/libstdc++-v3/libsupc++/eh_arm.cc 2009-04-09 14:00:19 +0000
91+++ new/libstdc++-v3/libsupc++/eh_arm.cc 2011-04-08 10:41:46 +0000
92@@ -30,10 +30,11 @@
93 using namespace __cxxabiv1;
94
95
96-// Given the thrown type THROW_TYPE, pointer to a variable containing a
97-// pointer to the exception object THROWN_PTR_P and a type CATCH_TYPE to
98-// compare against, return whether or not there is a match and if so,
99-// update *THROWN_PTR_P.
100+// Given the thrown type THROW_TYPE, exception object UE_HEADER and a
101+// type CATCH_TYPE to compare against, return whether or not there is
102+// a match and if so, update *THROWN_PTR_P to point to either the
103+// type-matched object, or in the case of a pointer type, the object
104+// pointed to by the pointer.
105
106 extern "C" __cxa_type_match_result
107 __cxa_type_match(_Unwind_Exception* ue_header,
108@@ -41,51 +42,51 @@
109 bool is_reference __attribute__((__unused__)),
110 void** thrown_ptr_p)
111 {
112- bool forced_unwind = __is_gxx_forced_unwind_class(ue_header->exception_class);
113- bool foreign_exception = !forced_unwind && !__is_gxx_exception_class(ue_header->exception_class);
114- bool dependent_exception =
115- __is_dependent_exception(ue_header->exception_class);
116+ bool forced_unwind
117+ = __is_gxx_forced_unwind_class(ue_header->exception_class);
118+ bool foreign_exception
119+ = !forced_unwind && !__is_gxx_exception_class(ue_header->exception_class);
120+ bool dependent_exception
121+ = __is_dependent_exception(ue_header->exception_class);
122 __cxa_exception* xh = __get_exception_header_from_ue(ue_header);
123 __cxa_dependent_exception *dx = __get_dependent_exception_from_ue(ue_header);
124 const std::type_info* throw_type;
125+ void *thrown_ptr = 0;
126
127 if (forced_unwind)
128 throw_type = &typeid(abi::__forced_unwind);
129 else if (foreign_exception)
130 throw_type = &typeid(abi::__foreign_exception);
131- else if (dependent_exception)
132- throw_type = __get_exception_header_from_obj
133- (dx->primaryException)->exceptionType;
134 else
135- throw_type = xh->exceptionType;
136-
137- void* thrown_ptr = *thrown_ptr_p;
138+ {
139+ if (dependent_exception)
140+ xh = __get_exception_header_from_obj (dx->primaryException);
141+ throw_type = xh->exceptionType;
142+ // We used to require the caller set the target of thrown_ptr_p,
143+ // but that's incorrect -- the EHABI makes no such requirement
144+ // -- and not all callers will set it. Fortunately callers that
145+ // do initialize will always pass us the value we calculate
146+ // here, so there's no backwards compatibility problem.
147+ thrown_ptr = __get_object_from_ue (ue_header);
148+ }
149+
150+ __cxa_type_match_result result = ctm_succeeded;
151
152 // Pointer types need to adjust the actual pointer, not
153 // the pointer to pointer that is the exception object.
154 // This also has the effect of passing pointer types
155 // "by value" through the __cxa_begin_catch return value.
156 if (throw_type->__is_pointer_p())
157- thrown_ptr = *(void**) thrown_ptr;
158+ {
159+ thrown_ptr = *(void**) thrown_ptr;
160+ // We need to indicate the indirection to our caller.
161+ result = ctm_succeeded_with_ptr_to_base;
162+ }
163
164 if (catch_type->__do_catch(throw_type, &thrown_ptr, 1))
165 {
166 *thrown_ptr_p = thrown_ptr;
167-
168- if (typeid(*catch_type) == typeid (typeid(void*)))
169- {
170- const __pointer_type_info *catch_pointer_type =
171- static_cast<const __pointer_type_info *> (catch_type);
172- const __pointer_type_info *throw_pointer_type =
173- static_cast<const __pointer_type_info *> (throw_type);
174-
175- if (typeid (*catch_pointer_type->__pointee) != typeid (void)
176- && (*catch_pointer_type->__pointee !=
177- *throw_pointer_type->__pointee))
178- return ctm_succeeded_with_ptr_to_base;
179- }
180-
181- return ctm_succeeded;
182+ return result;
183 }
184
185 return ctm_failed;
186
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99502.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99502.patch
new file mode 100644
index 000000000..59bf01cc5
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99502.patch
@@ -0,0 +1,134 @@
12011-04-26 Chung-Lin Tang <cltang@codesourcery.com>
2
3 Backport from mainline:
4
5 2011-03-21 Chung-Lin Tang <cltang@codesourcery.com>
6
7 gcc/
8 * simplify-rtx.c (simplify_binary_operation_1): Handle
9 (xor (and A B) C) case when B and C are both constants.
10
11 gcc/testsuite/
12 * gcc.target/arm/xor-and.c: New.
13
14 2011-03-18 Chung-Lin Tang <cltang@codesourcery.com>
15
16 gcc/
17 * combine.c (try_combine): Do simplification only call of
18 subst() on i2 even when i1 is present. Update comments.
19
20 gcc/testsuite/
21 * gcc.target/arm/unsigned-extend-1.c: New.
22
23=== modified file 'gcc/combine.c'
24--- old/gcc/combine.c 2011-01-06 11:02:44 +0000
25+++ new/gcc/combine.c 2011-04-14 13:58:12 +0000
26@@ -2939,7 +2939,7 @@
27 /* It is possible that the source of I2 or I1 may be performing
28 an unneeded operation, such as a ZERO_EXTEND of something
29 that is known to have the high part zero. Handle that case
30- by letting subst look at the innermost one of them.
31+ by letting subst look at the inner insns.
32
33 Another way to do this would be to have a function that tries
34 to simplify a single insn instead of merging two or more
35@@ -2964,11 +2964,9 @@
36 subst_low_luid = DF_INSN_LUID (i1);
37 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
38 }
39- else
40- {
41- subst_low_luid = DF_INSN_LUID (i2);
42- i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
43- }
44+
45+ subst_low_luid = DF_INSN_LUID (i2);
46+ i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
47 }
48
49 n_occurrences = 0; /* `subst' counts here */
50
51=== modified file 'gcc/simplify-rtx.c'
52--- old/gcc/simplify-rtx.c 2010-06-25 20:11:56 +0000
53+++ new/gcc/simplify-rtx.c 2011-04-14 13:58:12 +0000
54@@ -2413,6 +2413,46 @@
55 XEXP (op0, 1), mode),
56 op1);
57
58+ /* Given (xor (and A B) C), using P^Q == (~P&Q) | (~Q&P),
59+ we can transform like this:
60+ (A&B)^C == ~(A&B)&C | ~C&(A&B)
61+ == (~A|~B)&C | ~C&(A&B) * DeMorgan's Law
62+ == ~A&C | ~B&C | A&(~C&B) * Distribute and re-order
63+ Attempt a few simplifications when B and C are both constants. */
64+ if (GET_CODE (op0) == AND
65+ && CONST_INT_P (op1)
66+ && CONST_INT_P (XEXP (op0, 1)))
67+ {
68+ rtx a = XEXP (op0, 0);
69+ rtx b = XEXP (op0, 1);
70+ rtx c = op1;
71+ HOST_WIDE_INT bval = INTVAL (b);
72+ HOST_WIDE_INT cval = INTVAL (c);
73+
74+ rtx na_c
75+ = simplify_binary_operation (AND, mode,
76+ simplify_gen_unary (NOT, mode, a, mode),
77+ c);
78+ if ((~cval & bval) == 0)
79+ {
80+ /* Try to simplify ~A&C | ~B&C. */
81+ if (na_c != NULL_RTX)
82+ return simplify_gen_binary (IOR, mode, na_c,
83+ GEN_INT (~bval & cval));
84+ }
85+ else
86+ {
87+ /* If ~A&C is zero, simplify A&(~C&B) | ~B&C. */
88+ if (na_c == const0_rtx)
89+ {
90+ rtx a_nc_b = simplify_gen_binary (AND, mode, a,
91+ GEN_INT (~cval & bval));
92+ return simplify_gen_binary (IOR, mode, a_nc_b,
93+ GEN_INT (~bval & cval));
94+ }
95+ }
96+ }
97+
98 /* (xor (comparison foo bar) (const_int 1)) can become the reversed
99 comparison if STORE_FLAG_VALUE is 1. */
100 if (STORE_FLAG_VALUE == 1
101
102=== added file 'gcc/testsuite/gcc.target/arm/unsigned-extend-1.c'
103--- old/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c 1970-01-01 00:00:00 +0000
104+++ new/gcc/testsuite/gcc.target/arm/unsigned-extend-1.c 2011-04-14 13:58:12 +0000
105@@ -0,0 +1,9 @@
106+/* { dg-do compile } */
107+/* { dg-options "-O2 -march=armv6" } */
108+
109+unsigned char foo (unsigned char c)
110+{
111+ return (c >= '0') && (c <= '9');
112+}
113+
114+/* { dg-final { scan-assembler-not "uxtb" } } */
115
116=== added file 'gcc/testsuite/gcc.target/arm/xor-and.c'
117--- old/gcc/testsuite/gcc.target/arm/xor-and.c 1970-01-01 00:00:00 +0000
118+++ new/gcc/testsuite/gcc.target/arm/xor-and.c 2011-04-14 13:58:12 +0000
119@@ -0,0 +1,14 @@
120+/* { dg-do compile } */
121+/* { dg-options "-O -march=armv6" } */
122+
123+unsigned short foo (unsigned short x)
124+{
125+ x ^= 0x4002;
126+ x >>= 1;
127+ x |= 0x8000;
128+ return x;
129+}
130+
131+/* { dg-final { scan-assembler "orr" } } */
132+/* { dg-final { scan-assembler-not "mvn" } } */
133+/* { dg-final { scan-assembler-not "uxth" } } */
134