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