From: Douglas Gregor Date: Thu, 6 May 2010 22:18:21 +0000 (+0000) Subject: The global variable for the VTT might not have external linkage; allow X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f4aac11a5e49752b7f603e6ff2c6bbc1e044eb24;p=clang The global variable for the VTT might not have external linkage; allow us to find local variables, too. Fixes the last remaining Boost.Rational failure. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103203 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVTT.cpp b/lib/CodeGen/CGVTT.cpp index 15e564810f..61c74230e1 100644 --- a/lib/CodeGen/CGVTT.cpp +++ b/lib/CodeGen/CGVTT.cpp @@ -378,7 +378,7 @@ CodeGenVTables::GenerateVTT(llvm::GlobalVariable::LinkageTypes Linkage, D1(printf("vtt %s\n", RD->getNameAsCString())); - llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name); + llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true); if (GV == 0 || GV->isDeclaration()) { const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); diff --git a/test/CodeGenCXX/anonymous-namespaces.cpp b/test/CodeGenCXX/anonymous-namespaces.cpp index 695f8f59de..fb3470ca9b 100644 --- a/test/CodeGenCXX/anonymous-namespaces.cpp +++ b/test/CodeGenCXX/anonymous-namespaces.cpp @@ -1,6 +1,5 @@ // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s - int f(); namespace { @@ -20,6 +19,13 @@ namespace { int D::d = f(); + // Check for generation of a VTT with internal linkage + // CHECK: @_ZTSN12_GLOBAL__N_11X1EE = internal constant + struct X { + struct EBase { }; + struct E : public virtual EBase { virtual ~E() {} }; + }; + // CHECK: define internal i32 @_ZN12_GLOBAL__N_13fooEv() int foo() { return 32; @@ -36,3 +42,5 @@ namespace { int concrete() { return a + foo() + A::foo(); } + +void test_XE() { throw X::E(); }