Index: lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp =================================================================== --- lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp +++ lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp @@ -41,12 +41,15 @@ return AArch64::NumTargetFixupKinds; } + Optional getFixupKind(StringRef Name) const override; + const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override { const static MCFixupKindInfo Infos[AArch64::NumTargetFixupKinds] = { // This table *must* be in the order that the fixup_* kinds are defined // in AArch64FixupKinds.h. // // Name Offset (bits) Size (bits) Flags + {"fixup_aarch64_NONE", 0, 0, 0}, {"fixup_aarch64_pcrel_adr_imm21", 0, 32, PCRelFlagVal}, {"fixup_aarch64_pcrel_adrp_imm21", 0, 32, PCRelFlagVal}, {"fixup_aarch64_add_imm12", 10, 12, 0}, @@ -103,6 +106,7 @@ default: llvm_unreachable("Unknown fixup kind!"); + case AArch64::fixup_aarch64_NONE: case AArch64::fixup_aarch64_tlsdesc_call: return 0; @@ -304,6 +308,7 @@ if (Value & 0x3) Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned"); return (Value >> 2) & 0x3ffffff; + case AArch64::fixup_aarch64_NONE: case FK_Data_1: case FK_Data_2: case FK_Data_4: @@ -314,6 +319,12 @@ } } +Optional AArch64AsmBackend::getFixupKind(StringRef Name) const { + if (Name == "R_AARCH64_NONE") + return (MCFixupKind)AArch64::fixup_aarch64_NONE; + return MCAsmBackend::getFixupKind(Name); +} + /// getFixupKindContainereSizeInBytes - The number of bytes of the /// container involved in big endian or 0 if the item is little endian unsigned AArch64AsmBackend::getFixupKindContainereSizeInBytes(unsigned Kind) const { Index: lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp =================================================================== --- lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp +++ lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp @@ -200,6 +200,8 @@ return ELF::R_AARCH64_NONE; } else return ELF::R_AARCH64_ABS64; + case AArch64::fixup_aarch64_NONE: + return ELF::R_AARCH64_NONE; case AArch64::fixup_aarch64_add_imm12: if (RefKind == AArch64MCExpr::VK_DTPREL_HI12) return R_CLS(TLSLD_ADD_DTPREL_HI12); Index: lib/Target/AArch64/MCTargetDesc/AArch64FixupKinds.h =================================================================== --- lib/Target/AArch64/MCTargetDesc/AArch64FixupKinds.h +++ lib/Target/AArch64/MCTargetDesc/AArch64FixupKinds.h @@ -15,8 +15,11 @@ namespace AArch64 { enum Fixups { + // Fixups resulting in R_AARCH64_NONE. + fixup_aarch64_NONE = FirstTargetFixupKind, + // A 21-bit pc-relative immediate inserted into an ADR instruction. - fixup_aarch64_pcrel_adr_imm21 = FirstTargetFixupKind, + fixup_aarch64_pcrel_adr_imm21, // A 21-bit pc-relative immediate inserted into an ADRP instruction. fixup_aarch64_pcrel_adrp_imm21, Index: test/MC/AArch64/reloc-directive.s =================================================================== --- /dev/null +++ test/MC/AArch64/reloc-directive.s @@ -0,0 +1,9 @@ +# RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux-gnu %s | llvm-readobj -r | FileCheck %s + + .reloc 4, R_AARCH64_NONE, .text + .reloc 0, R_AARCH64_NONE, .text+4 + nop + nop + +# CHECK: 0x4 R_AARCH64_NONE .text 0x0 +# CHECK-NEXT: 0x0 R_AARCH64_NONE .text 0x4