<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>