]> granicus.if.org Git - clang/commit
constexpr irgen: Add irgen support for APValue::Struct, APValue::Union,
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 14 Jan 2012 04:30:29 +0000 (04:30 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 14 Jan 2012 04:30:29 +0000 (04:30 +0000)
commit2d6a5670465cb3f1d811695a9f23e372508240d2
tree3f440e630f5fc50c2977e0e052ba4a6974734583
parent8568ee743406ac4bb23c9768a0dffd627fdbc579
constexpr irgen: Add irgen support for APValue::Struct, APValue::Union,
APValue::Array and APValue::MemberPointer. All APValue values can now be emitted
as constants.

Add new CGCXXABI entry point for emitting an APValue MemberPointer. The other
entrypoints dealing with constant member pointers are no longer necessary and
will be removed in a later change.

Switch codegen from using EvaluateAsRValue/EvaluateAsLValue to
VarDecl::evaluateValue. This performs caching and deals with the nasty cases in
C++11 where a non-const object's initializer can refer indirectly to
previously-initialized fields within the same object.

Building the intermediate APValue object incurs a measurable performance hit on
pathological testcases with huge initializer lists, so we continue to build IR
directly from the Expr nodes for array and record types outside of C++11.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148178 91177308-0d34-0410-b5e6-96231b3b80d8
18 files changed:
include/clang/AST/ASTContext.h
include/clang/AST/Decl.h
lib/AST/Decl.cpp
lib/AST/ExprConstant.cpp
lib/AST/RecordLayoutBuilder.cpp
lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGCXXABI.cpp
lib/CodeGen/CGCXXABI.h
lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDecl.cpp
lib/CodeGen/CGExprConstant.cpp
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h
lib/CodeGen/ItaniumCXXABI.cpp
test/CodeGen/2007-09-28-PackedUnionMember.c
test/CodeGenCXX/blocks.cpp
test/CodeGenCXX/const-init-cxx11.cpp
test/CodeGenCXX/pr9965.cpp