diff options
author | Jeremy Morse <jeremy.morse@sony.com> | 2025-07-07 11:57:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-07 11:57:46 +0100 |
commit | c995c5035567a0d5f3c9bcd6d07cdc3e5651099a (patch) | |
tree | 8bbaffa15674ec44242899f8a12e53540539e51a /llvm/lib/Bitcode/Reader/MetadataLoader.cpp | |
parent | 7a6435bec59010e4bb2e1e52a9ba840ed152b4ce (diff) | |
download | llvm-c995c5035567a0d5f3c9bcd6d07cdc3e5651099a.zip llvm-c995c5035567a0d5f3c9bcd6d07cdc3e5651099a.tar.gz llvm-c995c5035567a0d5f3c9bcd6d07cdc3e5651099a.tar.bz2 |
[KeyInstr] Add bitcode support (#147260)
Serialise key-instruction fields of DILocations and DISubprograms into
and outof bitcode, add tests. debug-info bitcode sizes grow, but it
balances out given an earlier size optimisation in 51f4e2c.
Co-authored-by: Orlando Cazalet-Hyams <orlando.hyams@sony.com>
Diffstat (limited to 'llvm/lib/Bitcode/Reader/MetadataLoader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index 690341f..738e47b 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -1426,7 +1426,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( break; } case bitc::METADATA_LOCATION: { - if (Record.size() != 5 && Record.size() != 6) + // 5: inlinedAt, 6: isImplicit, 8: Key Instructions fields. + if (Record.size() != 5 && Record.size() != 6 && Record.size() != 8) return error("Invalid record"); IsDistinct = Record[0]; @@ -1434,10 +1435,12 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( unsigned Column = Record[2]; Metadata *Scope = getMD(Record[3]); Metadata *InlinedAt = getMDOrNull(Record[4]); - bool ImplicitCode = Record.size() == 6 && Record[5]; + bool ImplicitCode = Record.size() >= 6 && Record[5]; + uint64_t AtomGroup = Record.size() == 8 ? Record[6] : 0; + uint8_t AtomRank = Record.size() == 8 ? Record[7] : 0; MetadataList.assignValue( GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt, - ImplicitCode)), + ImplicitCode, AtomGroup, AtomRank)), NextMetadataNo); NextMetadataNo++; break; @@ -1890,7 +1893,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( break; } case bitc::METADATA_SUBPROGRAM: { - if (Record.size() < 18 || Record.size() > 21) + if (Record.size() < 18 || Record.size() > 22) return error("Invalid record"); bool HasSPFlags = Record[0] & 4; @@ -1942,6 +1945,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( bool HasTargetFuncName = false; unsigned OffsetA = 0; unsigned OffsetB = 0; + // Key instructions won't be enabled in old-format bitcode, so only + // check it if HasSPFlags is true. + bool UsesKeyInstructions = false; if (!HasSPFlags) { OffsetA = 2; OffsetB = 2; @@ -1954,7 +1960,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( } else { HasAnnotations = Record.size() >= 19; HasTargetFuncName = Record.size() >= 20; + UsesKeyInstructions = Record.size() >= 21 ? Record[20] : 0; } + Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]); DISubprogram *SP = GET_OR_DISTINCT( DISubprogram, @@ -1980,8 +1988,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( HasAnnotations ? getMDOrNull(Record[18 + OffsetB]) : nullptr, // annotations HasTargetFuncName ? getMDString(Record[19 + OffsetB]) - : nullptr // targetFuncName - )); + : nullptr, // targetFuncName + UsesKeyInstructions)); MetadataList.assignValue(SP, NextMetadataNo); NextMetadataNo++; |