diff options
| author | Sean Fertile <sfertile@ca.ibm.com> | 2018-06-15 19:47:11 +0000 |
|---|---|---|
| committer | Sean Fertile <sfertile@ca.ibm.com> | 2018-06-15 19:47:11 +0000 |
| commit | 80b8f82f179a31f7fbc0f3076ebb681fdda3e504 (patch) | |
| tree | 46c7e2c22af6e6af03054f64d976fe53a004a858 /llvm/lib/Target | |
| parent | 72aed5e5dc7126be84a0d90063b441b6406b73f7 (diff) | |
| download | bcm5719-llvm-80b8f82f179a31f7fbc0f3076ebb681fdda3e504.tar.gz bcm5719-llvm-80b8f82f179a31f7fbc0f3076ebb681fdda3e504.zip | |
[PPC64] Support "symbol@high" and "symbol@higha" symbol modifers.
Add support for the "@high" and "@higha" symbol modifiers in powerpc64 assembly.
The modifiers represent accessing the segment consiting of bits 16-31 of a
64-bit address/offset.
Differential Revision: https://reviews.llvm.org/D47729
llvm-svn: 334855
Diffstat (limited to 'llvm/lib/Target')
4 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp index d6db354e021..581ca1a5f38 100644 --- a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp +++ b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp @@ -1394,6 +1394,12 @@ ExtractModifierFromExpr(const MCExpr *E, case MCSymbolRefExpr::VK_PPC_HA: Variant = PPCMCExpr::VK_PPC_HA; break; + case MCSymbolRefExpr::VK_PPC_HIGH: + Variant = PPCMCExpr::VK_PPC_HIGH; + break; + case MCSymbolRefExpr::VK_PPC_HIGHA: + Variant = PPCMCExpr::VK_PPC_HIGHA; + break; case MCSymbolRefExpr::VK_PPC_HIGHER: Variant = PPCMCExpr::VK_PPC_HIGHER; break; @@ -1973,6 +1979,10 @@ PPCAsmParser::applyModifierToExpr(const MCExpr *E, return PPCMCExpr::create(PPCMCExpr::VK_PPC_HI, E, false, Ctx); case MCSymbolRefExpr::VK_PPC_HA: return PPCMCExpr::create(PPCMCExpr::VK_PPC_HA, E, false, Ctx); + case MCSymbolRefExpr::VK_PPC_HIGH: + return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGH, E, false, Ctx); + case MCSymbolRefExpr::VK_PPC_HIGHA: + return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHA, E, false, Ctx); case MCSymbolRefExpr::VK_PPC_HIGHER: return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHER, E, false, Ctx); case MCSymbolRefExpr::VK_PPC_HIGHERA: diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp index 52bf5149d38..7315a73d286 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp @@ -55,6 +55,10 @@ static MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target, return MCSymbolRefExpr::VK_PPC_HI; case PPCMCExpr::VK_PPC_HA: return MCSymbolRefExpr::VK_PPC_HA; + case PPCMCExpr::VK_PPC_HIGH: + return MCSymbolRefExpr::VK_PPC_HIGH; + case PPCMCExpr::VK_PPC_HIGHA: + return MCSymbolRefExpr::VK_PPC_HIGHA; case PPCMCExpr::VK_PPC_HIGHERA: return MCSymbolRefExpr::VK_PPC_HIGHERA; case PPCMCExpr::VK_PPC_HIGHER: @@ -151,6 +155,12 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, case MCSymbolRefExpr::VK_PPC_HA: Type = ELF::R_PPC_ADDR16_HA; break; + case MCSymbolRefExpr::VK_PPC_HIGH: + Type = ELF::R_PPC64_ADDR16_HIGH; + break; + case MCSymbolRefExpr::VK_PPC_HIGHA: + Type = ELF::R_PPC64_ADDR16_HIGHA; + break; case MCSymbolRefExpr::VK_PPC_HIGHER: Type = ELF::R_PPC64_ADDR16_HIGHER; break; diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp index 54f66431457..32e6a0bdd65 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp @@ -44,6 +44,8 @@ void PPCMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { case VK_PPC_LO: OS << "@l"; break; case VK_PPC_HI: OS << "@h"; break; case VK_PPC_HA: OS << "@ha"; break; + case VK_PPC_HIGH: OS << "@high"; break; + case VK_PPC_HIGHA: OS << "@higha"; break; case VK_PPC_HIGHER: OS << "@higher"; break; case VK_PPC_HIGHERA: OS << "@highera"; break; case VK_PPC_HIGHEST: OS << "@highest"; break; @@ -75,6 +77,10 @@ PPCMCExpr::evaluateAsInt64(int64_t Value) const { return (Value >> 16) & 0xffff; case VK_PPC_HA: return ((Value + 0x8000) >> 16) & 0xffff; + case VK_PPC_HIGH: + return (Value >> 16) & 0xffff; + case VK_PPC_HIGHA: + return ((Value + 0x8000) >> 16) & 0xffff; case VK_PPC_HIGHER: return (Value >> 32) & 0xffff; case VK_PPC_HIGHERA: @@ -125,6 +131,12 @@ PPCMCExpr::evaluateAsRelocatableImpl(MCValue &Res, case VK_PPC_HA: Modifier = MCSymbolRefExpr::VK_PPC_HA; break; + case VK_PPC_HIGH: + Modifier = MCSymbolRefExpr::VK_PPC_HIGH; + break; + case VK_PPC_HIGHA: + Modifier = MCSymbolRefExpr::VK_PPC_HIGHA; + break; case VK_PPC_HIGHERA: Modifier = MCSymbolRefExpr::VK_PPC_HIGHERA; break; diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h index d42a111cc43..8bb4791d13d 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h @@ -23,6 +23,8 @@ public: VK_PPC_LO, VK_PPC_HI, VK_PPC_HA, + VK_PPC_HIGH, + VK_PPC_HIGHA, VK_PPC_HIGHER, VK_PPC_HIGHERA, VK_PPC_HIGHEST, |

