aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2011-04-28 23:43:23 +0000
committerFariborz Jahanian <fjahanian@apple.com>2011-04-28 23:43:23 +0000
commitfbc3cc69d2028eccb85bb456d762457b38a65e3b (patch)
tree3d4be7d58e12053eae17d13e2605f5a562ee491f /lib/CodeGen
parent657baf19ca8a48a926bd3bc148b6ad1b17e53199 (diff)
Fixes debug info generation problem for ms_struct structs.
// rdar://8823265 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130458 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/CGDebugInfo.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp
index 11a0fac2ea..4b2b908516 100644
--- a/lib/CodeGen/CGDebugInfo.cpp
+++ b/lib/CodeGen/CGDebugInfo.cpp
@@ -618,18 +618,31 @@ void CGDebugInfo::
CollectRecordFields(const RecordDecl *record, llvm::DIFile tunit,
llvm::SmallVectorImpl<llvm::Value *> &elements) {
unsigned fieldNo = 0;
+ const FieldDecl *LastFD = 0;
+ bool IsMsStruct = record->hasAttr<MsStructAttr>();
+
const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record);
for (RecordDecl::field_iterator I = record->field_begin(),
E = record->field_end();
I != E; ++I, ++fieldNo) {
FieldDecl *field = *I;
+ if (IsMsStruct) {
+ // Zero-length bitfields following non-bitfield members are ignored
+ if (CGM.getContext().ZeroBitfieldFollowsNonBitfield((field), LastFD)) {
+ --fieldNo;
+ continue;
+ }
+ LastFD = field;
+ }
llvm::StringRef name = field->getName();
QualType type = field->getType();
// Ignore unnamed fields unless they're anonymous structs/unions.
- if (name.empty() && !type->isRecordType())
+ if (name.empty() && !type->isRecordType()) {
+ LastFD = field;
continue;
+ }
llvm::DIType fieldType
= createFieldType(name, type, field->getBitWidth(),