aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/DIBuilder.cpp
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2025-05-29 11:26:06 -0600
committerGitHub <noreply@github.com>2025-05-29 10:26:06 -0700
commit040f5ee41014724af7dc4941ff9f4223b4db67d4 (patch)
tree70b1bb00d5147b026a1966b5e1a8ec195b27d2a9 /llvm/lib/IR/DIBuilder.cpp
parent16994a6e768658221c69c85c1b8ecf4225d875c9 (diff)
downloadllvm-040f5ee41014724af7dc4941ff9f4223b4db67d4.zip
llvm-040f5ee41014724af7dc4941ff9f4223b4db67d4.tar.gz
llvm-040f5ee41014724af7dc4941ff9f4223b4db67d4.tar.bz2
Add flags check to createVariantMemberType (#139261)
I noticed that DIDerivedType overloads the "ExtraData" member depending on the precise type being implemented. A variant part uses this to store the discriminant (a reference to another member), but a bit field uses it to store the storage offset. This patch changes createVariantMemberType to ensure that the FlagBitField is not used when creating a variant part. If this flag is used, the ExtraData field would be erroneously used in two different ways. The patch also updates a comment in DIDerivedType to list a couple more cases.
Diffstat (limited to 'llvm/lib/IR/DIBuilder.cpp')
-rw-r--r--llvm/lib/IR/DIBuilder.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp
index 90da9f3..7d61150 100644
--- a/llvm/lib/IR/DIBuilder.cpp
+++ b/llvm/lib/IR/DIBuilder.cpp
@@ -438,6 +438,9 @@ DIDerivedType *DIBuilder::createVariantMemberType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
Constant *Discriminant, DINode::DIFlags Flags, DIType *Ty) {
+ // "ExtraData" is overloaded for bit fields and for variants, so
+ // make sure to disallow this.
+ assert((Flags & DINode::FlagBitField) == 0);
return DIDerivedType::get(
VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits, OffsetInBits,