xref: /llvm-project/llvm/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp (revision 81cde474e2c5a6280cb693b777ddcf473825ae8a)
18456b16eSEugene Zelenko //===- DebugCrossExSubsection.cpp -----------------------------------------===//
2349c18f8SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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"
11*81cde474Sserge-sans-paille #include "llvm/Support/BinaryStreamReader.h"
128456b16eSEugene Zelenko #include "llvm/Support/BinaryStreamWriter.h"
138456b16eSEugene Zelenko #include "llvm/Support/Error.h"
148456b16eSEugene Zelenko #include <cstdint>
15349c18f8SZachary Turner 
16349c18f8SZachary Turner using namespace llvm;
17349c18f8SZachary Turner using namespace llvm::codeview;
18349c18f8SZachary Turner 
initialize(BinaryStreamReader Reader)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 
initialize(BinaryStreamRef Stream)30349c18f8SZachary Turner Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
31349c18f8SZachary Turner   BinaryStreamReader Reader(Stream);
32349c18f8SZachary Turner   return initialize(Reader);
33349c18f8SZachary Turner }
34349c18f8SZachary Turner 
addMapping(uint32_t Local,uint32_t Global)35349c18f8SZachary Turner void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
36349c18f8SZachary Turner                                                    uint32_t Global) {
37349c18f8SZachary Turner   Mappings[Local] = Global;
38349c18f8SZachary Turner }
39349c18f8SZachary Turner 
calculateSerializedSize() const40349c18f8SZachary Turner uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
41349c18f8SZachary Turner   return Mappings.size() * sizeof(CrossModuleExport);
42349c18f8SZachary Turner }
43349c18f8SZachary Turner 
commit(BinaryStreamWriter & Writer) const44349c18f8SZachary 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