xref: /llvm-project/llvm/lib/DebugInfo/PDB/DIA/DIASourceFile.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1cffff26bSZachary Turner //===- DIASourceFile.cpp - DIA implementation of IPDBSourceFile -*- C++ -*-===//
2cffff26bSZachary 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
6cffff26bSZachary Turner //
7cffff26bSZachary Turner //===----------------------------------------------------------------------===//
8cffff26bSZachary Turner 
943ec3af9SZachary Turner #include "llvm/DebugInfo/PDB/DIA/DIASourceFile.h"
1043ec3af9SZachary Turner #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
11cffff26bSZachary Turner #include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h"
12cffff26bSZachary Turner #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
13757274f9SAaron Smith #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
1443ec3af9SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
15cffff26bSZachary Turner 
16cffff26bSZachary Turner using namespace llvm;
17ec28fc34SZachary Turner using namespace llvm::pdb;
18cffff26bSZachary Turner 
DIASourceFile(const DIASession & PDBSession,CComPtr<IDiaSourceFile> DiaSourceFile)19cffff26bSZachary Turner DIASourceFile::DIASourceFile(const DIASession &PDBSession,
20cffff26bSZachary Turner                              CComPtr<IDiaSourceFile> DiaSourceFile)
21cffff26bSZachary Turner     : Session(PDBSession), SourceFile(DiaSourceFile) {}
22cffff26bSZachary Turner 
getFileName() const23cffff26bSZachary Turner std::string DIASourceFile::getFileName() const {
24757274f9SAaron Smith   return invokeBstrMethod(*SourceFile, &IDiaSourceFile::get_fileName);
25cffff26bSZachary Turner }
26cffff26bSZachary Turner 
getUniqueId() const27cffff26bSZachary Turner uint32_t DIASourceFile::getUniqueId() const {
28cffff26bSZachary Turner   DWORD Id;
29cffff26bSZachary Turner   return (S_OK == SourceFile->get_uniqueId(&Id)) ? Id : 0;
30cffff26bSZachary Turner }
31cffff26bSZachary Turner 
getChecksum() const32cffff26bSZachary Turner std::string DIASourceFile::getChecksum() const {
33cffff26bSZachary Turner   DWORD ByteSize = 0;
34cffff26bSZachary Turner   HRESULT Result = SourceFile->get_checksum(0, &ByteSize, nullptr);
35cffff26bSZachary Turner   if (ByteSize == 0)
36cffff26bSZachary Turner     return std::string();
37cffff26bSZachary Turner   std::vector<BYTE> ChecksumBytes(ByteSize);
38cffff26bSZachary Turner   Result = SourceFile->get_checksum(ByteSize, &ByteSize, &ChecksumBytes[0]);
39cffff26bSZachary Turner   if (S_OK != Result)
40cffff26bSZachary Turner     return std::string();
41cffff26bSZachary Turner   return std::string(ChecksumBytes.begin(), ChecksumBytes.end());
42cffff26bSZachary Turner }
43cffff26bSZachary Turner 
getChecksumType() const44cffff26bSZachary Turner PDB_Checksum DIASourceFile::getChecksumType() const {
45cffff26bSZachary Turner   DWORD Type;
46cffff26bSZachary Turner   HRESULT Result = SourceFile->get_checksumType(&Type);
47cffff26bSZachary Turner   if (S_OK != Result)
48cffff26bSZachary Turner     return PDB_Checksum::None;
49cffff26bSZachary Turner   return static_cast<PDB_Checksum>(Type);
50cffff26bSZachary Turner }
51cffff26bSZachary Turner 
5243ec3af9SZachary Turner std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
getCompilands() const5343ec3af9SZachary Turner DIASourceFile::getCompilands() const {
54cffff26bSZachary Turner   CComPtr<IDiaEnumSymbols> DiaEnumerator;
55cffff26bSZachary Turner   HRESULT Result = SourceFile->get_compilands(&DiaEnumerator);
56cffff26bSZachary Turner   if (S_OK != Result)
57cffff26bSZachary Turner     return nullptr;
58cffff26bSZachary Turner 
5943ec3af9SZachary Turner   auto Enumerator = std::unique_ptr<IPDBEnumSymbols>(
60cffff26bSZachary Turner       new DIAEnumSymbols(Session, DiaEnumerator));
6143ec3af9SZachary Turner   return std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>(
6243ec3af9SZachary Turner       new ConcreteSymbolEnumerator<PDBSymbolCompiland>(std::move(Enumerator)));
63cffff26bSZachary Turner }
64