<div dir="ltr">Either this revision or r204293 breaks something again (in a different place, though). I'll post details once I have more information.<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 20, 2014 at 3:12 AM, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Wed Mar 19 21:12:01 2014<br>
New Revision: 204294<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=204294&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=204294&view=rev</a><br>
Log:<br>
Look through variables when computing relocations.<br>
<br>
Given<br>
<br>
bar = foo + 4<br>
        .long bar<br>
<br>
MC would eat the 4. GNU as includes it in the relocation. The rule seems to be<br>
that a variable that defines a symbol is used in the relocation and one that<br>
does not define a symbol is evaluated and the result included in the relocation.<br>
<br>
Fixing this unfortunately required some other changes:<br>
<br>
* Since the variable is now evaluated, it would prevent the ELF writer from<br>
  noticing the weakref marker the elf streamer uses. This patch then replaces<br>
  that with a VariantKind in MCSymbolRefExpr.<br>
<br>
* Using VariantKind then requires us to look past other VariantKind to see<br>
<br>
        .weakref        bar,foo<br>
        call    bar@PLT<br>
<br>
  doing this also fixes<br>
<br>
        zed = foo +2<br>
        call zed@PLT<br>
<br>
  so that is a good thing.<br>
<br>
* Looking past VariantKind means that the relocation selection has to use<br>
  the fixup instead of the target.<br>
<br>
This is a reboot of the previous fixes for MC. I will watch the sanitizer<br>
buildbot and wait for a build before adding back the previous fixes.<br>
<br>
Added:<br>
    llvm/trunk/lib/MC/MCFixup.cpp<br>
    llvm/trunk/test/MC/X86/reloc-undef-global.s<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h<br>
    llvm/trunk/include/llvm/MC/MCExpr.h<br>
    llvm/trunk/include/llvm/MC/MCFixup.h<br>
    llvm/trunk/lib/MC/CMakeLists.txt<br>
    llvm/trunk/lib/MC/ELFObjectWriter.cpp<br>
    llvm/trunk/lib/MC/MCELFStreamer.cpp<br>
    llvm/trunk/lib/MC/MCExpr.cpp<br>
    llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp<br>
    llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp<br>
    llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp<br>
    llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp<br>
    llvm/trunk/test/MC/ELF/relocation.s<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCELFSymbolFlags.h Wed Mar 19 21:12:01 2014<br>
@@ -51,8 +51,7 @@ namespace llvm {<br>
       ELF_STV_Hidden    = (ELF::STV_HIDDEN    << ELF_STV_Shift),<br>
       ELF_STV_Protected = (ELF::STV_PROTECTED << ELF_STV_Shift),<br>
<br>
-      ELF_Other_Weakref = (1                  << ELF_Other_Shift),<br>
-      ELF_Other_ThumbFunc = (2                << ELF_Other_Shift)<br>
+      ELF_Other_ThumbFunc = (1                << ELF_Other_Shift)<br>
   };<br>
<br>
 } // end namespace llvm<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCExpr.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCExpr.h?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCExpr.h?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCExpr.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCExpr.h Wed Mar 19 21:12:01 2014<br>
@@ -160,6 +160,7 @@ public:<br>
     VK_DTPOFF,<br>
     VK_TLVP,      // Mach-O thread local variable relocation<br>
     VK_SECREL,<br>
+    VK_WEAKREF,   // The link between the symbols in .weakref foo, bar<br>
<br>
     VK_ARM_NONE,<br>
     VK_ARM_TARGET1,<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCFixup.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFixup.h?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFixup.h?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCFixup.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCFixup.h Wed Mar 19 21:12:01 2014<br>
@@ -10,6 +10,7 @@<br>
 #ifndef LLVM_MC_MCFIXUP_H<br>
 #define LLVM_MC_MCFIXUP_H<br>
<br>
+#include "llvm/MC/MCExpr.h"<br>
 #include "llvm/Support/DataTypes.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/SMLoc.h"<br>
@@ -87,6 +88,8 @@ public:<br>
<br>
   MCFixupKind getKind() const { return MCFixupKind(Kind); }<br>
<br>
+  MCSymbolRefExpr::VariantKind getAccessVariant() const;<br>
+<br>
   uint32_t getOffset() const { return Offset; }<br>
   void setOffset(uint32_t Value) { Offset = Value; }<br>
<br>
<br>
Modified: llvm/trunk/lib/MC/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/CMakeLists.txt?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/CMakeLists.txt?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/MC/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/MC/CMakeLists.txt Wed Mar 19 21:12:01 2014<br>
@@ -16,6 +16,7 @@ add_llvm_library(LLVMMC<br>
   MCELF.cpp<br>
   MCELFObjectTargetWriter.cpp<br>
   MCELFStreamer.cpp<br>
+  MCFixup.cpp<br>
   MCFunction.cpp<br>
   MCExpr.cpp<br>
   MCExternalSymbolizer.cpp<br>
<br>
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Mar 19 21:12:01 2014<br>
@@ -778,7 +778,7 @@ void ELFObjectWriter::RecordRelocation(c<br>
         Index = 0;<br>
       }<br>
     } else {<br>
-      if (Asm.getSymbolData(Symbol).getFlags() & ELF_Other_Weakref)<br>
+      if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_WEAKREF)<br>
         WeakrefUsedInReloc.insert(RelocSymbol);<br>
       else<br>
         UsedInReloc.insert(RelocSymbol);<br>
@@ -823,8 +823,14 @@ ELFObjectWriter::getSymbolIndexInSymbolT<br>
 bool ELFObjectWriter::isInSymtab(const MCAssembler &Asm,<br>
                                  const MCSymbolData &Data,<br>
                                  bool Used, bool Renamed) {<br>
-  if (Data.getFlags() & ELF_Other_Weakref)<br>
-    return false;<br>
+  const MCSymbol &Symbol = Data.getSymbol();<br>
+  if (Symbol.isVariable()) {<br>
+    const MCExpr *Expr = Symbol.getVariableValue();<br>
+    if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {<br>
+      if (Ref->getKind() == MCSymbolRefExpr::VK_WEAKREF)<br>
+        return false;<br>
+    }<br>
+  }<br>
<br>
   if (Used)<br>
     return true;<br>
@@ -832,8 +838,6 @@ bool ELFObjectWriter::isInSymtab(const M<br>
   if (Renamed)<br>
     return false;<br>
<br>
-  const MCSymbol &Symbol = Data.getSymbol();<br>
-<br>
   if (Symbol.getName() == "_GLOBAL_OFFSET_TABLE_")<br>
     return true;<br>
<br>
<br>
Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCELFStreamer.cpp Wed Mar 19 21:12:01 2014<br>
@@ -99,9 +99,8 @@ void MCELFStreamer::ChangeSection(const<br>
<br>
 void MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {<br>
   getAssembler().getOrCreateSymbolData(*Symbol);<br>
-  MCSymbolData &AliasSD = getAssembler().getOrCreateSymbolData(*Alias);<br>
-  AliasSD.setFlags(AliasSD.getFlags() | ELF_Other_Weakref);<br>
-  const MCExpr *Value = MCSymbolRefExpr::Create(Symbol, getContext());<br>
+  const MCExpr *Value = MCSymbolRefExpr::Create(<br>
+      Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext());<br>
   Alias->setVariableValue(Value);<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/MC/MCExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCExpr.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCExpr.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/MC/MCExpr.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCExpr.cpp Wed Mar 19 21:12:01 2014<br>
@@ -180,6 +180,7 @@ StringRef MCSymbolRefExpr::getVariantKin<br>
   case VK_DTPOFF: return "DTPOFF";<br>
   case VK_TLVP: return "TLVP";<br>
   case VK_SECREL: return "SECREL32";<br>
+  case VK_WEAKREF: return "WEAKREF";<br>
   case VK_ARM_NONE: return "none";<br>
   case VK_ARM_TARGET1: return "target1";<br>
   case VK_ARM_TARGET2: return "target2";<br>
@@ -630,17 +631,31 @@ bool MCExpr::EvaluateAsRelocatableImpl(M<br>
   case SymbolRef: {<br>
     const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this);<br>
     const MCSymbol &Sym = SRE->getSymbol();<br>
+    const MCAsmInfo &MCAsmInfo = SRE->getMCAsmInfo();<br>
<br>
     // Evaluate recursively if this is a variable.<br>
-    if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None) {<br>
-      bool Ret = Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Asm,<br>
-                                                                   Layout,<br>
-                                                                   Addrs,<br>
-                                                                   true);<br>
-      // If we failed to simplify this to a constant, let the target<br>
-      // handle it.<br>
-      if (Ret && !Res.getSymA() && !Res.getSymB())<br>
-        return true;<br>
+    if (Sym.isVariable()) {<br>
+      if (Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Asm, Layout,<br>
+                                                            Addrs, true)) {<br>
+        const MCSymbolRefExpr *A = Res.getSymA();<br>
+        const MCSymbolRefExpr *B = Res.getSymB();<br>
+<br>
+        if (MCAsmInfo.hasSubsectionsViaSymbols()) {<br>
+          // FIXME: This is small hack. Given<br>
+          // a = b + 4<br>
+          // .long a<br>
+          // the OS X assembler will completely drop the 4. We should probably<br>
+          // include it in the relocation or produce an error if that is not<br>
+          // possible.<br>
+          if (!A && !B)<br>
+            return true;<br>
+        } else {<br>
+          bool IsSymbol = A && A->getSymbol().isDefined();<br>
+          bool IsWeakRef = SRE->getKind() == MCSymbolRefExpr::VK_WEAKREF;<br>
+          if (!IsSymbol && !IsWeakRef)<br>
+            return true;<br>
+        }<br>
+      }<br>
     }<br>
<br>
     Res = MCValue::get(SRE, 0, 0);<br>
<br>
Added: llvm/trunk/lib/MC/MCFixup.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCFixup.cpp?rev=204294&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCFixup.cpp?rev=204294&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/lib/MC/MCFixup.cpp (added)<br>
+++ llvm/trunk/lib/MC/MCFixup.cpp Wed Mar 19 21:12:01 2014<br>
@@ -0,0 +1,36 @@<br>
+//===- MCFixup.cpp - Assembly Fixup Implementation ------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/MC/MCFixup.h"<br>
+using namespace llvm;<br>
+<br>
+static MCSymbolRefExpr::VariantKind getAccessVariant(const MCExpr *Expr) {<br>
+  switch (Expr->getKind()) {<br>
+  case MCExpr::Unary:<br>
+  case MCExpr::Target:<br>
+    llvm_unreachable("unsupported");<br>
+<br>
+  case MCExpr::Constant:<br>
+    return MCSymbolRefExpr::VK_None;<br>
+<br>
+  case MCExpr::SymbolRef: {<br>
+    const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(Expr);<br>
+    return SRE->getKind();<br>
+  }<br>
+  case MCExpr::Binary: {<br>
+    const MCBinaryExpr *ABE = cast<MCBinaryExpr>(Expr);<br>
+    assert(getAccessVariant(ABE->getRHS()) == MCSymbolRefExpr::VK_None);<br>
+    return getAccessVariant(ABE->getLHS());<br>
+  }<br>
+  }<br>
+}<br>
+<br>
+MCSymbolRefExpr::VariantKind MCFixup::getAccessVariant() const {<br>
+  return ::getAccessVariant(getValue());<br>
+}<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp Wed Mar 19 21:12:01 2014<br>
@@ -71,17 +71,16 @@ const MCSymbol *ARMELFObjectWriter::Expl<br>
   bool InNormalSection = true;<br>
   unsigned RelocType = 0;<br>
   RelocType = GetRelocTypeInner(Target, Fixup, IsPCRel);<br>
+  assert(!Target.getSymB() ||<br>
+         Target.getSymB()->getKind() == MCSymbolRefExpr::VK_None);<br>
<br>
   DEBUG(<br>
-      const MCSymbolRefExpr::VariantKind Kind = Target.getSymA()->getKind();<br>
-      MCSymbolRefExpr::VariantKind Kind2;<br>
-      Kind2 = Target.getSymB() ?  Target.getSymB()->getKind() :<br>
-        MCSymbolRefExpr::VK_None;<br>
+      MCSymbolRefExpr::VariantKind Kind = Fixup.getAccessVariant();<br>
       dbgs() << "considering symbol "<br>
         << Section.getSectionName() << "/"<br>
         << Symbol.getName() << "/"<br>
         << " Rel:" << (unsigned)RelocType<br>
-        << " Kind: " << (int)Kind << "/" << (int)Kind2<br>
+        << " Kind: " << (int)Kind<br>
         << " Tmp:"<br>
         << Symbol.isAbsolute() << "/" << Symbol.isDefined() << "/"<br>
         << Symbol.isVariable() << "/" << Symbol.isTemporary()<br>
@@ -152,8 +151,7 @@ unsigned ARMELFObjectWriter::GetRelocTyp<br>
 unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,<br>
                                                const MCFixup &Fixup,<br>
                                                bool IsPCRel) const  {<br>
-  MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?<br>
-    MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();<br>
+  MCSymbolRefExpr::VariantKind Modifier = Fixup.getAccessVariant();<br>
<br>
   unsigned Type = 0;<br>
   if (IsPCRel) {<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp Wed Mar 19 21:12:01 2014<br>
@@ -9,6 +9,7 @@<br>
<br>
 #include "MCTargetDesc/PPCMCTargetDesc.h"<br>
 #include "MCTargetDesc/PPCFixupKinds.h"<br>
+#include "MCTargetDesc/PPCMCExpr.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/MC/MCELFObjectWriter.h"<br>
 #include "llvm/MC/MCExpr.h"<br>
@@ -49,12 +50,37 @@ PPCELFObjectWriter::PPCELFObjectWriter(b<br>
 PPCELFObjectWriter::~PPCELFObjectWriter() {<br>
 }<br>
<br>
+static MCSymbolRefExpr::VariantKind getAccessVariant(const MCFixup &Fixup) {<br>
+  const MCExpr *Expr = Fixup.getValue();<br>
+<br>
+  if (Expr->getKind() != MCExpr::Target)<br>
+    return Fixup.getAccessVariant();<br>
+<br>
+  switch (cast<PPCMCExpr>(Expr)->getKind()) {<br>
+  case PPCMCExpr::VK_PPC_None:<br>
+    return MCSymbolRefExpr::VK_None;<br>
+  case PPCMCExpr::VK_PPC_LO:<br>
+    return MCSymbolRefExpr::VK_PPC_LO;<br>
+  case PPCMCExpr::VK_PPC_HI:<br>
+    return MCSymbolRefExpr::VK_PPC_HI;<br>
+  case PPCMCExpr::VK_PPC_HA:<br>
+    return MCSymbolRefExpr::VK_PPC_HA;<br>
+  case PPCMCExpr::VK_PPC_HIGHERA:<br>
+    return MCSymbolRefExpr::VK_PPC_HIGHERA;<br>
+  case PPCMCExpr::VK_PPC_HIGHER:<br>
+    return MCSymbolRefExpr::VK_PPC_HIGHER;<br>
+  case PPCMCExpr::VK_PPC_HIGHEST:<br>
+    return MCSymbolRefExpr::VK_PPC_HIGHEST;<br>
+  case PPCMCExpr::VK_PPC_HIGHESTA:<br>
+    return MCSymbolRefExpr::VK_PPC_HIGHESTA;<br>
+  }<br>
+}<br>
+<br>
 unsigned PPCELFObjectWriter::getRelocTypeInner(const MCValue &Target,<br>
                                                const MCFixup &Fixup,<br>
                                                bool IsPCRel) const<br>
 {<br>
-  MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?<br>
-    MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();<br>
+  MCSymbolRefExpr::VariantKind Modifier = getAccessVariant(Fixup);<br>
<br>
   // determine the type of the relocation<br>
   unsigned Type;<br>
@@ -368,8 +394,7 @@ const MCSymbol *PPCELFObjectWriter::Expl<br>
                                                    const MCFixup &Fixup,<br>
                                                    bool IsPCRel) const {<br>
   assert(Target.getSymA() && "SymA cannot be 0");<br>
-  MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?<br>
-    MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();<br>
+  MCSymbolRefExpr::VariantKind Modifier = Fixup.getAccessVariant();<br>
<br>
   bool EmitThisSym;<br>
   switch (Modifier) {<br>
<br>
Modified: llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp Wed Mar 19 21:12:01 2014<br>
@@ -88,9 +88,7 @@ unsigned SystemZObjectWriter::GetRelocTy<br>
                                            bool IsPCRel,<br>
                                            bool IsRelocWithSymbol,<br>
                                            int64_t Addend) const {<br>
-  MCSymbolRefExpr::VariantKind Modifier = (Target.isAbsolute() ?<br>
-                                           MCSymbolRefExpr::VK_None :<br>
-                                           Target.getSymA()->getKind());<br>
+  MCSymbolRefExpr::VariantKind Modifier = Fixup.getAccessVariant();<br>
   unsigned Kind = Fixup.getKind();<br>
   switch (Modifier) {<br>
   case MCSymbolRefExpr::VK_None:<br>
<br>
Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp Wed Mar 19 21:12:01 2014<br>
@@ -46,8 +46,7 @@ unsigned X86ELFObjectWriter::GetRelocTyp<br>
                                           int64_t Addend) const {<br>
   // determine the type of the relocation<br>
<br>
-  MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?<br>
-    MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();<br>
+  MCSymbolRefExpr::VariantKind Modifier = Fixup.getAccessVariant();<br>
   unsigned Type;<br>
   if (getEMachine() == ELF::EM_X86_64) {<br>
     if (IsPCRel) {<br>
<br>
Modified: llvm/trunk/test/MC/ELF/relocation.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/relocation.s?rev=204294&r1=204293&r2=204294&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/relocation.s?rev=204294&r1=204293&r2=204294&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/MC/ELF/relocation.s (original)<br>
+++ llvm/trunk/test/MC/ELF/relocation.s Wed Mar 19 21:12:01 2014<br>
@@ -25,6 +25,9 @@ bar:<br>
        .word   foo-bar<br>
        .byte   foo-bar<br>
<br>
+       zed = foo +2<br>
+       call zed@PLT<br>
+<br>
 // CHECK:        Section {<br>
 // CHECK:          Name: .rela.text<br>
 // CHECK:          Relocations [<br>
@@ -49,6 +52,7 @@ bar:<br>
 // CHECK-NEXT:       0x85 R_X86_64_TPOFF64 baz 0x0<br>
 // CHECK-NEXT:       0x8D R_X86_64_PC16 foo 0x8D<br>
 // CHECK-NEXT:       0x8F R_X86_64_PC8 foo 0x8F<br>
+// CHECK-NEXT:       0x91 R_X86_64_PLT32 foo 0xFFFFFFFFFFFFFFFE<br>
 // CHECK-NEXT:     ]<br>
 // CHECK-NEXT:   }<br>
<br>
<br>
Added: llvm/trunk/test/MC/X86/reloc-undef-global.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/reloc-undef-global.s?rev=204294&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/reloc-undef-global.s?rev=204294&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/test/MC/X86/reloc-undef-global.s (added)<br>
+++ llvm/trunk/test/MC/X86/reloc-undef-global.s Wed Mar 19 21:12:01 2014<br>
@@ -0,0 +1,20 @@<br>
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux %s -o - | llvm-readobj -r | FileCheck --check-prefix=ELF %s<br>
+// RUN: llvm-mc -filetype=obj -triple x86_64-apple-darwin %s -o - | llvm-readobj -r | FileCheck --check-prefix=MACHO %s<br>
+<br>
+<br>
+bar = foo + 4<br>
+       .globl bar<br>
+       .long bar<br>
+<br>
+// ELF:      Relocations [<br>
+// ELF-NEXT:   Section (2) .rela.text {<br>
+// ELF-NEXT:     0x0 R_X86_64_32 foo 0x4<br>
+// ELF-NEXT:   }<br>
+// ELF-NEXT: ]<br>
+<br>
+<br>
+// MACHO: Relocations [<br>
+// MACHO:   Section __text {<br>
+// MACHO:     0x0 0 2 1 X86_64_RELOC_UNSIGNED 0 bar<br>
+// MACHO:   }<br>
+// MACHO: ]<br><br></blockquote></div>
</div></div>