···1+Fix a regression in GNU as:
2+http://sourceware.org/bugzilla/show_bug.cgi?id=10856 .
3+4+The bug appears to be responsible for invalid code generated for
5+Crypto++:
6+http://groups.google.com/group/cryptopp-users/browse_thread/thread/7ce734e479586640/29c6649b7c7adee2?#29c6649b7c7adee2 .
7+8+diff -u -r1.77.2.1 -r1.77.2.2
9+--- a/src/gas/expr.c 2009/09/11 15:28:43 1.77.2.1
10++++ b/src/gas/expr.c 2009/10/28 08:23:48 1.77.2.2
11+@@ -1997,6 +1997,7 @@
12+ /* Help out with CSE. */
13+ valueT final_val = expressionP->X_add_number;
14+ symbolS *add_symbol = expressionP->X_add_symbol;
15++ symbolS *orig_add_symbol = add_symbol;
16+ symbolS *op_symbol = expressionP->X_op_symbol;
17+ operatorT op = expressionP->X_op;
18+ valueT left, right;
19+@@ -2078,6 +2079,7 @@
20+ left = right;
21+ seg_left = seg_right;
22+ add_symbol = op_symbol;
23++ orig_add_symbol = expressionP->X_op_symbol;
24+ op = O_symbol;
25+ break;
26+ }
27+@@ -2122,18 +2124,19 @@
28+ {
29+ if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
30+ {
31+- if (seg_right != absolute_section || right != 0)
32++ if (!(seg_right == absolute_section && right == 0))
33+ {
34+ seg_left = seg_right;
35+ left = right;
36+ add_symbol = op_symbol;
37++ orig_add_symbol = expressionP->X_op_symbol;
38+ }
39+ op = O_symbol;
40+ break;
41+ }
42+ else if (op == O_left_shift || op == O_right_shift)
43+ {
44+- if (seg_left != absolute_section || left != 0)
45++ if (!(seg_left == absolute_section && left == 0))
46+ {
47+ op = O_symbol;
48+ break;
49+@@ -2149,6 +2152,7 @@
50+ seg_left = seg_right;
51+ left = right;
52+ add_symbol = op_symbol;
53++ orig_add_symbol = expressionP->X_op_symbol;
54+ op = O_symbol;
55+ break;
56+ }
57+@@ -2158,11 +2162,11 @@
58+ op = O_symbol;
59+ break;
60+ }
61+- else if (left != right
62+- || ((seg_left != reg_section || seg_right != reg_section)
63+- && (seg_left != undefined_section
64+- || seg_right != undefined_section
65+- || add_symbol != op_symbol)))
66++ else if (!(left == right
67++ && ((seg_left == reg_section && seg_right == reg_section)
68++ || (seg_left == undefined_section
69++ && seg_right == undefined_section
70++ && add_symbol == op_symbol))))
71+ return 0;
72+ else if (op == O_bit_and || op == O_bit_inclusive_or)
73+ {
74+@@ -2233,7 +2237,8 @@
75+ op = O_constant;
76+ else if (seg_left == reg_section && final_val == 0)
77+ op = O_register;
78+- else if (add_symbol != expressionP->X_add_symbol)
79++ else if (seg_left == undefined_section
80++ && add_symbol != orig_add_symbol)
81+ final_val += left;
82+ expressionP->X_add_symbol = add_symbol;
83+ }
+3-1
pkgs/development/tools/misc/binutils/default.nix
···1{stdenv, fetchurl, noSysDirs, cross ? null}:
23-let
4 basename = "binutils-2.20";
5in
6stdenv.mkDerivation rec {
···16 # RUNPATH instead of RPATH on binaries. This is important because
17 # RUNPATH can be overriden using LD_LIBRARY_PATH at runtime.
18 ./new-dtags.patch
0019 ];
2021 inherit noSysDirs;
···1{stdenv, fetchurl, noSysDirs, cross ? null}:
23+let
4 basename = "binutils-2.20";
5in
6stdenv.mkDerivation rec {
···16 # RUNPATH instead of RPATH on binaries. This is important because
17 # RUNPATH can be overriden using LD_LIBRARY_PATH at runtime.
18 ./new-dtags.patch
19+20+ ./as-pr10856.patch
21 ];
2223 inherit noSysDirs;