xref: /src/contrib/llvm-project/llvm/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 Andric Error 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 Andric Error DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) {
34d8e91e46SDimitry Andric   BinaryStreamReader Reader(Section);
35d8e91e46SDimitry Andric   return initialize(Reader);
36d8e91e46SDimitry Andric }
37d8e91e46SDimitry Andric 
calculateSerializedSize() const38ee2f195dSDimitry Andric uint32_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 Andric Error 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 Andric void DebugFrameDataSubsection::addFrameData(const FrameData &Frame) {
61ee2f195dSDimitry Andric   Frames.push_back(Frame);
62ee2f195dSDimitry Andric }
63