binutils-gas-loc-view.patch 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. diff -rup binutils.orig/gas/symbols.c binutils-2.38/gas/symbols.c
  2. --- binutils.orig/gas/symbols.c 2022-03-09 11:43:34.706610216 +0000
  3. +++ binutils-2.38/gas/symbols.c 2022-03-09 11:45:57.540686508 +0000
  4. @@ -61,8 +61,10 @@ struct symbol_flags
  5. /* Whether the symbol can be re-defined. */
  6. unsigned int volatil : 1;
  7. - /* Whether the symbol is a forward reference. */
  8. + /* Whether the symbol is a forward reference, and whether such has
  9. + been determined. */
  10. unsigned int forward_ref : 1;
  11. + unsigned int forward_resolved : 1;
  12. /* This is set if the symbol is defined in an MRI common section.
  13. We handle such sections as single common symbols, so symbols
  14. @@ -202,7 +204,7 @@ static void *
  15. symbol_entry_find (htab_t table, const char *name)
  16. {
  17. hashval_t hash = htab_hash_string (name);
  18. - symbol_entry_t needle = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  19. + symbol_entry_t needle = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  20. hash, name, 0, 0, 0 } };
  21. return htab_find_with_hash (table, &needle, hash);
  22. }
  23. @@ -784,7 +786,9 @@ symbol_clone (symbolS *orgsymP, int repl
  24. symbolS *
  25. symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
  26. {
  27. - if (symbolP && !symbolP->flags.local_symbol)
  28. + if (symbolP
  29. + && !symbolP->flags.local_symbol
  30. + && !symbolP->flags.forward_resolved)
  31. {
  32. symbolS *orig_add_symbol = symbolP->x->value.X_add_symbol;
  33. symbolS *orig_op_symbol = symbolP->x->value.X_op_symbol;
  34. @@ -837,6 +841,7 @@ symbol_clone_if_forward_ref (symbolS *sy
  35. symbolP->x->value.X_add_symbol = add_symbol;
  36. symbolP->x->value.X_op_symbol = op_symbol;
  37. + symbolP->flags.forward_resolved = 1;
  38. }
  39. return symbolP;
  40. diff -rup binutils.orig/gas/testsuite/gas/elf/dwarf2-18.d binutils-2.38/gas/testsuite/gas/elf/dwarf2-18.d
  41. --- binutils.orig/gas/testsuite/gas/elf/dwarf2-18.d 2022-03-09 11:43:34.487611632 +0000
  42. +++ binutils-2.38/gas/testsuite/gas/elf/dwarf2-18.d 2022-03-09 11:48:03.298873228 +0000
  43. @@ -2,9 +2,8 @@
  44. #readelf: -x.rodata -wL
  45. #name: DWARF2 18
  46. # The am33 cr16 crx ft32 mn10 msp430 nds32 and rl78 targets do not evaluate the subtraction of symbols at assembly time.
  47. -# The mep targets turns some view computations into complex relocations.
  48. # The riscv targets do not support the subtraction of symbols.
  49. -#xfail: am3*-* cr16-* crx-* ft32*-* mep-* mn10*-* msp430-* nds32*-* riscv*-* rl78-*
  50. +#xfail: am3*-* cr16-* crx-* ft32*-* mn10*-* msp430-* nds32*-* riscv*-* rl78-*
  51. Hex dump of section '\.rodata':
  52. 0x00000000 0100 *.*
  53. --- binutils.orig/gas/dwarf2dbg.c 2022-03-10 09:13:18.516639363 +0000
  54. +++ binutils-2.38/gas/dwarf2dbg.c 2022-03-10 12:45:25.191933733 +0000
  55. @@ -402,18 +402,27 @@ set_or_check_view (struct line_entry *e,
  56. if (viewx.X_op != O_constant || viewx.X_add_number)
  57. {
  58. expressionS incv;
  59. + expressionS *p_view;
  60. if (!p->loc.u.view)
  61. - {
  62. - p->loc.u.view = symbol_temp_make ();
  63. - gas_assert (!S_IS_DEFINED (p->loc.u.view));
  64. - }
  65. + p->loc.u.view = symbol_temp_make ();
  66. memset (&incv, 0, sizeof (incv));
  67. incv.X_unsigned = 1;
  68. incv.X_op = O_symbol;
  69. incv.X_add_symbol = p->loc.u.view;
  70. incv.X_add_number = 1;
  71. + p_view = symbol_get_value_expression (p->loc.u.view);
  72. + if (p_view->X_op == O_constant || p_view->X_op == O_symbol)
  73. + {
  74. + /* If we can, constant fold increments so that a chain of
  75. + expressions v + 1 + 1 ... + 1 is not created.
  76. + resolve_expression isn't ideal for this purpose. The
  77. + base v might not be resolvable until later. */
  78. + incv.X_op = p_view->X_op;
  79. + incv.X_add_symbol = p_view->X_add_symbol;
  80. + incv.X_add_number = p_view->X_add_number + 1;
  81. + }
  82. if (viewx.X_op == O_constant)
  83. {