[GOLD] Fix powerpc64 optimization of TOC accesses
authorAlan Modra <amodra@gmail.com>
Tue, 17 Oct 2017 14:03:05 +0000 (00:33 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 17 Oct 2017 22:18:17 +0000 (08:48 +1030)
Fixes a thinko.  Given code that puts variables into the TOC (a bad
idea, but some see the TOC as a small data section) this bug could
result in an attempt to optimize a sequence that should not be
optimized.

* powerpc.cc (Target_powerpc::Scan::local): Correct dst_off
calculation for TOC16 relocs.
(Target_powerpc::Scan::global): Likewise.

gold/ChangeLog
gold/powerpc.cc

index 697a40ade1a26313b65c9ab5c6faaf5996d735fe..a47ae9677870b980bac049cc38b1dacf2d8a2a90 100644 (file)
@@ -1,3 +1,10 @@
+2017-10-18  Kyle Butt  <iteratee@google.com>
+           Alan Modra  <amodra@gmail.com>
+
+       * powerpc.cc (Target_powerpc::Scan::local): Correct dst_off
+       calculation for TOC16 relocs.
+       (Target_powerpc::Scan::global): Likewise.
+
 2017-09-26  Cary Coutant  <ccoutant@gmail.com>
 
        PR gold/22213
index c529dbf49275e4e088acc0f147e1f6049de1bc47..244c221ef5e423a903b244627f893668392253b3 100644 (file)
@@ -6917,7 +6917,7 @@ Target_powerpc<size, big_endian>::Scan::local(
          shndx = ppc_object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
          if (is_ordinary && shndx == ppc_object->toc_shndx())
            {
-             Address dst_off = lsym.get_st_value() + reloc.get_r_offset();
+             Address dst_off = lsym.get_st_value() + reloc.get_r_addend();
              if (dst_off < ppc_object->section_size(shndx))
                {
                  bool ok = false;
@@ -7591,7 +7591,7 @@ Target_powerpc<size, big_endian>::Scan::global(
              if (shndx == sym_object->toc_shndx())
                {
                  Sized_symbol<size>* sym = symtab->get_sized_symbol<size>(gsym);
-                 Address dst_off = sym->value() + reloc.get_r_offset();
+                 Address dst_off = sym->value() + reloc.get_r_addend();
                  if (dst_off < sym_object->section_size(shndx))
                    {
                      bool ok = false;
This page took 0.029048 seconds and 4 git commands to generate.