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