forked from OSchip/llvm-project
Use static storage duration for file-scope compound literals, even when they
appear in non-constant initializers in C++. llvm-svn: 145087
This commit is contained in:
parent
1959df2c9c
commit
2d988f0f05
|
@ -1947,6 +1947,11 @@ CodeGenFunction::EmitLValueForFieldInitialization(llvm::Value *BaseValue,
|
|||
}
|
||||
|
||||
LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){
|
||||
if (E->isFileScope()) {
|
||||
llvm::Value *GlobalPtr = CGM.GetAddrOfConstantCompoundLiteral(E);
|
||||
return MakeAddrLValue(GlobalPtr, E->getType());
|
||||
}
|
||||
|
||||
llvm::Value *DeclPtr = CreateMemTemp(E->getType(), ".compoundliteral");
|
||||
const Expr *InitExpr = E->getInitializer();
|
||||
LValue Result = MakeAddrLValue(DeclPtr, E->getType());
|
||||
|
|
|
@ -1087,6 +1087,12 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
|
|||
return C;
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CodeGenModule::GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E) {
|
||||
assert(E->isFileScope() && "not a file-scope compound literal expr");
|
||||
return ConstExprEmitter(*this, 0).EmitLValue(E);
|
||||
}
|
||||
|
||||
static uint64_t getFieldOffset(ASTContext &C, const FieldDecl *field) {
|
||||
const ASTRecordLayout &layout = C.getASTRecordLayout(field->getParent());
|
||||
return layout.getFieldOffset(field->getFieldIndex());
|
||||
|
|
|
@ -599,6 +599,10 @@ public:
|
|||
llvm::Constant *GetAddrOfConstantCString(const std::string &str,
|
||||
const char *GlobalName=0,
|
||||
unsigned Alignment=1);
|
||||
|
||||
/// GetAddrOfConstantCompoundLiteral - Returns a pointer to a constant global
|
||||
/// variable for the given file-scope compound literal expression.
|
||||
llvm::Constant *GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr*E);
|
||||
|
||||
/// \brief Retrieve the record type that describes the state of an
|
||||
/// Objective-C fast enumeration loop (for..in).
|
||||
|
|
|
@ -37,3 +37,8 @@ int g() {
|
|||
// CHECK-NEXT: ret i32 [[A0]]
|
||||
return v[0];
|
||||
}
|
||||
|
||||
struct Z { int i[3]; };
|
||||
int *p = (Z){ {1, 2, 3} }.i;
|
||||
// CHECK: define {{.*}}__cxx_global_var_init()
|
||||
// CHECK: store i32* getelementptr inbounds (%struct.Z* @.compoundliteral, i32 0, i32 0, i32 0), i32** @p, align 8
|
||||
|
|
Loading…
Reference in New Issue