1349c18f8SZachary Turner //===- DebugCrossExSubsection.cpp -------------------------------*- C++ -*-===//
2349c18f8SZachary Turner //
3349c18f8SZachary Turner //                     The LLVM Compiler Infrastructure
4349c18f8SZachary Turner //
5349c18f8SZachary Turner // This file is distributed under the University of Illinois Open Source
6349c18f8SZachary Turner // License. See LICENSE.TXT for details.
7349c18f8SZachary Turner //
8349c18f8SZachary Turner //===----------------------------------------------------------------------===//
9349c18f8SZachary Turner 
10349c18f8SZachary Turner #include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
11349c18f8SZachary Turner 
12349c18f8SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewError.h"
13349c18f8SZachary Turner 
14349c18f8SZachary Turner using namespace llvm;
15349c18f8SZachary Turner using namespace llvm::codeview;
16349c18f8SZachary Turner 
17349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(
18349c18f8SZachary Turner     BinaryStreamReader Reader) {
19349c18f8SZachary Turner   if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
20349c18f8SZachary Turner     return make_error<CodeViewError>(
21349c18f8SZachary Turner         cv_error_code::corrupt_record,
22349c18f8SZachary Turner         "Cross Scope Exports section is an invalid size!");
23349c18f8SZachary Turner 
24349c18f8SZachary Turner   uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
25349c18f8SZachary Turner   return Reader.readArray(References, Size);
26349c18f8SZachary Turner }
27349c18f8SZachary Turner 
28349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
29349c18f8SZachary Turner   BinaryStreamReader Reader(Stream);
30349c18f8SZachary Turner   return initialize(Reader);
31349c18f8SZachary Turner }
32349c18f8SZachary Turner 
33349c18f8SZachary Turner void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
34349c18f8SZachary Turner                                                    uint32_t Global) {
35349c18f8SZachary Turner   Mappings[Local] = Global;
36349c18f8SZachary Turner }
37349c18f8SZachary Turner 
38349c18f8SZachary Turner uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
39349c18f8SZachary Turner   return Mappings.size() * sizeof(CrossModuleExport);
40349c18f8SZachary Turner }
41349c18f8SZachary Turner 
42349c18f8SZachary Turner Error DebugCrossModuleExportsSubsection::commit(
43349c18f8SZachary Turner     BinaryStreamWriter &Writer) const {
44349c18f8SZachary Turner   for (const auto &M : Mappings) {
45*88101dadSZachary Turner     if (auto EC = Writer.writeInteger(M.first))
46*88101dadSZachary Turner       return EC;
47*88101dadSZachary Turner     if (auto EC = Writer.writeInteger(M.second))
48349c18f8SZachary Turner       return EC;
49349c18f8SZachary Turner   }
50349c18f8SZachary Turner   return Error::success();
51349c18f8SZachary Turner }
52