diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-06-13 17:49:16 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-06-13 17:49:16 +0000 | 
| commit | ae111dc821944c3573fe417823d3228fb61eaa58 (patch) | |
| tree | 92cee055bd4ed9c0cb116746651df8cb2aae2565 /clang/lib/AST/RecordLayoutBuilder.cpp | |
| parent | 94e5d78888b1727d02fcd918ef05822c6fedc398 (diff) | |
| download | bcm5719-llvm-ae111dc821944c3573fe417823d3228fb61eaa58.tar.gz bcm5719-llvm-ae111dc821944c3573fe417823d3228fb61eaa58.zip  | |
Implement part of the EmptySubobjectMap optimization described in PR6998. We still need to do this for bases.
llvm-svn: 105919
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 17 | 
1 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 7c0c8088e83..6b8d7cf22dd 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -415,7 +415,14 @@ EmptySubobjectMap::CanPlaceFieldAtOffset(const FieldDecl *FD, uint64_t Offset) {  void EmptySubobjectMap::UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,                                                      const CXXRecordDecl *Class,                                                     uint64_t Offset) { -   +  // We know that the only empty subobjects that can conflict with empty +  // field subobjects are subobjects empty bases that can be placed at offset +  // zero. Because of this, we only need to keep track of empty field  +  // subobjects with offsets less than the size of the largest empty +  // subobject for our class. +  if (Offset >= SizeOfLargestEmptySubobject) +    return; +    AddSubobjectAtOffset(RD, Offset);    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); @@ -480,6 +487,14 @@ void EmptySubobjectMap::UpdateEmptyFieldSubobjects(const FieldDecl *FD,      uint64_t ElementOffset = Offset;      for (uint64_t I = 0; I != NumElements; ++I) { +      // We know that the only empty subobjects that can conflict with empty +      // field subobjects are subobjects empty bases that can be placed at  +      // offset zero. Because of this, we only need to keep track of empty field +      // subobjects with offsets less than the size of the largest empty +      // subobject for our class. +      if (ElementOffset >= SizeOfLargestEmptySubobject) +        return; +        UpdateEmptyFieldSubobjects(RD, RD, ElementOffset);        ElementOffset += Layout.getSize();      }  | 

