···11+Fix a regression in GNU as:
22+http://sourceware.org/bugzilla/show_bug.cgi?id=10856 .
33+44+The bug appears to be responsible for invalid code generated for
55+Crypto++:
66+http://groups.google.com/group/cryptopp-users/browse_thread/thread/7ce734e479586640/29c6649b7c7adee2?#29c6649b7c7adee2 .
77+88+diff -u -r1.77.2.1 -r1.77.2.2
99+--- a/src/gas/expr.c 2009/09/11 15:28:43 1.77.2.1
1010++++ b/src/gas/expr.c 2009/10/28 08:23:48 1.77.2.2
1111+@@ -1997,6 +1997,7 @@
1212+ /* Help out with CSE. */
1313+ valueT final_val = expressionP->X_add_number;
1414+ symbolS *add_symbol = expressionP->X_add_symbol;
1515++ symbolS *orig_add_symbol = add_symbol;
1616+ symbolS *op_symbol = expressionP->X_op_symbol;
1717+ operatorT op = expressionP->X_op;
1818+ valueT left, right;
1919+@@ -2078,6 +2079,7 @@
2020+ left = right;
2121+ seg_left = seg_right;
2222+ add_symbol = op_symbol;
2323++ orig_add_symbol = expressionP->X_op_symbol;
2424+ op = O_symbol;
2525+ break;
2626+ }
2727+@@ -2122,18 +2124,19 @@
2828+ {
2929+ if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
3030+ {
3131+- if (seg_right != absolute_section || right != 0)
3232++ if (!(seg_right == absolute_section && right == 0))
3333+ {
3434+ seg_left = seg_right;
3535+ left = right;
3636+ add_symbol = op_symbol;
3737++ orig_add_symbol = expressionP->X_op_symbol;
3838+ }
3939+ op = O_symbol;
4040+ break;
4141+ }
4242+ else if (op == O_left_shift || op == O_right_shift)
4343+ {
4444+- if (seg_left != absolute_section || left != 0)
4545++ if (!(seg_left == absolute_section && left == 0))
4646+ {
4747+ op = O_symbol;
4848+ break;
4949+@@ -2149,6 +2152,7 @@
5050+ seg_left = seg_right;
5151+ left = right;
5252+ add_symbol = op_symbol;
5353++ orig_add_symbol = expressionP->X_op_symbol;
5454+ op = O_symbol;
5555+ break;
5656+ }
5757+@@ -2158,11 +2162,11 @@
5858+ op = O_symbol;
5959+ break;
6060+ }
6161+- else if (left != right
6262+- || ((seg_left != reg_section || seg_right != reg_section)
6363+- && (seg_left != undefined_section
6464+- || seg_right != undefined_section
6565+- || add_symbol != op_symbol)))
6666++ else if (!(left == right
6767++ && ((seg_left == reg_section && seg_right == reg_section)
6868++ || (seg_left == undefined_section
6969++ && seg_right == undefined_section
7070++ && add_symbol == op_symbol))))
7171+ return 0;
7272+ else if (op == O_bit_and || op == O_bit_inclusive_or)
7373+ {
7474+@@ -2233,7 +2237,8 @@
7575+ op = O_constant;
7676+ else if (seg_left == reg_section && final_val == 0)
7777+ op = O_register;
7878+- else if (add_symbol != expressionP->X_add_symbol)
7979++ else if (seg_left == undefined_section
8080++ && add_symbol != orig_add_symbol)
8181+ final_val += left;
8282+ expressionP->X_add_symbol = add_symbol;
8383+ }
+3-1
pkgs/development/tools/misc/binutils/default.nix
···11{stdenv, fetchurl, noSysDirs, cross ? null}:
2233-let
33+let
44 basename = "binutils-2.20";
55in
66stdenv.mkDerivation rec {
···1616 # RUNPATH instead of RPATH on binaries. This is important because
1717 # RUNPATH can be overriden using LD_LIBRARY_PATH at runtime.
1818 ./new-dtags.patch
1919+2020+ ./as-pr10856.patch
1921 ];
20222123 inherit noSysDirs;