1ff0cc061SDimitry Andric //===- DIASourceFile.cpp - DIA implementation of IPDBSourceFile -*- C++ -*-===//
2ff0cc061SDimitry Andric //
3ff0cc061SDimitry Andric // The LLVM Compiler Infrastructure
4ff0cc061SDimitry Andric //
5ff0cc061SDimitry Andric // This file is distributed under the University of Illinois Open Source
6ff0cc061SDimitry Andric // License. See LICENSE.TXT for details.
7ff0cc061SDimitry Andric //
8ff0cc061SDimitry Andric //===----------------------------------------------------------------------===//
9ff0cc061SDimitry Andric
103ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASourceFile.h"
113ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
12ff0cc061SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h"
13ff0cc061SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
14*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
153ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
16ff0cc061SDimitry Andric
17ff0cc061SDimitry Andric using namespace llvm;
183ca95b02SDimitry Andric using namespace llvm::pdb;
19ff0cc061SDimitry Andric
DIASourceFile(const DIASession & PDBSession,CComPtr<IDiaSourceFile> DiaSourceFile)20ff0cc061SDimitry Andric DIASourceFile::DIASourceFile(const DIASession &PDBSession,
21ff0cc061SDimitry Andric CComPtr<IDiaSourceFile> DiaSourceFile)
22ff0cc061SDimitry Andric : Session(PDBSession), SourceFile(DiaSourceFile) {}
23ff0cc061SDimitry Andric
getFileName() const24ff0cc061SDimitry Andric std::string DIASourceFile::getFileName() const {
25*b5893f02SDimitry Andric return invokeBstrMethod(*SourceFile, &IDiaSourceFile::get_fileName);
26ff0cc061SDimitry Andric }
27ff0cc061SDimitry Andric
getUniqueId() const28ff0cc061SDimitry Andric uint32_t DIASourceFile::getUniqueId() const {
29ff0cc061SDimitry Andric DWORD Id;
30ff0cc061SDimitry Andric return (S_OK == SourceFile->get_uniqueId(&Id)) ? Id : 0;
31ff0cc061SDimitry Andric }
32ff0cc061SDimitry Andric
getChecksum() const33ff0cc061SDimitry Andric std::string DIASourceFile::getChecksum() const {
34ff0cc061SDimitry Andric DWORD ByteSize = 0;
35ff0cc061SDimitry Andric HRESULT Result = SourceFile->get_checksum(0, &ByteSize, nullptr);
36ff0cc061SDimitry Andric if (ByteSize == 0)
37ff0cc061SDimitry Andric return std::string();
38ff0cc061SDimitry Andric std::vector<BYTE> ChecksumBytes(ByteSize);
39ff0cc061SDimitry Andric Result = SourceFile->get_checksum(ByteSize, &ByteSize, &ChecksumBytes[0]);
40ff0cc061SDimitry Andric if (S_OK != Result)
41ff0cc061SDimitry Andric return std::string();
42ff0cc061SDimitry Andric return std::string(ChecksumBytes.begin(), ChecksumBytes.end());
43ff0cc061SDimitry Andric }
44ff0cc061SDimitry Andric
getChecksumType() const45ff0cc061SDimitry Andric PDB_Checksum DIASourceFile::getChecksumType() const {
46ff0cc061SDimitry Andric DWORD Type;
47ff0cc061SDimitry Andric HRESULT Result = SourceFile->get_checksumType(&Type);
48ff0cc061SDimitry Andric if (S_OK != Result)
49ff0cc061SDimitry Andric return PDB_Checksum::None;
50ff0cc061SDimitry Andric return static_cast<PDB_Checksum>(Type);
51ff0cc061SDimitry Andric }
52ff0cc061SDimitry Andric
533ca95b02SDimitry Andric std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
getCompilands() const543ca95b02SDimitry Andric DIASourceFile::getCompilands() const {
55ff0cc061SDimitry Andric CComPtr<IDiaEnumSymbols> DiaEnumerator;
56ff0cc061SDimitry Andric HRESULT Result = SourceFile->get_compilands(&DiaEnumerator);
57ff0cc061SDimitry Andric if (S_OK != Result)
58ff0cc061SDimitry Andric return nullptr;
59ff0cc061SDimitry Andric
603ca95b02SDimitry Andric auto Enumerator = std::unique_ptr<IPDBEnumSymbols>(
61ff0cc061SDimitry Andric new DIAEnumSymbols(Session, DiaEnumerator));
623ca95b02SDimitry Andric return std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>(
633ca95b02SDimitry Andric new ConcreteSymbolEnumerator<PDBSymbolCompiland>(std::move(Enumerator)));
64ff0cc061SDimitry Andric }
65