[CodeGen] Report a normal instead of fatal error for label redefinition
authorJohn Brawn <john.brawn@arm.com>
Tue, 9 Mar 2021 10:54:41 +0000 (10:54 +0000)
committerJohn Brawn <john.brawn@arm.com>
Tue, 9 Mar 2021 10:54:41 +0000 (10:54 +0000)
A symbol being redefined as a label is something that can happen as a result of
ordinary input, so it shouldn't cause a fatal error. Also adjust the error
message to match the one you get when a symbol is redefined as a variable.

Differential Revision: https://reviews.llvm.org/D98181

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/MC/MCStreamer.cpp
llvm/test/CodeGen/X86/equiv_with_vardef.ll
llvm/test/CodeGen/X86/label-redefinition.ll
llvm/test/CodeGen/X86/symbol-redefinition.ll [new file with mode: 0644]
llvm/test/CodeGen/XCore/section-name.ll
llvm/test/MC/ELF/section-sym-err.s

index 37d8798..dbe7028 100644 (file)
@@ -824,9 +824,6 @@ void AsmPrinter::emitFunctionEntryLabel() {
   if (CurrentFnSym->isVariable())
     report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
                        "' is a protected alias");
-  if (CurrentFnSym->isDefined())
-    report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
-                       "' label emitted multiple times to assembly file");
 
   OutStreamer->emitLabel(CurrentFnSym);
 
index ee4cce0..997cebf 100644 (file)
@@ -415,7 +415,8 @@ void MCStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
   Symbol->redefineIfPossible();
 
   if (!Symbol->isUndefined() || Symbol->isVariable())
-    return getContext().reportError(Loc, "invalid symbol redefinition");
+    return getContext().reportError(Loc, "symbol '" + Twine(Symbol->getName()) +
+                                             "' is already defined");
 
   assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
   assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
index 11adcb8..47f03d1 100644 (file)
@@ -6,4 +6,4 @@ module asm ".equiv var, __var"
 
 @var = global i32 0
 ; CHECK: <unknown>:0: error: symbol 'var' is already defined
-; CHECK: <unknown>:0: error: invalid symbol redefinition
+; CHECK: <unknown>:0: error: symbol 'var' is already defined
index b5570e6..0b99a8d 100644 (file)
@@ -1,5 +1,5 @@
 ; PR7054
-; RUN: not --crash llc %s -o - 2>&1 | grep "'_foo' label emitted multiple times to assembly"
+; RUN: not llc %s -o - 2>&1 | FileCheck %s
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
 target triple = "i386-apple-darwin10.0.0"
 
@@ -7,6 +7,7 @@ define i32 @"\01_foo"() {
   unreachable
 }
 
+; CHECK: <unknown>:0: error: symbol '_foo' is already defined
 define i32 @foo() {
 entry:
   unreachable
diff --git a/llvm/test/CodeGen/X86/symbol-redefinition.ll b/llvm/test/CodeGen/X86/symbol-redefinition.ll
new file mode 100644 (file)
index 0000000..d6e7327
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: not llc -mtriple=x86_64-unknown-unknown %s -o - 2>&1 | FileCheck %s
+
+; CHECK: <unknown>:0: error: symbol 'fn' is already defined
+define void @fn() section "fn" {
+  ret void
+}
+
+; CHECK: <unknown>:0: error: symbol 'var' is already defined
+@var = global i32 0, section "var", align 4
index e7ff1ae..548ddab 100644 (file)
@@ -6,4 +6,4 @@ define void @".dp.bss"() {
   ret void
 }
 
-; CHECK: <unknown>:0: error: invalid symbol redefinition
+; CHECK: <unknown>:0: error: symbol '.dp.bss' is already defined
index 789fee7..afed21d 100644 (file)
@@ -3,4 +3,4 @@
 .section foo
 foo:
 
-// CHECK: error: invalid symbol redefinition
+// CHECK: error: symbol 'foo' is already defined