diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-01-13 22:56:57 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-01-13 22:56:57 +0000 |
commit | 8340f94df1cab1e278e764967e78f3ec6cbf6bcc (patch) | |
tree | dd1a30c1f0cbc75dafcda9663b8f51475b35523e /llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp | |
parent | 3dd0ff3b627b974019b837cc5f991d7253324bc5 (diff) | |
download | bcm5719-llvm-8340f94df1cab1e278e764967e78f3ec6cbf6bcc.tar.gz bcm5719-llvm-8340f94df1cab1e278e764967e78f3ec6cbf6bcc.zip |
Convert a few assert failures into proper errors.
Fixes PR25944.
llvm-svn: 257697
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp index 736c39dfb6f..f2e519aef3b 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -9,6 +9,7 @@ #include "MCTargetDesc/X86FixupKinds.h" #include "MCTargetDesc/X86MCTargetDesc.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCValue.h" @@ -25,8 +26,8 @@ namespace { ~X86ELFObjectWriter() override; protected: - unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, - bool IsPCRel) const override; + unsigned getRelocType(MCContext &Ctx, const MCValue &Target, + const MCFixup &Fixup, bool IsPCRel) const override; }; } @@ -77,7 +78,14 @@ static X86_64RelType getType64(unsigned Kind, } } -static unsigned getRelocType64(MCSymbolRefExpr::VariantKind Modifier, +static void checkIs32(MCContext &Ctx, SMLoc Loc, X86_64RelType Type) { + if (Type != RT64_32) + Ctx.reportError(Loc, + "32 bit reloc applied to a field with a different size"); +} + +static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, + MCSymbolRefExpr::VariantKind Modifier, X86_64RelType Type, bool IsPCRel) { switch (Modifier) { default: @@ -147,19 +155,19 @@ static unsigned getRelocType64(MCSymbolRefExpr::VariantKind Modifier, llvm_unreachable("Unimplemented"); } case MCSymbolRefExpr::VK_TLSGD: - assert(Type == RT64_32); + checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_TLSGD; case MCSymbolRefExpr::VK_GOTTPOFF: - assert(Type == RT64_32); + checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_GOTTPOFF; case MCSymbolRefExpr::VK_TLSLD: - assert(Type == RT64_32); + checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_TLSLD; case MCSymbolRefExpr::VK_PLT: - assert(Type == RT64_32); + checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_PLT32; case MCSymbolRefExpr::VK_GOTPCREL: - assert(Type == RT64_32); + checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_GOTPCREL; } } @@ -240,13 +248,13 @@ static unsigned getRelocType32(MCSymbolRefExpr::VariantKind Modifier, } } -unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, +unsigned X86ELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); X86_64RelType Type = getType64(Fixup.getKind(), Modifier, IsPCRel); if (getEMachine() == ELF::EM_X86_64) - return getRelocType64(Modifier, Type, IsPCRel); + return getRelocType64(Ctx, Fixup.getLoc(), Modifier, Type, IsPCRel); assert((getEMachine() == ELF::EM_386 || getEMachine() == ELF::EM_IAMCU) && "Unsupported ELF machine type."); |