diff options
author | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-02-07 04:24:35 +0000 |
---|---|---|
committer | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-02-07 04:24:35 +0000 |
commit | 104643d0aac89dbfab348426507b57de942cc011 (patch) | |
tree | b28b6ba8a7e1b3b4cf63864604e679bd2b3b9938 /llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp | |
parent | dfe09b1b5bce82effc956c6b9b27f10bba3da1bb (diff) | |
download | bcm5719-llvm-104643d0aac89dbfab348426507b57de942cc011.tar.gz bcm5719-llvm-104643d0aac89dbfab348426507b57de942cc011.zip |
[Sparc] Emit correct relocations for PIC code when integrated assembler is used.
llvm-svn: 200961
Diffstat (limited to 'llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp')
-rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp index 6a42d281178..6c14e5adfc8 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp @@ -26,14 +26,19 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { case FK_Data_4: case FK_Data_8: return Value; + case Sparc::fixup_sparc_wplt30: case Sparc::fixup_sparc_call30: return (Value >> 2) & 0x3fffffff; case Sparc::fixup_sparc_br22: return (Value >> 2) & 0x3fffff; case Sparc::fixup_sparc_br19: return (Value >> 2) & 0x7ffff; + case Sparc::fixup_sparc_pc22: + case Sparc::fixup_sparc_got22: case Sparc::fixup_sparc_hi22: return (Value >> 10) & 0x3fffff; + case Sparc::fixup_sparc_pc10: + case Sparc::fixup_sparc_got10: case Sparc::fixup_sparc_lo10: return Value & 0x3ff; case Sparc::fixup_sparc_h44: @@ -72,6 +77,11 @@ namespace { { "fixup_sparc_l44", 20, 12, 0 }, { "fixup_sparc_hh", 10, 22, 0 }, { "fixup_sparc_hm", 22, 10, 0 }, + { "fixup_sparc_pc22", 10, 22, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_sparc_pc10", 22, 10, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_sparc_got22", 10, 22, 0 }, + { "fixup_sparc_got10", 22, 10, 0 }, + { "fixup_sparc_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel } }; if (Kind < FirstTargetFixupKind) @@ -82,6 +92,20 @@ namespace { return Infos[Kind - FirstTargetFixupKind]; } + void processFixupValue(const MCAssembler &Asm, + const MCAsmLayout &Layout, + const MCFixup &Fixup, + const MCFragment *DF, + MCValue & Target, + uint64_t &Value, + bool &IsResolved) { + switch ((Sparc::Fixups)Fixup.getKind()) { + default: break; + case Sparc::fixup_sparc_wplt30: IsResolved = false; break; + } + } + + bool mayNeedRelaxation(const MCInst &Inst) const { // FIXME. return false; |