mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-02 18:42:36 +00:00
[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:
parent
160f9b9c10
commit
76fcace66e
@ -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
|
||||||
/// @{
|
/// @{
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user