diff options
author | Devang Patel <dpatel@apple.com> | 2008-02-05 02:39:50 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-02-05 02:39:50 +0000 |
commit | eae1560d4fb99b9df814bc12c0419825996156cd (patch) | |
tree | b7d0f265c933266b30b112c9e5b303295dfe213e /CodeGen/CodeGenTypes.cpp | |
parent | 0ded75bc88b40607aa5baced6e4729774ed2df56 (diff) |
Cleanup InitListExpr code generation code.
Handle padding fields while initializing struct (fix PR 1962)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46736 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | CodeGen/CodeGenTypes.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index f3510d4595..678733e6fa 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/CodeGen/CodeGenTypes.cpp @@ -66,7 +66,7 @@ namespace { /// placeBitField - Find a place for FD, which is a bit-field. void placeBitField(const FieldDecl *FD); - llvm::SmallVector<unsigned, 8> &getPaddingFields() { + llvm::SmallSet<unsigned, 8> &getPaddingFields() { return PaddingFields; } @@ -79,7 +79,7 @@ namespace { llvm::SmallVector<const FieldDecl *, 8> FieldDecls; std::vector<const llvm::Type*> LLVMFields; llvm::SmallVector<uint64_t, 8> Offsets; - llvm::SmallVector<unsigned, 8> PaddingFields; + llvm::SmallSet<unsigned, 8> PaddingFields; }; } @@ -334,7 +334,8 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { RO.layoutStructFields(RL); // Get llvm::StructType. - CGRecordLayout *RLI = new CGRecordLayout(RO.getLLVMType()); + CGRecordLayout *RLI = new CGRecordLayout(RO.getLLVMType(), + RO.getPaddingFields()); ResultType = TagDeclTypes[TD] = RLI->getLLVMType(); CGRecordLayouts[ResultType] = RLI; @@ -357,7 +358,8 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { RO.layoutUnionFields(); // Get llvm::StructType. - CGRecordLayout *RLI = new CGRecordLayout(RO.getLLVMType()); + CGRecordLayout *RLI = new CGRecordLayout(RO.getLLVMType(), + RO.getPaddingFields()); ResultType = TagDeclTypes[TD] = RLI->getLLVMType(); CGRecordLayouts[ResultType] = RLI; } else { @@ -520,7 +522,7 @@ void RecordOrganizer::addLLVMField(const llvm::Type *Ty, bool isPaddingField) { Offsets.push_back(llvmSize); llvmSize += TySize; if (isPaddingField) - PaddingFields.push_back(llvmFieldNo); + PaddingFields.insert(llvmFieldNo); LLVMFields.push_back(Ty); ++llvmFieldNo; } |