1*8456b16eSEugene Zelenko //===- DebugCrossExSubsection.cpp -----------------------------------------===//
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 #include "llvm/DebugInfo/CodeView/CodeViewError.h"
12*8456b16eSEugene Zelenko #include "llvm/Support/BinaryStreamWriter.h"
13*8456b16eSEugene Zelenko #include "llvm/Support/Error.h"
14*8456b16eSEugene Zelenko #include <cstdint>
15349c18f8SZachary Turner 
16349c18f8SZachary Turner using namespace llvm;
17349c18f8SZachary Turner using namespace llvm::codeview;
18349c18f8SZachary Turner 
19349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(
20349c18f8SZachary Turner     BinaryStreamReader Reader) {
21349c18f8SZachary Turner   if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
22349c18f8SZachary Turner     return make_error<CodeViewError>(
23349c18f8SZachary Turner         cv_error_code::corrupt_record,
24349c18f8SZachary Turner         "Cross Scope Exports section is an invalid size!");
25349c18f8SZachary Turner 
26349c18f8SZachary Turner   uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
27349c18f8SZachary Turner   return Reader.readArray(References, Size);
28349c18f8SZachary Turner }
29349c18f8SZachary Turner 
30349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
31349c18f8SZachary Turner   BinaryStreamReader Reader(Stream);
32349c18f8SZachary Turner   return initialize(Reader);
33349c18f8SZachary Turner }
34349c18f8SZachary Turner 
35349c18f8SZachary Turner void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
36349c18f8SZachary Turner                                                    uint32_t Global) {
37349c18f8SZachary Turner   Mappings[Local] = Global;
38349c18f8SZachary Turner }
39349c18f8SZachary Turner 
40349c18f8SZachary Turner uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
41349c18f8SZachary Turner   return Mappings.size() * sizeof(CrossModuleExport);
42349c18f8SZachary Turner }
43349c18f8SZachary Turner 
44349c18f8SZachary Turner Error DebugCrossModuleExportsSubsection::commit(
45349c18f8SZachary Turner     BinaryStreamWriter &Writer) const {
46349c18f8SZachary Turner   for (const auto &M : Mappings) {
4788101dadSZachary Turner     if (auto EC = Writer.writeInteger(M.first))
4888101dadSZachary Turner       return EC;
4988101dadSZachary Turner     if (auto EC = Writer.writeInteger(M.second))
50349c18f8SZachary Turner       return EC;
51349c18f8SZachary Turner   }
52349c18f8SZachary Turner   return Error::success();
53349c18f8SZachary Turner }
54