diff options
Diffstat (limited to 'lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp')
| -rw-r--r-- | lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp index d06c5e8862ae..7ea7d5f2a20e 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp @@ -8,6 +8,7 @@ //===---------------------------------------------------------------------===// #include "MCTargetDesc/AArch64FixupKinds.h" +#include "MCTargetDesc/AArch64MCExpr.h" #include "llvm/ADT/Twine.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/MC/MCAsmBackend.h" @@ -46,6 +47,7 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType( bool IsCrossSection, const MCAsmBackend &MAB) const { auto Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); + const MCExpr *Expr = Fixup.getValue(); switch (static_cast<unsigned>(Fixup.getKind())) { default: { @@ -73,6 +75,13 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType( return COFF::IMAGE_REL_ARM64_SECREL; case AArch64::fixup_aarch64_add_imm12: + if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) { + AArch64MCExpr::VariantKind RefKind = A64E->getKind(); + if (RefKind == AArch64MCExpr::VK_SECREL_LO12) + return COFF::IMAGE_REL_ARM64_SECREL_LOW12A; + if (RefKind == AArch64MCExpr::VK_SECREL_HI12) + return COFF::IMAGE_REL_ARM64_SECREL_HIGH12A; + } return COFF::IMAGE_REL_ARM64_PAGEOFFSET_12A; case AArch64::fixup_aarch64_ldst_imm12_scale1: @@ -80,11 +89,25 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType( case AArch64::fixup_aarch64_ldst_imm12_scale4: case AArch64::fixup_aarch64_ldst_imm12_scale8: case AArch64::fixup_aarch64_ldst_imm12_scale16: + if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) { + AArch64MCExpr::VariantKind RefKind = A64E->getKind(); + if (RefKind == AArch64MCExpr::VK_SECREL_LO12) + return COFF::IMAGE_REL_ARM64_SECREL_LOW12L; + } return COFF::IMAGE_REL_ARM64_PAGEOFFSET_12L; + case AArch64::fixup_aarch64_pcrel_adr_imm21: + return COFF::IMAGE_REL_ARM64_REL21; + case AArch64::fixup_aarch64_pcrel_adrp_imm21: return COFF::IMAGE_REL_ARM64_PAGEBASE_REL21; + case AArch64::fixup_aarch64_pcrel_branch14: + return COFF::IMAGE_REL_ARM64_BRANCH14; + + case AArch64::fixup_aarch64_pcrel_branch19: + return COFF::IMAGE_REL_ARM64_BRANCH19; + case AArch64::fixup_aarch64_pcrel_branch26: case AArch64::fixup_aarch64_pcrel_call26: return COFF::IMAGE_REL_ARM64_BRANCH26; @@ -97,10 +120,8 @@ bool AArch64WinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const { namespace llvm { -std::unique_ptr<MCObjectWriter> -createAArch64WinCOFFObjectWriter(raw_pwrite_stream &OS) { - auto MOTW = llvm::make_unique<AArch64WinCOFFObjectWriter>(); - return createWinCOFFObjectWriter(std::move(MOTW), OS); +std::unique_ptr<MCObjectTargetWriter> createAArch64WinCOFFObjectWriter() { + return llvm::make_unique<AArch64WinCOFFObjectWriter>(); } } // end namespace llvm |
