Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp
35271 views
//===- DebugInlineeLinesSubsection.cpp ------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"9#include "llvm/ADT/ArrayRef.h"10#include "llvm/DebugInfo/CodeView/CodeView.h"11#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"12#include "llvm/DebugInfo/CodeView/RecordSerialization.h"13#include "llvm/Support/BinaryStreamReader.h"14#include "llvm/Support/BinaryStreamWriter.h"15#include "llvm/Support/Endian.h"16#include "llvm/Support/Error.h"17#include <cassert>18#include <cstdint>1920using namespace llvm;21using namespace llvm::codeview;2223Error VarStreamArrayExtractor<InlineeSourceLine>::24operator()(BinaryStreamRef Stream, uint32_t &Len, InlineeSourceLine &Item) {25BinaryStreamReader Reader(Stream);2627if (auto EC = Reader.readObject(Item.Header))28return EC;2930if (HasExtraFiles) {31uint32_t ExtraFileCount;32if (auto EC = Reader.readInteger(ExtraFileCount))33return EC;34if (auto EC = Reader.readArray(Item.ExtraFiles, ExtraFileCount))35return EC;36}3738Len = Reader.getOffset();39return Error::success();40}4142DebugInlineeLinesSubsectionRef::DebugInlineeLinesSubsectionRef()43: DebugSubsectionRef(DebugSubsectionKind::InlineeLines) {}4445Error DebugInlineeLinesSubsectionRef::initialize(BinaryStreamReader Reader) {46if (auto EC = Reader.readEnum(Signature))47return EC;4849Lines.getExtractor().HasExtraFiles = hasExtraFiles();50if (auto EC = Reader.readArray(Lines, Reader.bytesRemaining()))51return EC;5253assert(Reader.bytesRemaining() == 0);54return Error::success();55}5657bool DebugInlineeLinesSubsectionRef::hasExtraFiles() const {58return Signature == InlineeLinesSignature::ExtraFiles;59}6061DebugInlineeLinesSubsection::DebugInlineeLinesSubsection(62DebugChecksumsSubsection &Checksums, bool HasExtraFiles)63: DebugSubsection(DebugSubsectionKind::InlineeLines), Checksums(Checksums),64HasExtraFiles(HasExtraFiles) {}6566uint32_t DebugInlineeLinesSubsection::calculateSerializedSize() const {67// 4 bytes for the signature68uint32_t Size = sizeof(InlineeLinesSignature);6970// one header for each entry.71Size += Entries.size() * sizeof(InlineeSourceLineHeader);72if (HasExtraFiles) {73// If extra files are enabled, one count for each entry.74Size += Entries.size() * sizeof(uint32_t);7576// And one file id for each file.77Size += ExtraFileCount * sizeof(uint32_t);78}79assert(Size % 4 == 0);80return Size;81}8283Error DebugInlineeLinesSubsection::commit(BinaryStreamWriter &Writer) const {84InlineeLinesSignature Sig = InlineeLinesSignature::Normal;85if (HasExtraFiles)86Sig = InlineeLinesSignature::ExtraFiles;8788if (auto EC = Writer.writeEnum(Sig))89return EC;9091for (const auto &E : Entries) {92if (auto EC = Writer.writeObject(E.Header))93return EC;9495if (!HasExtraFiles)96continue;9798if (auto EC = Writer.writeInteger<uint32_t>(E.ExtraFiles.size()))99return EC;100if (auto EC = Writer.writeArray(ArrayRef(E.ExtraFiles)))101return EC;102}103104return Error::success();105}106107void DebugInlineeLinesSubsection::addExtraFile(StringRef FileName) {108uint32_t Offset = Checksums.mapChecksumOffset(FileName);109110auto &Entry = Entries.back();111Entry.ExtraFiles.push_back(ulittle32_t(Offset));112++ExtraFileCount;113}114115void DebugInlineeLinesSubsection::addInlineSite(TypeIndex FuncId,116StringRef FileName,117uint32_t SourceLine) {118uint32_t Offset = Checksums.mapChecksumOffset(FileName);119120Entries.emplace_back();121auto &Entry = Entries.back();122Entry.Header.FileID = Offset;123Entry.Header.SourceLineNum = SourceLine;124Entry.Header.Inlinee = FuncId;125}126127128