forked from OSchip/llvm-project
Make sure we update the static local decl address map when we are forced to rebuild a global because of the initializer. <rdar://problem/10957867>.
llvm-svn: 152372
This commit is contained in:
parent
9d60f60760
commit
1c8d2ca829
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue