diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h index f5f236cf98064..b4ec01a9e6b01 100644 --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -711,9 +711,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 037ca64387339..bee0ae5dc3152 100644 --- a/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def +++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def @@ -6,27 +6,46 @@ // //===----------------------------------------------------------------------===// -#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) +#define ELF_RISCV_NONSTANDARD_RELOC_ANDES(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. +// 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 -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_CALL_PLT, 195) +// QUALCOMM Nonstandard Relocations +#ifndef ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM +#define ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM(_NAME, _ID) +#endif + +// Documented at +// https://github.com/quic/riscv-elf-psabi-quic-extensions/releases/latest +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_CALL_PLT, 195) + + +// ANDES Nonstandard Relocations +#ifndef ELF_RISCV_NONSTANDARD_RELOC_ANDES +#define ELF_RISCV_NONSTANDARD_RELOC_ANDES(_NAME, _ID) +#endif -// Andes Nonstandard Relocations // Calculation: S + A - P (10-bit PC-relative branch offset) -ELF_RISCV_NONSTANDARD_RELOC(ANDES, R_RISCV_NDS_BRANCH_10, 241) +ELF_RISCV_NONSTANDARD_RELOC_ANDES(R_RISCV_NDS_BRANCH_10, 241) + +#undef ELF_RISCV_NONSTANDARD_RELOC_ALL +#undef ELF_RISCV_NONSTANDARD_RELOC_QUALCOMM +#undef ELF_RISCV_NONSTANDARD_RELOC_ANDES diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp index 186296944efde..456d8c388f441 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -47,9 +47,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)