diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h index 1f3cea4bd1ae6..f298babfb9bb0 100644 --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -700,9 +700,8 @@ enum : unsigned { // ELF Relocation types for RISC-V enum { #include "ELFRelocs/RISCV.def" -#define ELF_RISCV_NONSTANDARD_RELOC(_vendor, name, value) name = value, +#define ELF_RISCV_NONSTANDARD_RELOC_ALL(name, value) name = value, #include "ELFRelocs/RISCV_nonstandard.def" -#undef ELF_RISCV_NONSTANDARD_RELOC }; enum { diff --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def index 7ae3d3f205772..ce46ec029758d 100644 --- a/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def +++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def @@ -6,23 +6,34 @@ // //===----------------------------------------------------------------------===// -#ifndef ELF_RISCV_NONSTANDARD_RELOC -#error "ELF_RISCV_NONSTANDARD_RELOC must be defined" +// This file defines information about RISC-V's nonstandard relocation codes. +// This can be used when parsing relocations, or when printing them, to provide +// better information. +// +// Unlike the mappings provided in RISCV.def via `ELF_RELOC`, these are not +// expected to be 1:1 mappings - multiple vendors may reuse relocation IDs. + +// For ease of use, `ELF_RISCV_NONSTANDARD_RELOC_ALL` invokes the macros for +// each vendor. + +#ifdef ELF_RISCV_NONSTANDARD_RELOC_ALL +#define ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(NAME, ID) ELF_RISCV_NONSTANDARD_RELOC_ALL(NAME, ID) #endif -// ELF_RISCV_NONSTANDARD_RELOC(VENDOR, NAME, ID) defines information about -// nonstandard relocation codes. This can be used when parsing relocations, or -// when printing them, to provide better information. -// -// VENDOR should be the symbol name expected in the associated `R_RISCV_VENDOR` -// relocation. NAME and ID work like `ELF_RELOC` but the mapping is not expected -// to be 1:1. -// -// The mapping in RISCV.def is 1:1, and should be used when the only information -// available is the relocation enum value. - -// Qualcomm Nonstandard Relocations -ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_ABS20_U, 192) -ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_BRANCH, 193) -ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_32, 194) -ELF_RISCV_NONSTANDARD_RELOC(QUALCOMM, R_RISCV_QC_E_JUMP_PLT, 195) +// For each Vendor identifier, VENDOR, as associated with an `R_RISCV_VENDOR`, +// the `ELF_RISCV_NONSTANDARD_RELOC_(NAME, ID)` macro defines the +// relocations available for that vendor identifier. + +// QUALCOMM Nonstandard Relocations +#ifndef ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM +#define ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(_NAME, _ID) +#endif + +ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(R_RISCV_QC_ABS20_U, 192) +ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(R_RISCV_QC_E_BRANCH, 193) +ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(R_RISCV_QC_E_32, 194) +ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(R_RISCV_QC_E_JUMP_PLT, 195) + + +#undef ELF_RISCV_NONSTANDARD_RELOC_ALL +#undef ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp index d8cfeb07e52b6..4d4eb6808cf62 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -48,9 +48,8 @@ std::optional RISCVAsmBackend::getFixupKind(StringRef Name) const { #define ELF_RELOC(NAME, ID) .Case(#NAME, ID) #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" #undef ELF_RELOC -#define ELF_RISCV_NONSTANDARD_RELOC(_VENDOR, NAME, ID) .Case(#NAME, ID) +#define ELF_RISCV_NONSTANDARD_RELOC_ALL(NAME, ID) .Case(#NAME, ID) #include "llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def" -#undef ELF_RISCV_NONSTANDARD_RELOC .Case("BFD_RELOC_NONE", ELF::R_RISCV_NONE) .Case("BFD_RELOC_32", ELF::R_RISCV_32) .Case("BFD_RELOC_64", ELF::R_RISCV_64)