aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2025-06-25 12:20:35 -0600
committerGitHub <noreply@github.com>2025-06-25 11:20:35 -0700
commit3b90597c2ceaae86608214f6b62b43e55823102b (patch)
tree3c8c3d739d99734bee8bc6bd5ed9d82d5b2d65bc /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
parent487581b826a5339410aaf306eafedc7b806b25e3 (diff)
downloadllvm-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.cpp35
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());