diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp | 173 |
1 files changed, 82 insertions, 91 deletions
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp index 50c6e67c6be..57b087d0006 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -509,126 +509,117 @@ getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, Mips::Fixups FixupKind = Mips::Fixups(0); switch (MipsExpr->getKind()) { - default: llvm_unreachable("Unsupported fixup kind for target expression!"); - case MipsMCExpr::VK_Mips_HIGHEST: - FixupKind = Mips::fixup_Mips_HIGHEST; + case MipsMCExpr::MEK_NEG: + case MipsMCExpr::MEK_None: + case MipsMCExpr::MEK_Special: + llvm_unreachable("Unhandled fixup kind!"); break; - case MipsMCExpr::VK_Mips_HIGHER: - FixupKind = Mips::fixup_Mips_HIGHER; + case MipsMCExpr::MEK_CALL_HI16: + FixupKind = Mips::fixup_Mips_CALL_HI16; break; - case MipsMCExpr::VK_Mips_HI: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 - : Mips::fixup_Mips_HI16; + case MipsMCExpr::MEK_CALL_LO16: + FixupKind = Mips::fixup_Mips_CALL_LO16; break; - case MipsMCExpr::VK_Mips_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 - : Mips::fixup_Mips_LO16; + case MipsMCExpr::MEK_DTPREL_HI: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 + : Mips::fixup_Mips_DTPREL_HI; break; - } - Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); - return 0; - } - - if (Kind == MCExpr::SymbolRef) { - Mips::Fixups FixupKind = Mips::Fixups(0); - - switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { - default: llvm_unreachable("Unknown fixup kind!"); + case MipsMCExpr::MEK_DTPREL_LO: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 + : Mips::fixup_Mips_DTPREL_LO; break; - case MCSymbolRefExpr::VK_None: - FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. + case MipsMCExpr::MEK_GOTTPREL: + FixupKind = Mips::fixup_Mips_GOTTPREL; + break; + case MipsMCExpr::MEK_GOT: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 + : Mips::fixup_Mips_GOT; break; - case MCSymbolRefExpr::VK_Mips_GPOFF_HI : - FixupKind = Mips::fixup_Mips_GPOFF_HI; + case MipsMCExpr::MEK_GOT_CALL: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 + : Mips::fixup_Mips_CALL16; break; - case MCSymbolRefExpr::VK_Mips_GPOFF_LO : - FixupKind = Mips::fixup_Mips_GPOFF_LO; + case MipsMCExpr::MEK_GOT_DISP: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP + : Mips::fixup_Mips_GOT_DISP; break; - case MCSymbolRefExpr::VK_Mips_GOT_PAGE : + case MipsMCExpr::MEK_GOT_HI16: + FixupKind = Mips::fixup_Mips_GOT_HI16; + break; + case MipsMCExpr::MEK_GOT_LO16: + FixupKind = Mips::fixup_Mips_GOT_LO16; + break; + case MipsMCExpr::MEK_GOT_PAGE: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_PAGE - : Mips::fixup_Mips_GOT_PAGE; + : Mips::fixup_Mips_GOT_PAGE; break; - case MCSymbolRefExpr::VK_Mips_GOT_OFST : + case MipsMCExpr::MEK_GOT_OFST: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_OFST - : Mips::fixup_Mips_GOT_OFST; - break; - case MCSymbolRefExpr::VK_Mips_GOT_DISP : - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP - : Mips::fixup_Mips_GOT_DISP; + : Mips::fixup_Mips_GOT_OFST; break; - case MCSymbolRefExpr::VK_Mips_GPREL: + case MipsMCExpr::MEK_GPREL: FixupKind = Mips::fixup_Mips_GPREL16; break; - case MCSymbolRefExpr::VK_Mips_GOT_CALL: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 - : Mips::fixup_Mips_CALL16; + case MipsMCExpr::MEK_LO: { + // Check for %lo(%neg(%gp_rel(X))) + if (MipsExpr->isGpOff()) { + FixupKind = Mips::fixup_Mips_GPOFF_LO; + break; + } + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 + : Mips::fixup_Mips_LO16; break; - case MCSymbolRefExpr::VK_Mips_GOT16: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 - : Mips::fixup_Mips_GOT_Global; + } + case MipsMCExpr::MEK_HIGHEST: + FixupKind = Mips::fixup_Mips_HIGHEST; break; - case MCSymbolRefExpr::VK_Mips_GOT: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 - : Mips::fixup_Mips_GOT_Local; + case MipsMCExpr::MEK_HIGHER: + FixupKind = Mips::fixup_Mips_HIGHER; break; - case MCSymbolRefExpr::VK_Mips_ABS_HI: + case MipsMCExpr::MEK_HI: + // Check for %hi(%neg(%gp_rel(X))) + if (MipsExpr->isGpOff()) { + FixupKind = Mips::fixup_Mips_GPOFF_HI; + break; + } FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 - : Mips::fixup_Mips_HI16; + : Mips::fixup_Mips_HI16; break; - case MCSymbolRefExpr::VK_Mips_ABS_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 - : Mips::fixup_Mips_LO16; + case MipsMCExpr::MEK_PCREL_HI16: + FixupKind = Mips::fixup_MIPS_PCHI16; break; - case MCSymbolRefExpr::VK_Mips_TLSGD: + case MipsMCExpr::MEK_PCREL_LO16: + FixupKind = Mips::fixup_MIPS_PCLO16; + break; + case MipsMCExpr::MEK_TLSGD: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD - : Mips::fixup_Mips_TLSGD; + : Mips::fixup_Mips_TLSGD; break; - case MCSymbolRefExpr::VK_Mips_TLSLDM: + case MipsMCExpr::MEK_TLSLDM: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_LDM - : Mips::fixup_Mips_TLSLDM; - break; - case MCSymbolRefExpr::VK_Mips_DTPREL_HI: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 - : Mips::fixup_Mips_DTPREL_HI; - break; - case MCSymbolRefExpr::VK_Mips_DTPREL_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 - : Mips::fixup_Mips_DTPREL_LO; - break; - case MCSymbolRefExpr::VK_Mips_GOTTPREL: - FixupKind = Mips::fixup_Mips_GOTTPREL; + : Mips::fixup_Mips_TLSLDM; break; - case MCSymbolRefExpr::VK_Mips_TPREL_HI: + case MipsMCExpr::MEK_TPREL_HI: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_HI16 - : Mips::fixup_Mips_TPREL_HI; + : Mips::fixup_Mips_TPREL_HI; break; - case MCSymbolRefExpr::VK_Mips_TPREL_LO: + case MipsMCExpr::MEK_TPREL_LO: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_LO16 - : Mips::fixup_Mips_TPREL_LO; - break; - case MCSymbolRefExpr::VK_Mips_HIGHER: - FixupKind = Mips::fixup_Mips_HIGHER; + : Mips::fixup_Mips_TPREL_LO; break; - case MCSymbolRefExpr::VK_Mips_HIGHEST: - FixupKind = Mips::fixup_Mips_HIGHEST; - break; - case MCSymbolRefExpr::VK_Mips_GOT_HI16: - FixupKind = Mips::fixup_Mips_GOT_HI16; - break; - case MCSymbolRefExpr::VK_Mips_GOT_LO16: - FixupKind = Mips::fixup_Mips_GOT_LO16; - break; - case MCSymbolRefExpr::VK_Mips_CALL_HI16: - FixupKind = Mips::fixup_Mips_CALL_HI16; - break; - case MCSymbolRefExpr::VK_Mips_CALL_LO16: - FixupKind = Mips::fixup_Mips_CALL_LO16; - break; - case MCSymbolRefExpr::VK_Mips_PCREL_HI16: - FixupKind = Mips::fixup_MIPS_PCHI16; + } + Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); + return 0; + } + + if (Kind == MCExpr::SymbolRef) { + Mips::Fixups FixupKind = Mips::Fixups(0); + + switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { + default: llvm_unreachable("Unknown fixup kind!"); break; - case MCSymbolRefExpr::VK_Mips_PCREL_LO16: - FixupKind = Mips::fixup_MIPS_PCLO16; + case MCSymbolRefExpr::VK_None: + FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. break; } // switch |