xref: /freebsd-src/contrib/llvm-project/llvm/lib/DebugInfo/PDB/DIA/DIAInjectedSource.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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 Andric DIAInjectedSource::DIAInjectedSource(CComPtr<IDiaInjectedSource> DiaSourceFile)
19*0b57cec5SDimitry Andric     : SourceFile(DiaSourceFile) {}
20*0b57cec5SDimitry Andric 
getCrc32() const21*0b57cec5SDimitry Andric uint32_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 Andric uint64_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 Andric std::string DIAInjectedSource::getFileName() const {
32*0b57cec5SDimitry Andric   return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_filename);
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
getObjectFileName() const35*0b57cec5SDimitry Andric std::string DIAInjectedSource::getObjectFileName() const {
36*0b57cec5SDimitry Andric   return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_objectFilename);
37*0b57cec5SDimitry Andric }
38*0b57cec5SDimitry Andric 
getVirtualFileName() const39*0b57cec5SDimitry Andric std::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 Andric uint32_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 Andric std::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