diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-06-30 03:00:20 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-06-30 03:00:20 +0000 |
commit | 9319cbc045658d504f61dcd9ea78cf3df637de3d (patch) | |
tree | 13bdc18ee0d25d1874035d9c359f5590a2a28b3c /llvm/lib/IR/DIBuilder.cpp | |
parent | 0da2d147668532ce9266b03a29c078359d267f61 (diff) | |
download | llvm-9319cbc045658d504f61dcd9ea78cf3df637de3d.zip llvm-9319cbc045658d504f61dcd9ea78cf3df637de3d.tar.gz llvm-9319cbc045658d504f61dcd9ea78cf3df637de3d.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/IR/DIBuilder.cpp')
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index ab03365..ce16fdd 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -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, |