Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp =================================================================== --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp @@ -11,6 +11,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" @@ -92,6 +93,8 @@ AArch64MCExpr::VariantKind RefKind = A64E->getKind(); if (RefKind == AArch64MCExpr::VK_SECREL_LO12) return COFF::IMAGE_REL_ARM64_SECREL_LOW12L; + if (RefKind & AArch64MCExpr::VK_GOT) + Ctx.reportError(Fixup.getLoc(), "unknown AArch64 symbol kind!"); } return COFF::IMAGE_REL_ARM64_PAGEOFFSET_12L; @@ -99,6 +102,11 @@ return COFF::IMAGE_REL_ARM64_REL21; case AArch64::fixup_aarch64_pcrel_adrp_imm21: + if (const AArch64MCExpr *A64E = dyn_cast(Expr)) { + AArch64MCExpr::VariantKind RefKind = A64E->getKind(); + if (RefKind & AArch64MCExpr::VK_GOT) + Ctx.reportError(Fixup.getLoc(), "unknown AArch64 symbol kind!"); + } return COFF::IMAGE_REL_ARM64_PAGEBASE_REL21; case AArch64::fixup_aarch64_pcrel_branch14: Index: llvm/test/MC/AArch64/coff-relocations-diags.s =================================================================== --- /dev/null +++ llvm/test/MC/AArch64/coff-relocations-diags.s @@ -0,0 +1,11 @@ +// RUN: not llvm-mc -triple aarch64-win32 -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s + + adrp x0, :got:symbol + // CHECK: error: unknown AArch64 symbol kind! + // CHECK-NEXT: adrp x0, :got:symbol + // CHECK-NEXT: ^ + + ldr x0, [x0, :got_lo12:symbol] + // CHECK: error: unknown AArch64 symbol kind! + // CHECK-NEXT: ldr x0, [x0, :got_lo12:symbol] + // CHECK-NEXT: ^