[MC] Pass MCSymbolData to needsRelocateWithSymbol

As discussed in a previous checking to support the .localentry
directive on PowerPC, we need to inspect the actual target symbol
in needsRelocateWithSymbol to make the appropriate decision based
on that symbol's st_other bits.

Currently, needsRelocateWithSymbol does not get the target symbol.
However, it is directly available to its sole caller.  This patch
therefore simply extends the needsRelocateWithSymbol by a new
parameter "const MCSymbolData &SD", passes in the target symbol,
and updates all derived implementations.

In particular, in the PowerPC implementation, this patch removes
the FIXME added by the previous checkin.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213487 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ulrich Weigand 2014-07-20 23:15:06 +00:00
parent 160f9b9c10
commit 76fcace66e
7 changed files with 38 additions and 13 deletions

View File

@ -22,6 +22,7 @@ class MCFragment;
class MCObjectWriter; class MCObjectWriter;
class MCSectionData; class MCSectionData;
class MCSymbol; class MCSymbol;
class MCSymbolData;
class MCValue; class MCValue;
class MCELFObjectTargetWriter { class MCELFObjectTargetWriter {
@ -54,7 +55,8 @@ public:
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
bool IsPCRel) const = 0; bool IsPCRel) const = 0;
virtual bool needsRelocateWithSymbol(unsigned Type) const; virtual bool needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const;
/// @name Accessors /// @name Accessors
/// @{ /// @{

View File

@ -782,7 +782,7 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
if (Asm.isThumbFunc(&Sym)) if (Asm.isThumbFunc(&Sym))
return true; return true;
if (TargetObjectWriter->needsRelocateWithSymbol(Type)) if (TargetObjectWriter->needsRelocateWithSymbol(*SD, Type))
return true; return true;
return false; return false;
} }

View File

@ -24,6 +24,7 @@ MCELFObjectTargetWriter::MCELFObjectTargetWriter(bool Is64Bit_,
IsN64(IsN64_){ IsN64(IsN64_){
} }
bool MCELFObjectTargetWriter::needsRelocateWithSymbol(unsigned Type) const { bool MCELFObjectTargetWriter::needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const {
return false; return false;
} }

View File

@ -37,7 +37,8 @@ namespace {
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
bool IsPCRel) const override; bool IsPCRel) const override;
bool needsRelocateWithSymbol(unsigned Type) const override; bool needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const override;
}; };
} }
@ -48,7 +49,8 @@ ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
ARMELFObjectWriter::~ARMELFObjectWriter() {} ARMELFObjectWriter::~ARMELFObjectWriter() {}
bool ARMELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const { bool ARMELFObjectWriter::needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const {
// FIXME: This is extremelly conservative. This really needs to use a // FIXME: This is extremelly conservative. This really needs to use a
// whitelist with a clear explanation for why each realocation needs to // whitelist with a clear explanation for why each realocation needs to
// point to the symbol, not to the section. // point to the symbol, not to the section.

View File

@ -30,7 +30,8 @@ namespace {
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
bool IsPCRel) const override; bool IsPCRel) const override;
bool needsRelocateWithSymbol(unsigned Type) const override; bool needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const override;
}; };
} }
@ -216,7 +217,8 @@ unsigned MipsELFObjectWriter::GetRelocType(const MCValue &Target,
} }
bool bool
MipsELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const { MipsELFObjectWriter::needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const {
// FIXME: This is extremelly conservative. This really needs to use a // FIXME: This is extremelly conservative. This really needs to use a
// whitelist with a clear explanation for why each realocation needs to // whitelist with a clear explanation for why each realocation needs to
// point to the symbol, not to the section. // point to the symbol, not to the section.

View File

@ -11,6 +11,7 @@
#include "MCTargetDesc/PPCFixupKinds.h" #include "MCTargetDesc/PPCFixupKinds.h"
#include "MCTargetDesc/PPCMCExpr.h" #include "MCTargetDesc/PPCMCExpr.h"
#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLExtras.h"
#include "llvm/MC/MCELF.h"
#include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCELFObjectWriter.h"
#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCValue.h" #include "llvm/MC/MCValue.h"
@ -31,7 +32,8 @@ namespace {
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
bool IsPCRel) const override; bool IsPCRel) const override;
bool needsRelocateWithSymbol(unsigned Type) const override; bool needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const override;
}; };
} }
@ -389,16 +391,20 @@ unsigned PPCELFObjectWriter::GetRelocType(const MCValue &Target,
return getRelocTypeInner(Target, Fixup, IsPCRel); return getRelocTypeInner(Target, Fixup, IsPCRel);
} }
bool PPCELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const { bool PPCELFObjectWriter::needsRelocateWithSymbol(const MCSymbolData &SD,
unsigned Type) const {
switch (Type) { switch (Type) {
default: default:
return false; return false;
case ELF::R_PPC_REL24: case ELF::R_PPC_REL24:
// FIXME: We only need to keep the target symbol of the relocation // If the target symbol has a local entry point, we must keep the
// if the symbol uses a local entry point. Unfortunately, we do not // target symbol to preserve that information for the linker.
// have access to the symbol here ... // The "other" values are stored in the last 6 bits of the second byte.
return true; // The traditional defines for STO values assume the full byte and thus
// the shift to pack it.
unsigned Other = MCELF::getOther(SD) << 2;
return (Other & ELF::STO_PPC64_LOCAL_MASK) != 0;
} }
} }

View File

@ -27,6 +27,14 @@ caller:
nop nop
.size caller, .-caller .size caller, .-caller
.section .text.other
caller_other:
bl callee1
nop
bl callee2
nop
.size caller_other, .-caller_other
# Verify that use of .localentry implies ABI version 2 # Verify that use of .localentry implies ABI version 2
# CHECK: ElfHeader { # CHECK: ElfHeader {
# CHECK: Flags [ (0x2) # CHECK: Flags [ (0x2)
@ -38,6 +46,10 @@ caller:
# CHECK-NEXT: R_PPC64_REL24 callee1 # CHECK-NEXT: R_PPC64_REL24 callee1
# CHECK-NEXT: } # CHECK-NEXT: }
# CHECK-NOT: R_PPC64_REL24 callee2 # CHECK-NOT: R_PPC64_REL24 callee2
# CHECK: Section ({{[0-9]*}}) .rela.text.other {
# CHECK-NEXT: R_PPC64_REL24 callee1
# CHECK-NEXT: R_PPC64_REL24 .text
# CHECK-NEXT: }
# Verify that .localentry is encoded in the Other field. # Verify that .localentry is encoded in the Other field.
# CHECK: Symbols [ # CHECK: Symbols [