On Thu, Mar 29, 2012 at 9:25 PM, John McCall <[email protected]> wrote: > Author: rjmccall > Date: Thu Mar 29 23:25:14 2012 > New Revision: 153723 > > URL: http://llvm.org/viewvc/llvm-project?rev=153723&view=rev > Log: > When emitting a static local variable in C++, handle > the case that the variable already exists. Partly this is just > protection against people making crazy declarations with custom > asm labels or extern "C" names that intentionally collide with > the manglings of such variables, but the main reason is that we > can actually emit a static local variable twice with the > requirement that it match up. There may be other cases with > (e.g.) the various nested functions, but the main exemplar is > with constructor variants, where we can be forced into > double-emitting the function body under certain circumstances > like (currently) the presence of virtual bases. > > Modified: > cfe/trunk/lib/CodeGen/CGDecl.cpp > cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > 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=153723&r1=153722&r2=153723&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Thu Mar 29 23:25:14 2012 > @@ -184,6 +184,24 @@ > Name = GetStaticDeclName(*this, D, Separator); > > llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty); > + > + // In C++, there are strange possibilities here involving the > + // double-emission of constructors and destructors. > + if (CGM.getLangOpts().CPlusPlus) { > + llvm::GlobalValue *value = CGM.getModule().getNamedValue(Name); > + if (value && isa<llvm::GlobalVariable>(value) && > + value->getType() == > + LTy->getPointerTo(CGM.getContext().getTargetAddressSpace(Ty))) > + return cast<llvm::GlobalVariable>(value);
This check won't work reliably: the global's type isn't guaranteed to be the same as the IR type of the variable. -Eli _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
