diff options
author | Tom Tromey <tromey@adacore.com> | 2025-02-24 11:11:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-24 10:11:53 -0800 |
commit | e298fc2da97120a30ee2f120ac184ab209fc1eb4 (patch) | |
tree | 3b72fa95d938b8ace37a479a1a119b73cd718dde /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 8dbc393e447299d1a4d35b96c6e66542a5928cff (diff) | |
download | llvm-e298fc2da97120a30ee2f120ac184ab209fc1eb4.zip llvm-e298fc2da97120a30ee2f120ac184ab209fc1eb4.tar.gz llvm-e298fc2da97120a30ee2f120ac184ab209fc1eb4.tar.bz2 |
Add DISubrangeType (#126772)
An Ada program can have types that are subranges of other types. This
patch adds a new DIType node, DISubrangeType, to represent this concept.
I considered extending the existing DISubrange to do this, but as
DISubrange does not derive from DIType, that approach seemed more
disruptive.
A DISubrangeType can be used both as an ordinary type, but also as the
type of an array index. This is also important for Ada.
Ada subrange types can also be stored using a bias. Representing this in
the DWARF required the use of an extension. GCC has been emitting this
extension for years, so I've reused it here.
Diffstat (limited to 'llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 450b806..440a2c9 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -327,6 +327,8 @@ private: SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); void writeDIDerivedType(const DIDerivedType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); + void writeDISubrangeType(const DISubrangeType *N, + SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); void writeDICompositeType(const DICompositeType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); void writeDISubroutineType(const DISubroutineType *N, @@ -1937,6 +1939,27 @@ void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N, Record.clear(); } +void ModuleBitcodeWriter::writeDISubrangeType(const DISubrangeType *N, + SmallVectorImpl<uint64_t> &Record, + unsigned Abbrev) { + Record.push_back(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(N->getAlignInBits()); + Record.push_back(N->getFlags()); + Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); + Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound())); + Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound())); + Record.push_back(VE.getMetadataOrNullID(N->getRawStride())); + Record.push_back(VE.getMetadataOrNullID(N->getRawBias())); + + Stream.EmitRecord(bitc::METADATA_SUBRANGE_TYPE, Record, Abbrev); + Record.clear(); +} + void ModuleBitcodeWriter::writeDICompositeType( const DICompositeType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { |