r234767 - [CodeGen] Fix crash with duplicated mangled name.
Argyrios Kyrtzidis
akyrtzi at gmail.com
Mon Apr 13 10:40:46 PDT 2015
Author: akirtzidis
Date: Mon Apr 13 12:40:46 2015
New Revision: 234767
URL: http://llvm.org/viewvc/llvm-project?rev=234767&view=rev
Log:
[CodeGen] Fix crash with duplicated mangled name.
Patch by Yunzhong Gao!
Added:
cfe/trunk/test/CodeGenCXX/duplicate-mangled-name2.cpp
cfe/trunk/test/CodeGenCXX/duplicate-mangled-name3.cpp
Modified:
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=234767&r1=234766&r2=234767&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Apr 13 12:40:46 2015
@@ -1372,6 +1372,15 @@ void CodeGenModule::EmitGlobal(GlobalDec
/*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<VarDecl>(Global);
assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
@@ -2405,14 +2414,6 @@ void CodeGenModule::EmitGlobalFunctionDe
}
}
- 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");
Added: cfe/trunk/test/CodeGenCXX/duplicate-mangled-name2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/duplicate-mangled-name2.cpp?rev=234767&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/duplicate-mangled-name2.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/duplicate-mangled-name2.cpp Mon Apr 13 12:40:46 2015
@@ -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;
Added: cfe/trunk/test/CodeGenCXX/duplicate-mangled-name3.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/duplicate-mangled-name3.cpp?rev=234767&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/duplicate-mangled-name3.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/duplicate-mangled-name3.cpp Mon Apr 13 12:40:46 2015
@@ -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;
More information about the cfe-commits
mailing list