From a12cd28bb3e23521ec623082c52c6c82e0a55bab Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 11 Dec 2013 19:21:27 +0000 Subject: [ms-cxxabi] Fix linkage of dtor thunks for anonymous classes We were mistakengly giving linkonce_odr linkage instead of internal linkage to the deleting and complete destructor thunks for classes in anonymous namespaces. Fixes PR17273. llvm-svn: 197060 --- clang/lib/CodeGen/CodeGenModule.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'clang/lib/CodeGen/CodeGenModule.cpp') diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 41f2c6c..e3ab9df 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -585,11 +585,6 @@ llvm::GlobalValue::LinkageTypes CodeGenModule::getFunctionLinkage(GlobalDecl GD) { const FunctionDecl *D = cast(GD.getDecl()); - if (isa(D) && - getCXXABI().useThunkForDtorVariant(cast(D), - GD.getDtorType())) - return llvm::Function::LinkOnceODRLinkage; - GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); if (Linkage == GVA_Internal) @@ -630,7 +625,14 @@ CodeGenModule::getFunctionLinkage(GlobalDecl GD) { return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage : llvm::Function::ExternalLinkage; - + + // Destructor variants in the Microsoft C++ ABI are always linkonce_odr thunks + // emitted on an as-needed basis. + if (isa(D) && + getCXXABI().useThunkForDtorVariant(cast(D), + GD.getDtorType())) + return llvm::Function::LinkOnceODRLinkage; + // Otherwise, we have strong external linkage. assert(Linkage == GVA_StrongExternal); return llvm::Function::ExternalLinkage; -- cgit v1.1