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