From 6ea0bd781a94c4f39431368f874da3134726eda9 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Mon, 13 Apr 2015 17:40:46 +0000 Subject: [PATCH] [CodeGen] Fix crash with duplicated mangled name. Patch by Yunzhong Gao! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234767 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 17 +++++++++-------- test/CodeGenCXX/duplicate-mangled-name2.cpp | 9 +++++++++ test/CodeGenCXX/duplicate-mangled-name3.cpp | 10 ++++++++++ 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 test/CodeGenCXX/duplicate-mangled-name2.cpp create mode 100644 test/CodeGenCXX/duplicate-mangled-name3.cpp diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index dd9d6305ca..8175347f95 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1372,6 +1372,15 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) { /*DontDefer=*/false); return; } + + if (llvm::GlobalValue *GV = GetGlobalValue(getMangledName(GD))) + if (!GV->isDeclaration()) { + getDiags().Report(FD->getLocation(), diag::err_duplicate_mangled_name); + GlobalDecl OldGD = Manglings.lookup(GV->getName()); + if (auto *Prev = OldGD.getDecl()) + getDiags().Report(Prev->getLocation(), diag::note_previous_definition); + return; + } } else { const auto *VD = cast(Global); assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); @@ -2405,14 +2414,6 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD, } } - if (!GV->isDeclaration()) { - getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name); - GlobalDecl OldGD = Manglings.lookup(GV->getName()); - if (auto *Prev = OldGD.getDecl()) - getDiags().Report(Prev->getLocation(), diag::note_previous_definition); - return; - } - if (GV->getType()->getElementType() != Ty) { // If the types mismatch then we have to rewrite the definition. assert(GV->isDeclaration() && "Shouldn't replace non-declaration"); diff --git a/test/CodeGenCXX/duplicate-mangled-name2.cpp b/test/CodeGenCXX/duplicate-mangled-name2.cpp new file mode 100644 index 0000000000..e582733fd8 --- /dev/null +++ b/test/CodeGenCXX/duplicate-mangled-name2.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -emit-llvm-only %s -verify +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -femit-all-decls -emit-llvm-only %s -verify + +void foo(void *p) __asm("_ZN1SC2Ev"); +void foo(void *p) { } // expected-note {{previous}} + +struct S { + S() {} // expected-error {{definition with same mangled name as another definition}} +} s; diff --git a/test/CodeGenCXX/duplicate-mangled-name3.cpp b/test/CodeGenCXX/duplicate-mangled-name3.cpp new file mode 100644 index 0000000000..17dbc9bc85 --- /dev/null +++ b/test/CodeGenCXX/duplicate-mangled-name3.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify +// RUN: %clang_cc1 -triple %itanium_abi_triple -femit-all-decls -emit-llvm-only %s -verify + +extern "C" { + void _ZN1SC2Ev(void *p) { } // expected-note {{previous}} +} + +struct S { + S() {} // expected-error {{definition with same mangled name as another definition}} +} s; -- 2.40.0