1336809Sdim//===- DIAInjectedSource.cpp - DIA impl for IPDBInjectedSource --*- C++ -*-===//
2336809Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6336809Sdim//
7336809Sdim//===----------------------------------------------------------------------===//
8336809Sdim
9336809Sdim#include "llvm/DebugInfo/PDB/DIA/DIAInjectedSource.h"
10336809Sdim#include "llvm/ADT/ArrayRef.h"
11336809Sdim#include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
12336809Sdim#include "llvm/DebugInfo/PDB/DIA/DIASession.h"
13336809Sdim#include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
14336809Sdim
15336809Sdimusing namespace llvm;
16336809Sdimusing namespace llvm::pdb;
17336809Sdim
18336809SdimDIAInjectedSource::DIAInjectedSource(CComPtr<IDiaInjectedSource> DiaSourceFile)
19336809Sdim    : SourceFile(DiaSourceFile) {}
20336809Sdim
21336809Sdimuint32_t DIAInjectedSource::getCrc32() const {
22336809Sdim  DWORD Crc;
23336809Sdim  return (S_OK == SourceFile->get_crc(&Crc)) ? Crc : 0;
24336809Sdim}
25336809Sdim
26336809Sdimuint64_t DIAInjectedSource::getCodeByteSize() const {
27336809Sdim  ULONGLONG Size;
28336809Sdim  return (S_OK == SourceFile->get_length(&Size)) ? Size : 0;
29336809Sdim}
30336809Sdim
31336809Sdimstd::string DIAInjectedSource::getFileName() const {
32336809Sdim  return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_filename);
33336809Sdim}
34336809Sdim
35336809Sdimstd::string DIAInjectedSource::getObjectFileName() const {
36336809Sdim  return invokeBstrMethod(*SourceFile, &IDiaInjectedSource::get_objectFilename);
37336809Sdim}
38336809Sdim
39336809Sdimstd::string DIAInjectedSource::getVirtualFileName() const {
40336809Sdim  return invokeBstrMethod(*SourceFile,
41336809Sdim                          &IDiaInjectedSource::get_virtualFilename);
42336809Sdim}
43336809Sdim
44353358Sdimuint32_t DIAInjectedSource::getCompression() const {
45336809Sdim  DWORD Compression = 0;
46336809Sdim  if (S_OK != SourceFile->get_sourceCompression(&Compression))
47336809Sdim    return PDB_SourceCompression::None;
48353358Sdim  return static_cast<uint32_t>(Compression);
49336809Sdim}
50336809Sdim
51336809Sdimstd::string DIAInjectedSource::getCode() const {
52336809Sdim  DWORD DataSize;
53336809Sdim  if (S_OK != SourceFile->get_source(0, &DataSize, nullptr))
54336809Sdim    return "";
55336809Sdim
56336809Sdim  std::vector<uint8_t> Buffer(DataSize);
57336809Sdim  if (S_OK != SourceFile->get_source(DataSize, &DataSize, Buffer.data()))
58336809Sdim    return "";
59336809Sdim  assert(Buffer.size() == DataSize);
60336809Sdim  return std::string(reinterpret_cast<const char *>(Buffer.data()),
61336809Sdim                     Buffer.size());
62336809Sdim}
63