diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-12-24 23:06:55 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-12-24 23:06:55 +0000 |
commit | 2913eca4e2929a54bbe1ebe2faf421ba7651e601 (patch) | |
tree | 139d68ea792bacdadd957b3ea70c6edf9673f1f8 /llvm | |
parent | 8e92dfee20ab94503ea4f499044ceb29360faba4 (diff) | |
download | bcm5719-llvm-2913eca4e2929a54bbe1ebe2faf421ba7651e601.tar.gz bcm5719-llvm-2913eca4e2929a54bbe1ebe2faf421ba7651e601.zip |
CodeGen: Error on redefinitions instead of asserting
It's possible to have a prior definition of a symbol in module asm.
Raise an error instead of crashing.
llvm-svn: 224828
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 16 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/equiv_with_fndef.ll | 10 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/equiv_with_vardef.ll | 8 |
3 files changed, 29 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 93445a8c84f..80221d7feb6 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -338,6 +338,9 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { return; GVSym->redefineIfPossible(); + if (GVSym->isDefined() || GVSym->isVariable()) + report_fatal_error("symbol '" + Twine(GVSym->getName()) + + "' is already defined"); if (MAI->hasDotTypeDotSizeDirective()) OutStreamer.EmitSymbolAttribute(GVSym, MCSA_ELF_TypeObject); @@ -547,11 +550,14 @@ void AsmPrinter::EmitFunctionEntryLabel() { // 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->isUndefined()) - return OutStreamer.EmitLabel(CurrentFnSym); - - report_fatal_error("'" + Twine(CurrentFnSym->getName()) + - "' label emitted multiple times to assembly file"); + 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"); + + return OutStreamer.EmitLabel(CurrentFnSym); } /// emitComments - Pretty-print comments for instructions. diff --git a/llvm/test/CodeGen/X86/equiv_with_fndef.ll b/llvm/test/CodeGen/X86/equiv_with_fndef.ll new file mode 100644 index 00000000000..efbb8ab3da6 --- /dev/null +++ b/llvm/test/CodeGen/X86/equiv_with_fndef.ll @@ -0,0 +1,10 @@ +; 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" + +module asm ".equiv pselect, __pselect" + +define void @pselect() { + ret void +} +; CHECK: 'pselect' is a protected alias diff --git a/llvm/test/CodeGen/X86/equiv_with_vardef.ll b/llvm/test/CodeGen/X86/equiv_with_vardef.ll new file mode 100644 index 00000000000..29c19a107ec --- /dev/null +++ b/llvm/test/CodeGen/X86/equiv_with_vardef.ll @@ -0,0 +1,8 @@ +; 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" + +module asm ".equiv var, __var" + +@var = global i32 0 +; CHECK: symbol 'var' is already defined |