1*0b57cec5SDimitry Andric //===- DIAInjectedSource.cpp - DIA impl for IPDBInjectedSource --*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAInjectedSource.h" 10*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 11*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h" 12*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASession.h" 13*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h" 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric using namespace llvm; 16*0b57cec5SDimitry Andric using namespace llvm::pdb; 17*0b57cec5SDimitry Andric DIAInjectedSource(CComPtr<IDiaInjectedSource> DiaSourceFile)18*0b57cec5SDimitry AndricDIAInjectedSource::DIAInjectedSource(CComPtr<IDiaInjectedSource> DiaSourceFile) 19*0b57cec5SDimitry Andric : SourceFile(DiaSourceFile) {} 20*0b57cec5SDimitry Andric getCrc32() const21*0b57cec5SDimitry Andricuint32_t DIAInjectedSource::getCrc32() const { 22*0b57cec5SDimitry Andric DWORD Crc; 23*0b57cec5SDimitry Andric return (S_OK == SourceFile->get_crc(&Crc)) ? Crc : 0; 24*0b57cec5SDimitry Andric } 25*0b57cec5SDimitry Andric getCodeByteSize() const26*0b57cec5SDimitry Andricuint64_t DIAInjectedSource::getCodeByteSize() const { 27*0b57cec5SDimitry Andric ULONGLONG Size; 28*0b57cec5SDimitry Andric return (S_OK == SourceFile->get_length(&Size)) ? Size : 0; 29*0b57cec5SDimitry Andric } 30*0b57cec5SDimitry Andric getFileName() const31*0b57cec5SDimitry Andricstd::string DIAInjectedSource::getFileName() const { 32*0b57cec5SDimitry Andric return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_filename); 33*0b57cec5SDimitry Andric } 34*0b57cec5SDimitry Andric getObjectFileName() const35*0b57cec5SDimitry Andricstd::string DIAInjectedSource::getObjectFileName() const { 36*0b57cec5SDimitry Andric return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_objectFilename); 37*0b57cec5SDimitry Andric } 38*0b57cec5SDimitry Andric getVirtualFileName() const39*0b57cec5SDimitry Andricstd::string DIAInjectedSource::getVirtualFileName() const { 40*0b57cec5SDimitry Andric return invokeBstrMethod(*SourceFile, 41*0b57cec5SDimitry Andric &IDiaInjectedSource::get_virtualFilename); 42*0b57cec5SDimitry Andric } 43*0b57cec5SDimitry Andric getCompression() const44*0b57cec5SDimitry Andricuint32_t DIAInjectedSource::getCompression() const { 45*0b57cec5SDimitry Andric DWORD Compression = 0; 46*0b57cec5SDimitry Andric if (S_OK != SourceFile->get_sourceCompression(&Compression)) 47*0b57cec5SDimitry Andric return PDB_SourceCompression::None; 48*0b57cec5SDimitry Andric return static_cast<uint32_t>(Compression); 49*0b57cec5SDimitry Andric } 50*0b57cec5SDimitry Andric getCode() const51*0b57cec5SDimitry Andricstd::string DIAInjectedSource::getCode() const { 52*0b57cec5SDimitry Andric DWORD DataSize; 53*0b57cec5SDimitry Andric if (S_OK != SourceFile->get_source(0, &DataSize, nullptr)) 54*0b57cec5SDimitry Andric return ""; 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric std::vector<uint8_t> Buffer(DataSize); 57*0b57cec5SDimitry Andric if (S_OK != SourceFile->get_source(DataSize, &DataSize, Buffer.data())) 58*0b57cec5SDimitry Andric return ""; 59*0b57cec5SDimitry Andric assert(Buffer.size() == DataSize); 60*0b57cec5SDimitry Andric return std::string(reinterpret_cast<const char *>(Buffer.data()), 61*0b57cec5SDimitry Andric Buffer.size()); 62*0b57cec5SDimitry Andric } 63