[llvm] MC,AsmPrinter: Report redefinition error instead of crashing in more cases (PR #145460)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 23 22:34:41 PDT 2025


https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/145460

* Fix the crash for `.equiv b, undef; b:` (.equiv equates a symbol to an expression and reports an error if the symbol was already defined).
* Remove redundant isVariable check from emitFunctionEntryLabel


>From 733dac5b976c6c5911005978f4f7966761b82a6c Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Mon, 23 Jun 2025 22:34:31 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.5-bogner
---
 llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 7 -------
 llvm/lib/MC/MCAsmStreamer.cpp              | 3 ++-
 llvm/lib/MC/MCObjectStreamer.cpp           | 4 ++++
 llvm/test/CodeGen/X86/equiv_with_fndef.ll  | 4 ++--
 llvm/test/MC/AsmParser/redef-err.s         | 4 ++++
 5 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 403963f33b65c..1bfa551d71966 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -1081,13 +1081,6 @@ void AsmPrinter::emitFunctionHeader() {
 /// function.  This can be overridden by targets as required to do custom stuff.
 void AsmPrinter::emitFunctionEntryLabel() {
   CurrentFnSym->redefineIfPossible();
-
-  // The function label could have already been emitted if two symbols end up
-  // conflicting due to asm renaming.  Detect this and emit an error.
-  if (CurrentFnSym->isVariable())
-    report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
-                       "' is a protected alias");
-
   OutStreamer->emitLabel(CurrentFnSym);
 
   if (TM.getTargetTriple().isOSBinFormatELF()) {
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index c43619d712172..c6dbc625642d4 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -569,7 +569,8 @@ void MCAsmStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
   // FIXME: Fix CodeGen/AArch64/arm64ec-varargs.ll. emitLabel is followed by
   // setVariableValue, leading to an assertion failure if setOffset(0) is
   // called.
-  if (getContext().getObjectFileType() != MCContext::IsCOFF)
+  if (!Symbol->isVariable() &&
+      getContext().getObjectFileType() != MCContext::IsCOFF)
     Symbol->setOffset(0);
 
   Symbol->print(OS, MAI);
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 1bb2143ed6ab2..e959a242dfcf5 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -225,6 +225,10 @@ void MCObjectStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
 
 void MCObjectStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
   MCStreamer::emitLabel(Symbol, Loc);
+  // If Symbol is a non-redefiniable variable, emitLabel has reported an error.
+  // Bail out.
+  if (Symbol->isVariable())
+    return;
 
   getAssembler().registerSymbol(*Symbol);
 
diff --git a/llvm/test/CodeGen/X86/equiv_with_fndef.ll b/llvm/test/CodeGen/X86/equiv_with_fndef.ll
index 3da0aa60250c2..a858ec2bf4537 100644
--- a/llvm/test/CodeGen/X86/equiv_with_fndef.ll
+++ b/llvm/test/CodeGen/X86/equiv_with_fndef.ll
@@ -1,4 +1,4 @@
-; RUN: not --crash llc < %s 2>&1 | FileCheck %s
+; RUN: not llc < %s 2>&1 | FileCheck %s
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
@@ -7,4 +7,4 @@ module asm ".equiv pselect, __pselect"
 define void @pselect() {
   ret void
 }
-; CHECK: 'pselect' is a protected alias
+; CHECK: <unknown>:0: error: symbol 'pselect' is already defined
diff --git a/llvm/test/MC/AsmParser/redef-err.s b/llvm/test/MC/AsmParser/redef-err.s
index e191d01003f41..ff0b1cc221549 100644
--- a/llvm/test/MC/AsmParser/redef-err.s
+++ b/llvm/test/MC/AsmParser/redef-err.s
@@ -12,3 +12,7 @@ l:
 
 .equiv a, undef
 # CHECK: [[#@LINE-1]]:11: error: redefinition of 'a'
+
+.equiv b, undef
+b:
+# CHECK: [[#@LINE-1]]:1: error: symbol 'b' is already defined



More information about the llvm-commits mailing list