blob: 27424a0c954361e39b7b6094486883092779a048 [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// DxilDiaTableSourceFiles.cpp //
// Copyright (C) Microsoft Corporation. All rights reserved. //
// This file is distributed under the University of Illinois Open Source //
// License. See LICENSE.TXT for details. //
// //
// DIA API implementation for DXIL modules. //
// //
///////////////////////////////////////////////////////////////////////////////
#include "DxilDiaTableSourceFiles.h"
#include "DxilDiaSession.h"
dxil_dia::SourceFile::SourceFile(IMalloc *pMalloc, Session *pSession,
DWORD index)
: m_pMalloc(pMalloc), m_pSession(pSession), m_index(index) {}
llvm::MDTuple *dxil_dia::SourceFile::NameContent() const {
return llvm::cast<llvm::MDTuple>(m_pSession->Contents()->getOperand(m_index));
}
llvm::StringRef dxil_dia::SourceFile::Name() const {
return llvm::dyn_cast<llvm::MDString>(NameContent()->getOperand(0))
->getString();
}
STDMETHODIMP dxil_dia::SourceFile::get_uniqueId(
/* [retval][out] */ DWORD *pRetVal) {
*pRetVal = m_index;
return S_OK;
}
STDMETHODIMP dxil_dia::SourceFile::get_fileName(
/* [retval][out] */ BSTR *pRetVal) {
DxcThreadMalloc TM(m_pMalloc);
return StringRefToBSTR(Name(), pRetVal);
}
dxil_dia::SourceFilesTable::SourceFilesTable(IMalloc *pMalloc,
Session *pSession)
: impl::TableBase<IDiaEnumSourceFiles, IDiaSourceFile>(
pMalloc, pSession, Table::Kind::SourceFiles) {
m_count = (m_pSession->Contents() == nullptr)
? 0
: m_pSession->Contents()->getNumOperands();
m_items.assign(m_count, nullptr);
}
dxil_dia::SourceFilesTable::SourceFilesTable(
IMalloc *pMalloc, Session *pSession,
std::vector<CComPtr<IDiaSourceFile>> &&items)
: impl::TableBase<IDiaEnumSourceFiles, IDiaSourceFile>(
pMalloc, pSession, Table::Kind::SourceFiles),
m_items(std::move(items)) {
m_count = m_items.size();
}
HRESULT dxil_dia::SourceFilesTable::GetItem(DWORD index,
IDiaSourceFile **ppItem) {
if (!m_items[index]) {
m_items[index] = CreateOnMalloc<SourceFile>(m_pMalloc, m_pSession, index);
if (m_items[index] == nullptr)
return E_OUTOFMEMORY;
}
m_items[index].p->AddRef();
*ppItem = m_items[index];
(*ppItem)->AddRef();
return S_OK;
}