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