[llvm-branch-commits] [lld] [lld] Support merging RISC-V Atomics ABI attributes (PR #97347)

Paul Kirth via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Jul 8 13:23:12 PDT 2024


https://github.com/ilovepi updated https://github.com/llvm/llvm-project/pull/97347

>From 5c57d12517ad58310511eb27bf7cc4ec660d4fa7 Mon Sep 17 00:00:00 2001
From: Paul Kirth <paulkirth at google.com>
Date: Tue, 2 Jul 2024 09:39:46 -0700
Subject: [PATCH] Add handling for invalid tags

Created using spr 1.3.4
---
 lld/ELF/Arch/RISCV.cpp          | 22 ++++++++++++++++++++--
 lld/test/ELF/riscv-attributes.s |  9 +++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index c48b9f7c110476..07a1b63be80510 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1102,7 +1102,20 @@ static void mergeAtomic(DenseMap<unsigned, unsigned>::iterator it,
                 ": atomic_abi=" + Twine(static_cast<unsigned>(newTag)));
   };
 
-  switch (static_cast<RISCVAtomicAbiTag>(oldTag)) {
+  auto reportUnknownAbiError = [](const InputSectionBase *section,
+                                  RISCVAtomicAbiTag tag) {
+    switch (tag) {
+    case RISCVAtomicAbiTag::UNKNOWN:
+    case RISCVAtomicAbiTag::A6C:
+    case RISCVAtomicAbiTag::A6S:
+    case RISCVAtomicAbiTag::A7:
+      return;
+    };
+    errorOrWarn("unknown atomic abi for " + section->name + "\n>>> " +
+                toString(section) +
+                ": atomic_abi=" + Twine(static_cast<unsigned>(tag)));
+  };
+  switch (oldTag) {
   case RISCVAtomicAbiTag::UNKNOWN:
     it->getSecond() = static_cast<unsigned>(newTag);
     return;
@@ -1145,7 +1158,12 @@ static void mergeAtomic(DenseMap<unsigned, unsigned>::iterator it,
       return;
     };
   };
-  llvm_unreachable("unknown AtomicABI");
+
+  // If we get here, then we have an invalid tag, so report it.
+  // Putting these checks at the end allows us to only do these checks when we
+  // need to, since this is expected to be a rare occurrence.
+  reportUnknownAbiError(oldSection, oldTag);
+  reportUnknownAbiError(newSection, newTag);
 }
 
 static RISCVAttributesSection *
diff --git a/lld/test/ELF/riscv-attributes.s b/lld/test/ELF/riscv-attributes.s
index 38b0fe8e7797e2..057223c18418e1 100644
--- a/lld/test/ELF/riscv-attributes.s
+++ b/lld/test/ELF/riscv-attributes.s
@@ -52,6 +52,12 @@
 # ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A6C.o:(.riscv.attributes): atomic_abi=1
 # ATOMIC_ABI_ERROR-NEXT: >>> atomic_abi_A7.o:(.riscv.attributes): atomic_abi=3
 
+## RISC-V tag merging for atomic_abi values A6C and invalid lead to an error.
+# RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_invalid.s -o atomic_abi_invalid.o
+# RUN: not ld.lld atomic_abi_A6C.o atomic_abi_invalid.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ATOMIC_ABI_INVALID --implicit-check-not=error:
+# ATOMIC_ABI_INVALID: error: unknown atomic abi for .riscv.attributes
+# ATOMIC_ABI_INVALID-NEXT: >>> atomic_abi_invalid.o:(.riscv.attributes): atomic_abi=42
+
 # RUN: llvm-mc -filetype=obj -triple=riscv64  atomic_abi_A6S.s -o atomic_abi_A6S.o
 # RUN: ld.lld atomic_abi_A6S.o atomic_abi_A6C.o -o atomic_abi_A6C_A6S
 # RUN: llvm-readobj -A atomic_abi_A6C_A6S | FileCheck %s --check-prefix=A6C_A6S
@@ -332,6 +338,9 @@
 #--- atomic_abi_A7.s
 .attribute atomic_abi, 3
 
+#--- atomic_abi_invalid.s
+.attribute atomic_abi, 42
+
 #      UNKNOWN_NONE: BuildAttributes {
 # UNKNOWN_NONE-NEXT:   FormatVersion: 0x41
 # UNKNOWN_NONE-NEXT:   Section 1 {



More information about the llvm-branch-commits mailing list