Look through variables when computing relocations.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 20 Mar 2014 02:12:01 +0000 (02:12 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 20 Mar 2014 02:12:01 +0000 (02:12 +0000)
commit0a70f9b3b9b4a8cb92f187ea0563c1a2ac784e6e
tree604d2275b5eaa7fcf7ab29930dec3b9d1d1027ca
parent5a8743ef85343b8399810a5b82db7ac4c6a7548c
Look through variables when computing relocations.

Given

bar = foo + 4
.long bar

MC would eat the 4. GNU as includes it in the relocation. The rule seems to be
that a variable that defines a symbol is used in the relocation and one that
does not define a symbol is evaluated and the result included in the relocation.

Fixing this unfortunately required some other changes:

* Since the variable is now evaluated, it would prevent the ELF writer from
  noticing the weakref marker the elf streamer uses. This patch then replaces
  that with a VariantKind in MCSymbolRefExpr.

* Using VariantKind then requires us to look past other VariantKind to see

.weakref bar,foo
call bar@PLT

  doing this also fixes

zed = foo +2
call zed@PLT

  so that is a good thing.

* Looking past VariantKind means that the relocation selection has to use
  the fixup instead of the target.

This is a reboot of the previous fixes for MC. I will watch the sanitizer
buildbot and wait for a build before adding back the previous fixes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204294 91177308-0d34-0410-b5e6-96231b3b80d8
14 files changed:
include/llvm/MC/MCELFSymbolFlags.h
include/llvm/MC/MCExpr.h
include/llvm/MC/MCFixup.h
lib/MC/CMakeLists.txt
lib/MC/ELFObjectWriter.cpp
lib/MC/MCELFStreamer.cpp
lib/MC/MCExpr.cpp
lib/MC/MCFixup.cpp [new file with mode: 0644]
lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp
lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp
lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
test/MC/ELF/relocation.s
test/MC/X86/reloc-undef-global.s [new file with mode: 0644]