[cfe-commits] r95512 - in /cfe/trunk: lib/CodeGen/CGDecl.cpp lib/CodeGen/CodeGenFunction.h test/CodeGenCXX/static-init.cpp
Eli Friedman
eli.friedman at gmail.com
Sat Feb 6 19:01:16 PST 2010
On Sat, Feb 6, 2010 at 6:03 PM, Anders Carlsson <andersca at mac.com> wrote:
> Author: andersca
> Date: Sat Feb 6 20:03:08 2010
> New Revision: 95512
>
> URL: http://llvm.org/viewvc/llvm-project?rev=95512&view=rev
> Log:
> Use the right linkage for static variables inside C++ inline functions.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGDecl.cpp
> cfe/trunk/lib/CodeGen/CodeGenFunction.h
> cfe/trunk/test/CodeGenCXX/static-init.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=95512&r1=95511&r2=95512&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Sat Feb 6 20:03:08 2010
> @@ -76,8 +76,21 @@
> case VarDecl::Auto:
> case VarDecl::Register:
> return EmitLocalBlockVarDecl(D);
> - case VarDecl::Static:
> - return EmitStaticBlockVarDecl(D);
> + case VarDecl::Static: {
> + llvm::GlobalValue::LinkageTypes Linkage =
> + llvm::GlobalValue::InternalLinkage;
> +
> + // If this is a static declaration inside an inline function, it must have
> + // weak linkage so that the linker will merge multiple definitions of it.
> + if (getContext().getLangOptions().CPlusPlus) {
> + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurFuncDecl)) {
> + if (FD->isInlined())
> + Linkage = llvm::GlobalValue::WeakAnyLinkage;
> + }
> + }
Do you need to check the linkage of the containing function? A static
variable inside a function in an anonymous namespace, for example,
shouldn't have weak linkage.
-Eli
More information about the cfe-commits
mailing list