[PATCH] Fixing a clang crash with duplicate mangled name

Argyrios Kyrtzidis akyrtzi at gmail.com
Mon Apr 13 10:45:13 PDT 2015


Committed in r234767, thanks!

> On Apr 8, 2015, at 3:43 PM, Yunzhong Gao <Yunzhong_Gao at playstation.sony.com> wrote:
> 
> Re-based the patch to trunk r234180.
> And a gentle ping.
> 
> 
> http://reviews.llvm.org/D8405
> 
> Files:
>  lib/CodeGen/CodeGenModule.cpp
>  test/CodeGenCXX/duplicate-mangled-name2.cpp
>  test/CodeGenCXX/duplicate-mangled-name3.cpp
> 
> Index: lib/CodeGen/CodeGenModule.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenModule.cpp
> +++ lib/CodeGen/CodeGenModule.cpp
> @@ -1372,6 +1372,15 @@
>                               /*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 @@
>     }
>   }
> 
> -  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");
> Index: test/CodeGenCXX/duplicate-mangled-name2.cpp
> ===================================================================
> --- test/CodeGenCXX/duplicate-mangled-name2.cpp
> +++ 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;
> Index: test/CodeGenCXX/duplicate-mangled-name3.cpp
> ===================================================================
> --- test/CodeGenCXX/duplicate-mangled-name3.cpp
> +++ 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;
> 
> EMAIL PREFERENCES
>  http://reviews.llvm.org/settings/panel/emailpreferences/
> <D8405.23447.patch>





More information about the cfe-commits mailing list