diff options
Diffstat (limited to 'llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp index 900c5fe30364..31a814900ca5 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/Twine.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/MC/MCAsmBackend.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCFixup.h" #include "llvm/MC/MCFixupKindInfo.h" @@ -26,9 +27,8 @@ namespace { class ARMWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter { public: - ARMWinCOFFObjectWriter(bool Is64Bit) + ARMWinCOFFObjectWriter() : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARMNT) { - assert(!Is64Bit && "AArch64 support not yet implemented"); } ~ARMWinCOFFObjectWriter() override = default; @@ -47,13 +47,20 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx, const MCFixup &Fixup, bool IsCrossSection, const MCAsmBackend &MAB) const { - assert(getMachine() == COFF::IMAGE_FILE_MACHINE_ARMNT && - "AArch64 support not yet implemented"); - MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); - switch (static_cast<unsigned>(Fixup.getKind())) { + unsigned FixupKind = Fixup.getKind(); + if (IsCrossSection) { + if (FixupKind != FK_Data_4) { + Ctx.reportError(Fixup.getLoc(), "Cannot represent this expression"); + return COFF::IMAGE_REL_ARM_ADDR32; + } + FixupKind = FK_PCRel_4; + } + + + switch (FixupKind) { default: { const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind()); report_fatal_error(Twine("unsupported relocation type: ") + Info.Name); @@ -67,6 +74,8 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx, default: return COFF::IMAGE_REL_ARM_ADDR32; } + case FK_PCRel_4: + return COFF::IMAGE_REL_ARM_REL32; case FK_SecRel_2: return COFF::IMAGE_REL_ARM_SECTION; case FK_SecRel_4: @@ -91,8 +100,8 @@ bool ARMWinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const { namespace llvm { std::unique_ptr<MCObjectTargetWriter> -createARMWinCOFFObjectWriter(bool Is64Bit) { - return std::make_unique<ARMWinCOFFObjectWriter>(Is64Bit); +createARMWinCOFFObjectWriter() { + return std::make_unique<ARMWinCOFFObjectWriter>(); } } // end namespace llvm |
