[CodeView] Implement support for bitfields in LLVM

CodeView need to know the offset of the storage allocation for a
bitfield.  Encode this via the "extraData" field in DIDerivedType and
introduced a new flag, DIFlagBitField, to indicate whether or not a
member is a bitfield.

This fixes PR28162.

Differential Revision: http://reviews.llvm.org/D21782

llvm-svn: 274200
This commit is contained in:
David Majnemer
2016-06-30 03:00:20 +00:00
parent 0da2d14766
commit 9319cbc045
6 changed files with 272 additions and 11 deletions

View File

@@ -308,6 +308,18 @@ static ConstantAsMetadata *getConstantOrNull(Constant *C) {
return nullptr;
}
DIDerivedType *DIBuilder::createBitFieldMemberType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
uint64_t StorageOffsetInBits, unsigned Flags, DIType *Ty) {
Flags |= DINode::FlagBitField;
return DIDerivedType::get(
VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits, OffsetInBits,
Flags, ConstantAsMetadata::get(ConstantInt::get(
IntegerType::get(VMContext, 64), StorageOffsetInBits)));
}
DIDerivedType *DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name,
DIFile *File,
unsigned LineNumber,