binutils: Apply GNU assembler bug fix.

svn path=/nixpkgs/branches/stdenv-updates/; revision=18815

+86 -1
+83
pkgs/development/tools/misc/binutils/as-pr10856.patch
··· 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 1 {stdenv, fetchurl, noSysDirs, cross ? null}: 2 2 3 - let 3 + let 4 4 basename = "binutils-2.20"; 5 5 in 6 6 stdenv.mkDerivation rec { ··· 16 16 # RUNPATH instead of RPATH on binaries. This is important because 17 17 # RUNPATH can be overriden using LD_LIBRARY_PATH at runtime. 18 18 ./new-dtags.patch 19 + 20 + ./as-pr10856.patch 19 21 ]; 20 22 21 23 inherit noSysDirs;