1591312c5SZachary Turner //===- DebugFrameDataSubsection.cpp -----------------------------*- C++ -*-===//
2591312c5SZachary Turner //
3591312c5SZachary Turner //                     The LLVM Compiler Infrastructure
4591312c5SZachary Turner //
5591312c5SZachary Turner // This file is distributed under the University of Illinois Open Source
6591312c5SZachary Turner // License. See LICENSE.TXT for details.
7591312c5SZachary Turner //
8591312c5SZachary Turner //===----------------------------------------------------------------------===//
9591312c5SZachary Turner 
10591312c5SZachary Turner #include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
11591312c5SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewError.h"
12591312c5SZachary Turner 
13591312c5SZachary Turner using namespace llvm;
14591312c5SZachary Turner using namespace llvm::codeview;
15591312c5SZachary Turner 
16591312c5SZachary Turner Error DebugFrameDataSubsectionRef::initialize(BinaryStreamReader Reader) {
17*42e7cc1bSZachary Turner   if (Reader.bytesRemaining() % sizeof(FrameData) != 0) {
18591312c5SZachary Turner     if (auto EC = Reader.readObject(RelocPtr))
19591312c5SZachary Turner       return EC;
20*42e7cc1bSZachary Turner   }
21*42e7cc1bSZachary Turner 
22591312c5SZachary Turner   if (Reader.bytesRemaining() % sizeof(FrameData) != 0)
23591312c5SZachary Turner     return make_error<CodeViewError>(cv_error_code::corrupt_record,
24591312c5SZachary Turner                                      "Invalid frame data record format!");
25591312c5SZachary Turner 
26591312c5SZachary Turner   uint32_t Count = Reader.bytesRemaining() / sizeof(FrameData);
27591312c5SZachary Turner   if (auto EC = Reader.readArray(Frames, Count))
28591312c5SZachary Turner     return EC;
29591312c5SZachary Turner   return Error::success();
30591312c5SZachary Turner }
31591312c5SZachary Turner 
32*42e7cc1bSZachary Turner Error DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) {
33*42e7cc1bSZachary Turner   BinaryStreamReader Reader(Section);
34*42e7cc1bSZachary Turner   return initialize(Reader);
35*42e7cc1bSZachary Turner }
36*42e7cc1bSZachary Turner 
37591312c5SZachary Turner uint32_t DebugFrameDataSubsection::calculateSerializedSize() const {
38*42e7cc1bSZachary Turner   uint32_t Size = sizeof(FrameData) * Frames.size();
39*42e7cc1bSZachary Turner   if (IncludeRelocPtr)
40*42e7cc1bSZachary Turner     Size += sizeof(uint32_t);
41*42e7cc1bSZachary Turner   return Size;
42591312c5SZachary Turner }
43591312c5SZachary Turner 
44591312c5SZachary Turner Error DebugFrameDataSubsection::commit(BinaryStreamWriter &Writer) const {
45*42e7cc1bSZachary Turner   if (IncludeRelocPtr) {
46591312c5SZachary Turner     if (auto EC = Writer.writeInteger<uint32_t>(0))
47591312c5SZachary Turner       return EC;
48*42e7cc1bSZachary Turner   }
49591312c5SZachary Turner 
50*42e7cc1bSZachary Turner   std::vector<FrameData> SortedFrames(Frames.begin(), Frames.end());
51*42e7cc1bSZachary Turner   std::sort(SortedFrames.begin(), SortedFrames.end(),
52*42e7cc1bSZachary Turner             [](const FrameData &LHS, const FrameData &RHS) {
53*42e7cc1bSZachary Turner               return LHS.RvaStart < RHS.RvaStart;
54*42e7cc1bSZachary Turner             });
55*42e7cc1bSZachary Turner   if (auto EC = Writer.writeArray(makeArrayRef(SortedFrames)))
56591312c5SZachary Turner     return EC;
57591312c5SZachary Turner   return Error::success();
58591312c5SZachary Turner }
59591312c5SZachary Turner 
60591312c5SZachary Turner void DebugFrameDataSubsection::addFrameData(const FrameData &Frame) {
61591312c5SZachary Turner   Frames.push_back(Frame);
62591312c5SZachary Turner }
63