diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGDecl.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 10 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/static-init.cpp | 16 |
3 files changed, 24 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index fcea927c63a..06a3343bc25 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -312,7 +312,9 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D, llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(D.getType()); llvm::Type *LPtrTy = LTy->getPointerTo(CGM.getContext().getTargetAddressSpace(D.getType())); - DMEntry = llvm::ConstantExpr::getBitCast(GV, LPtrTy); + llvm::Constant *CastedVal = llvm::ConstantExpr::getBitCast(GV, LPtrTy); + DMEntry = CastedVal; + CGM.setStaticLocalDeclAddress(&D, CastedVal); // Emit global variable debug descriptor for static vars. CGDebugInfo *DI = getDebugInfo(); diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index d6983ce7822..be0727eaeeb 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -279,7 +279,7 @@ class CodeGenModule : public CodeGenTypeCache { llvm::StringMap<llvm::Constant*> CFConstantStringMap; llvm::StringMap<llvm::GlobalVariable*> ConstantStringMap; - llvm::DenseMap<const Decl*, llvm::Value*> StaticLocalDeclMap; + llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap; llvm::DenseMap<QualType, llvm::Constant *> AtomicSetterHelperFnMap; llvm::DenseMap<QualType, llvm::Constant *> AtomicGetterHelperFnMap; @@ -397,12 +397,12 @@ public: return *RRData; } - llvm::Value *getStaticLocalDeclAddress(const VarDecl *VD) { - return StaticLocalDeclMap[VD]; + llvm::Constant *getStaticLocalDeclAddress(const VarDecl *D) { + return StaticLocalDeclMap[D]; } void setStaticLocalDeclAddress(const VarDecl *D, - llvm::GlobalVariable *GV) { - StaticLocalDeclMap[D] = GV; + llvm::Constant *C) { + StaticLocalDeclMap[D] = C; } llvm::Constant *getAtomicSetterHelperFnMap(QualType Ty) { diff --git a/clang/test/CodeGenCXX/static-init.cpp b/clang/test/CodeGenCXX/static-init.cpp index 2db54c2c8b5..a96cb7ac8e0 100644 --- a/clang/test/CodeGenCXX/static-init.cpp +++ b/clang/test/CodeGenCXX/static-init.cpp @@ -63,3 +63,19 @@ namespace test1 { // Make sure we emit the initializer correctly for the following: char base_req[] = { "foo" }; + +namespace union_static_local { + // CHECK: define internal void @_ZZN18union_static_local4testEvEN1c4mainEv + // CHECK: call void @_ZN18union_static_local1fEPNS_1xE(%"union.union_static_local::x"* bitcast ({ [2 x i8*] }* @_ZZN18union_static_local4testEvE3foo to %"union.union_static_local::x"*)) + union x { long double y; const char *x[2]; }; + void f(union x*); + void test() { + static union x foo = { .x = { "a", "b" } }; + struct c { + static void main() { + f(&foo); + } + }; + c::main(); + } +} |