[llvm] cce852f - [Object] Add getRISCVVendorRelocationTypeName to render RISCV vendor-specific relocations to strings. (#168293)

via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 16 16:21:50 PST 2025


Author: Owen Anderson
Date: 2025-11-16T16:21:46-08:00
New Revision: cce852ff03be5da56a9dc3d102a142812b2008d1

URL: https://github.com/llvm/llvm-project/commit/cce852ff03be5da56a9dc3d102a142812b2008d1
DIFF: https://github.com/llvm/llvm-project/commit/cce852ff03be5da56a9dc3d102a142812b2008d1.diff

LOG: [Object] Add getRISCVVendorRelocationTypeName to render RISCV vendor-specific relocations to strings. (#168293)

This will be used in places like LLD to render them for error messages.

Added: 
    

Modified: 
    llvm/include/llvm/Object/ELF.h
    llvm/lib/Object/ELF.cpp
    llvm/unittests/Object/ELFTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h
index cc1e5f9dcb9da..df16e50dc1c4f 100644
--- a/llvm/include/llvm/Object/ELF.h
+++ b/llvm/include/llvm/Object/ELF.h
@@ -72,6 +72,8 @@ struct VersionEntry {
 };
 
 LLVM_ABI StringRef getELFRelocationTypeName(uint32_t Machine, uint32_t Type);
+LLVM_ABI StringRef getRISCVVendorRelocationTypeName(uint32_t Type,
+                                                    StringRef Vendor);
 LLVM_ABI uint32_t getELFRelativeRelocationType(uint32_t Machine);
 LLVM_ABI StringRef getELFSectionTypeName(uint32_t Machine, uint32_t Type);
 

diff  --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index 354c51d66419c..35b5e0faf9007 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -191,6 +191,19 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
 
 #undef ELF_RELOC
 
+StringRef llvm::object::getRISCVVendorRelocationTypeName(uint32_t Type,
+                                                         StringRef Vendor) {
+#define ELF_RISCV_NONSTANDARD_RELOC(vendor, name, number)                      \
+  if (Vendor == #vendor && Type == number)                                     \
+    return #name;
+
+#include "llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def"
+
+#undef ELF_RISCV_NONSTANDARD_RELOC
+
+  return "Unknown";
+}
+
 uint32_t llvm::object::getELFRelativeRelocationType(uint32_t Machine) {
   switch (Machine) {
   case ELF::EM_X86_64:

diff  --git a/llvm/unittests/Object/ELFTest.cpp b/llvm/unittests/Object/ELFTest.cpp
index 7c68ab5c8985f..61ec78fea953a 100644
--- a/llvm/unittests/Object/ELFTest.cpp
+++ b/llvm/unittests/Object/ELFTest.cpp
@@ -255,6 +255,20 @@ TEST(ELFTest, getELFRelocationTypeNameForLoongArch) {
             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_CALL36));
 }
 
+TEST(ELFTest, getRISCVVendorRelocationTypeName) {
+  EXPECT_EQ("R_RISCV_QC_ABS20_U",
+            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM192, "QUALCOMM"));
+  EXPECT_EQ("R_RISCV_QC_E_BRANCH",
+            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM193, "QUALCOMM"));
+  EXPECT_EQ("R_RISCV_QC_E_32",
+            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM194, "QUALCOMM"));
+  EXPECT_EQ("R_RISCV_QC_E_CALL_PLT",
+            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM195, "QUALCOMM"));
+
+  EXPECT_EQ("R_RISCV_NDS_BRANCH_10",
+            getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM241, "ANDES"));
+}
+
 TEST(ELFTest, getELFRelativeRelocationType) {
   EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE));
   EXPECT_EQ(ELF::R_LARCH_RELATIVE, getELFRelativeRelocationType(EM_LOONGARCH));


        


More information about the llvm-commits mailing list