diff options
author | Tom Tromey <tromey@adacore.com> | 2025-06-25 12:20:35 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-25 11:20:35 -0700 |
commit | 3b90597c2ceaae86608214f6b62b43e55823102b (patch) | |
tree | 3c8c3d739d99734bee8bc6bd5ed9d82d5b2d65bc /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 487581b826a5339410aaf306eafedc7b806b25e3 (diff) | |
download | llvm-3b90597c2ceaae86608214f6b62b43e55823102b.zip llvm-3b90597c2ceaae86608214f6b62b43e55823102b.tar.gz llvm-3b90597c2ceaae86608214f6b62b43e55823102b.tar.bz2 |
Non constant size and offset in DWARF (#141106)
In Ada, a record type can have a non-constant size, and a field can
appear at a non-constant bit offset in a record.
To support this, this patch changes DIType to record the size and offset
using metadata, rather than plain integers. In addition to a constant
offset, both DIVariable and DIExpression are now supported here.
One thing of note in this patch is the choice of how exactly to
represent a non-constant bit offset, with the difficulty being that
DWARF 5 does not support this. DWARF 3 did have a way to support a
non-constant byte offset, combined with a constant bit offset within the
byte, but this was deprecated in DWARF 4 and removed from DWARF 5.
This patch takes a simple approach: a DWARF extension allowing the use
of an expression with DW_AT_data_bit_offset. There is a corresponding
DWARF issue, see https://dwarfstd.org/issues/250501.1.html. The main
reason for this approach is that it keeps API simplicity: just a single
value is needed, rather than having separate data describing the byte
offset and the bit within the byte.
Diffstat (limited to 'llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 628b939..2a2dd08 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1899,10 +1899,11 @@ void ModuleBitcodeWriter::writeDIEnumerator(const DIEnumerator *N, void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + const unsigned SizeIsMetadata = 0x2; + Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct()); Record.push_back(N->getTag()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); Record.push_back(N->getEncoding()); Record.push_back(N->getFlags()); @@ -1915,10 +1916,11 @@ void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N, void ModuleBitcodeWriter::writeDIFixedPointType( const DIFixedPointType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + const unsigned SizeIsMetadata = 0x2; + Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct()); Record.push_back(N->getTag()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); Record.push_back(N->getEncoding()); Record.push_back(N->getFlags()); @@ -1944,13 +1946,14 @@ void ModuleBitcodeWriter::writeDIFixedPointType( void ModuleBitcodeWriter::writeDIStringType(const DIStringType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + const unsigned SizeIsMetadata = 0x2; + Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct()); Record.push_back(N->getTag()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getStringLength())); Record.push_back(VE.getMetadataOrNullID(N->getStringLengthExp())); Record.push_back(VE.getMetadataOrNullID(N->getStringLocationExp())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); Record.push_back(N->getEncoding()); @@ -1961,16 +1964,17 @@ void ModuleBitcodeWriter::writeDIStringType(const DIStringType *N, void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + const unsigned SizeIsMetadata = 0x2; + Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct()); Record.push_back(N->getTag()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getFile())); Record.push_back(N->getLine()); Record.push_back(VE.getMetadataOrNullID(N->getScope())); Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); - Record.push_back(N->getOffsetInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits())); Record.push_back(N->getFlags()); Record.push_back(VE.getMetadataOrNullID(N->getExtraData())); @@ -1995,12 +1999,13 @@ void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N, void ModuleBitcodeWriter::writeDISubrangeType(const DISubrangeType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + const unsigned SizeIsMetadata = 0x2; + Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getFile())); Record.push_back(N->getLine()); Record.push_back(VE.getMetadataOrNullID(N->getScope())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); Record.push_back(N->getFlags()); Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); @@ -2017,16 +2022,18 @@ void ModuleBitcodeWriter::writeDICompositeType( const DICompositeType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { const unsigned IsNotUsedInOldTypeRef = 0x2; - Record.push_back(IsNotUsedInOldTypeRef | (unsigned)N->isDistinct()); + const unsigned SizeIsMetadata = 0x4; + Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef | + (unsigned)N->isDistinct()); Record.push_back(N->getTag()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getFile())); Record.push_back(N->getLine()); Record.push_back(VE.getMetadataOrNullID(N->getScope())); Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); - Record.push_back(N->getSizeInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits())); Record.push_back(N->getAlignInBits()); - Record.push_back(N->getOffsetInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits())); Record.push_back(N->getFlags()); Record.push_back(VE.getMetadataOrNullID(N->getElements().get())); Record.push_back(N->getRuntimeLang()); |