1*349c18f8SZachary Turner //===- DebugCrossExSubsection.cpp -------------------------------*- C++ -*-===//
2*349c18f8SZachary Turner //
3*349c18f8SZachary Turner //                     The LLVM Compiler Infrastructure
4*349c18f8SZachary Turner //
5*349c18f8SZachary Turner // This file is distributed under the University of Illinois Open Source
6*349c18f8SZachary Turner // License. See LICENSE.TXT for details.
7*349c18f8SZachary Turner //
8*349c18f8SZachary Turner //===----------------------------------------------------------------------===//
9*349c18f8SZachary Turner 
10*349c18f8SZachary Turner #include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
11*349c18f8SZachary Turner 
12*349c18f8SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewError.h"
13*349c18f8SZachary Turner 
14*349c18f8SZachary Turner using namespace llvm;
15*349c18f8SZachary Turner using namespace llvm::codeview;
16*349c18f8SZachary Turner 
17*349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(
18*349c18f8SZachary Turner     BinaryStreamReader Reader) {
19*349c18f8SZachary Turner   if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
20*349c18f8SZachary Turner     return make_error<CodeViewError>(
21*349c18f8SZachary Turner         cv_error_code::corrupt_record,
22*349c18f8SZachary Turner         "Cross Scope Exports section is an invalid size!");
23*349c18f8SZachary Turner 
24*349c18f8SZachary Turner   uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
25*349c18f8SZachary Turner   return Reader.readArray(References, Size);
26*349c18f8SZachary Turner }
27*349c18f8SZachary Turner 
28*349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
29*349c18f8SZachary Turner   BinaryStreamReader Reader(Stream);
30*349c18f8SZachary Turner   return initialize(Reader);
31*349c18f8SZachary Turner }
32*349c18f8SZachary Turner 
33*349c18f8SZachary Turner void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
34*349c18f8SZachary Turner                                                    uint32_t Global) {
35*349c18f8SZachary Turner   Mappings[Local] = Global;
36*349c18f8SZachary Turner }
37*349c18f8SZachary Turner 
38*349c18f8SZachary Turner uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
39*349c18f8SZachary Turner   return Mappings.size() * sizeof(CrossModuleExport);
40*349c18f8SZachary Turner }
41*349c18f8SZachary Turner 
42*349c18f8SZachary Turner Error DebugCrossModuleExportsSubsection::commit(
43*349c18f8SZachary Turner     BinaryStreamWriter &Writer) const {
44*349c18f8SZachary Turner   for (const auto &M : Mappings) {
45*349c18f8SZachary Turner     if (auto EC = Writer.writeObject(M))
46*349c18f8SZachary Turner       return EC;
47*349c18f8SZachary Turner   }
48*349c18f8SZachary Turner   return Error::success();
49*349c18f8SZachary Turner }
50