Skip to content

Conversation

@resistor
Copy link
Collaborator

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

…specific relocations to strings.

This will be used in places like LLD to render them for error messages.
@llvmbot
Copy link
Member

llvmbot commented Nov 16, 2025

@llvm/pr-subscribers-llvm-binary-utilities

Author: Owen Anderson (resistor)

Changes

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


Full diff: https://github.com/llvm/llvm-project/pull/168293.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Object/ELF.h (+2)
  • (modified) llvm/lib/Object/ELF.cpp (+12)
  • (modified) llvm/unittests/Object/ELFTest.cpp (+14)
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..88d5dfc617132 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -191,6 +191,18 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
 
 #undef ELF_RELOC
 
+#define ELF_RISCV_NONSTANDARD_RELOC(vendor, name, number)                      \
+  if (Vendor == #vendor && Type == number)                                     \
+    return #name;
+
+StringRef llvm::object::getRISCVVendorRelocationTypeName(uint32_t Type,
+                                                         StringRef Vendor) {
+#include "llvm/BinaryFormat/ELFRelocs/RISCV_nonstandard.def"
+  return "Unknown";
+}
+
+#undef ELF_RISCV_NONSTANDARD_RELOC
+
 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));

Copy link
Member

@lenary lenary left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with one nit.

@resistor resistor merged commit cce852f into llvm:main Nov 17, 2025
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants