1ee2f195dSDimitry Andric //===- DebugFrameDataSubsection.cpp -----------------------------*- C++ -*-===// 2ee2f195dSDimitry Andric // 3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ee2f195dSDimitry Andric // 7ee2f195dSDimitry Andric //===----------------------------------------------------------------------===// 8ee2f195dSDimitry Andric 9ee2f195dSDimitry Andric #include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h" 10ee2f195dSDimitry Andric #include "llvm/DebugInfo/CodeView/CodeViewError.h" 11145449b1SDimitry Andric #include "llvm/Support/BinaryStreamReader.h" 12145449b1SDimitry Andric #include "llvm/Support/BinaryStreamWriter.h" 13ee2f195dSDimitry Andric 14ee2f195dSDimitry Andric using namespace llvm; 15ee2f195dSDimitry Andric using namespace llvm::codeview; 16ee2f195dSDimitry Andric initialize(BinaryStreamReader Reader)17ee2f195dSDimitry AndricError DebugFrameDataSubsectionRef::initialize(BinaryStreamReader Reader) { 18d8e91e46SDimitry Andric if (Reader.bytesRemaining() % sizeof(FrameData) != 0) { 19ee2f195dSDimitry Andric if (auto EC = Reader.readObject(RelocPtr)) 20ee2f195dSDimitry Andric return EC; 21d8e91e46SDimitry Andric } 22d8e91e46SDimitry Andric 23ee2f195dSDimitry Andric if (Reader.bytesRemaining() % sizeof(FrameData) != 0) 24ee2f195dSDimitry Andric return make_error<CodeViewError>(cv_error_code::corrupt_record, 25ee2f195dSDimitry Andric "Invalid frame data record format!"); 26ee2f195dSDimitry Andric 27ee2f195dSDimitry Andric uint32_t Count = Reader.bytesRemaining() / sizeof(FrameData); 28ee2f195dSDimitry Andric if (auto EC = Reader.readArray(Frames, Count)) 29ee2f195dSDimitry Andric return EC; 30ee2f195dSDimitry Andric return Error::success(); 31ee2f195dSDimitry Andric } 32ee2f195dSDimitry Andric initialize(BinaryStreamRef Section)33d8e91e46SDimitry AndricError DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) { 34d8e91e46SDimitry Andric BinaryStreamReader Reader(Section); 35d8e91e46SDimitry Andric return initialize(Reader); 36d8e91e46SDimitry Andric } 37d8e91e46SDimitry Andric calculateSerializedSize() const38ee2f195dSDimitry Andricuint32_t DebugFrameDataSubsection::calculateSerializedSize() const { 39d8e91e46SDimitry Andric uint32_t Size = sizeof(FrameData) * Frames.size(); 40d8e91e46SDimitry Andric if (IncludeRelocPtr) 41d8e91e46SDimitry Andric Size += sizeof(uint32_t); 42d8e91e46SDimitry Andric return Size; 43ee2f195dSDimitry Andric } 44ee2f195dSDimitry Andric commit(BinaryStreamWriter & Writer) const45ee2f195dSDimitry AndricError DebugFrameDataSubsection::commit(BinaryStreamWriter &Writer) const { 46d8e91e46SDimitry Andric if (IncludeRelocPtr) { 47ee2f195dSDimitry Andric if (auto EC = Writer.writeInteger<uint32_t>(0)) 48ee2f195dSDimitry Andric return EC; 49d8e91e46SDimitry Andric } 50ee2f195dSDimitry Andric 51d8e91e46SDimitry Andric std::vector<FrameData> SortedFrames(Frames.begin(), Frames.end()); 52b60736ecSDimitry Andric llvm::sort(SortedFrames, [](const FrameData &LHS, const FrameData &RHS) { 53d8e91e46SDimitry Andric return LHS.RvaStart < RHS.RvaStart; 54d8e91e46SDimitry Andric }); 55e3b55780SDimitry Andric if (auto EC = Writer.writeArray(ArrayRef(SortedFrames))) 56ee2f195dSDimitry Andric return EC; 57ee2f195dSDimitry Andric return Error::success(); 58ee2f195dSDimitry Andric } 59ee2f195dSDimitry Andric addFrameData(const FrameData & Frame)60ee2f195dSDimitry Andricvoid DebugFrameDataSubsection::addFrameData(const FrameData &Frame) { 61ee2f195dSDimitry Andric Frames.push_back(Frame); 62ee2f195dSDimitry Andric } 63