1591312c5SZachary Turner //===- DebugFrameDataSubsection.cpp -----------------------------*- C++ -*-===//
2591312c5SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6591312c5SZachary Turner //
7591312c5SZachary Turner //===----------------------------------------------------------------------===//
8591312c5SZachary Turner 
9591312c5SZachary Turner #include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
10591312c5SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewError.h"
11591312c5SZachary Turner 
12591312c5SZachary Turner using namespace llvm;
13591312c5SZachary Turner using namespace llvm::codeview;
14591312c5SZachary Turner 
15591312c5SZachary Turner Error DebugFrameDataSubsectionRef::initialize(BinaryStreamReader Reader) {
1642e7cc1bSZachary Turner   if (Reader.bytesRemaining() % sizeof(FrameData) != 0) {
17591312c5SZachary Turner     if (auto EC = Reader.readObject(RelocPtr))
18591312c5SZachary Turner       return EC;
1942e7cc1bSZachary Turner   }
2042e7cc1bSZachary Turner 
21591312c5SZachary Turner   if (Reader.bytesRemaining() % sizeof(FrameData) != 0)
22591312c5SZachary Turner     return make_error<CodeViewError>(cv_error_code::corrupt_record,
23591312c5SZachary Turner                                      "Invalid frame data record format!");
24591312c5SZachary Turner 
25591312c5SZachary Turner   uint32_t Count = Reader.bytesRemaining() / sizeof(FrameData);
26591312c5SZachary Turner   if (auto EC = Reader.readArray(Frames, Count))
27591312c5SZachary Turner     return EC;
28591312c5SZachary Turner   return Error::success();
29591312c5SZachary Turner }
30591312c5SZachary Turner 
3142e7cc1bSZachary Turner Error DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) {
3242e7cc1bSZachary Turner   BinaryStreamReader Reader(Section);
3342e7cc1bSZachary Turner   return initialize(Reader);
3442e7cc1bSZachary Turner }
3542e7cc1bSZachary Turner 
36591312c5SZachary Turner uint32_t DebugFrameDataSubsection::calculateSerializedSize() const {
3742e7cc1bSZachary Turner   uint32_t Size = sizeof(FrameData) * Frames.size();
3842e7cc1bSZachary Turner   if (IncludeRelocPtr)
3942e7cc1bSZachary Turner     Size += sizeof(uint32_t);
4042e7cc1bSZachary Turner   return Size;
41591312c5SZachary Turner }
42591312c5SZachary Turner 
43591312c5SZachary Turner Error DebugFrameDataSubsection::commit(BinaryStreamWriter &Writer) const {
4442e7cc1bSZachary Turner   if (IncludeRelocPtr) {
45591312c5SZachary Turner     if (auto EC = Writer.writeInteger<uint32_t>(0))
46591312c5SZachary Turner       return EC;
4742e7cc1bSZachary Turner   }
48591312c5SZachary Turner 
4942e7cc1bSZachary Turner   std::vector<FrameData> SortedFrames(Frames.begin(), Frames.end());
5042e7cc1bSZachary Turner   std::sort(SortedFrames.begin(), SortedFrames.end(),
5142e7cc1bSZachary Turner             [](const FrameData &LHS, const FrameData &RHS) {
5242e7cc1bSZachary Turner               return LHS.RvaStart < RHS.RvaStart;
5342e7cc1bSZachary Turner             });
5442e7cc1bSZachary Turner   if (auto EC = Writer.writeArray(makeArrayRef(SortedFrames)))
55591312c5SZachary Turner     return EC;
56591312c5SZachary Turner   return Error::success();
57591312c5SZachary Turner }
58591312c5SZachary Turner 
59591312c5SZachary Turner void DebugFrameDataSubsection::addFrameData(const FrameData &Frame) {
60591312c5SZachary Turner   Frames.push_back(Frame);
61591312c5SZachary Turner }
62