102 строки
3.4 KiB
C++
102 строки
3.4 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// //
|
||
|
// DxilDiaTableInjectedSources.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 "DxilDiaTableInjectedSources.h"
|
||
|
|
||
|
#include "DxilDia.h"
|
||
|
#include "DxilDiaSession.h"
|
||
|
#include "DxilDiaTable.h"
|
||
|
|
||
|
llvm::MDTuple *dxil_dia::InjectedSource::NameContent() {
|
||
|
return llvm::cast<llvm::MDTuple>(m_pSession->Contents()->getOperand(m_index));
|
||
|
}
|
||
|
|
||
|
llvm::StringRef dxil_dia::InjectedSource::Name() {
|
||
|
return llvm::dyn_cast<llvm::MDString>(NameContent()->getOperand(0))->getString();
|
||
|
}
|
||
|
|
||
|
llvm::StringRef dxil_dia::InjectedSource::Content() {
|
||
|
return llvm::dyn_cast<llvm::MDString>(NameContent()->getOperand(1))->getString();
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP dxil_dia::InjectedSource::get_length(_Out_ ULONGLONG *pRetVal) {
|
||
|
*pRetVal = Content().size();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP dxil_dia::InjectedSource::get_filename(BSTR *pRetVal) {
|
||
|
DxcThreadMalloc TM(m_pMalloc);
|
||
|
return StringRefToBSTR(Name(), pRetVal);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP dxil_dia::InjectedSource::get_objectFilename(BSTR *pRetVal) {
|
||
|
*pRetVal = nullptr;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP dxil_dia::InjectedSource::get_virtualFilename(BSTR *pRetVal) {
|
||
|
return get_filename(pRetVal);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP dxil_dia::InjectedSource::get_source(
|
||
|
/* [in] */ DWORD cbData,
|
||
|
/* [out] */ DWORD *pcbData,
|
||
|
/* [size_is][out] */ BYTE *pbData) {
|
||
|
if (pbData == nullptr) {
|
||
|
if (pcbData != nullptr) {
|
||
|
*pcbData = Content().size();
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
cbData = std::min((DWORD)Content().size(), cbData);
|
||
|
memcpy(pbData, Content().begin(), cbData);
|
||
|
if (pcbData) {
|
||
|
*pcbData = cbData;
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
dxil_dia::InjectedSourcesTable::InjectedSourcesTable(
|
||
|
IMalloc *pMalloc,
|
||
|
Session *pSession)
|
||
|
: impl::TableBase<IDiaEnumInjectedSources,
|
||
|
IDiaInjectedSource>(pMalloc, pSession, Table::Kind::InjectedSource) {
|
||
|
// Count the number of source files available.
|
||
|
// m_count = m_pSession->InfoRef().compile_unit_count();
|
||
|
m_count =
|
||
|
(m_pSession->Contents() == nullptr) ? 0 : m_pSession->Contents()->getNumOperands();
|
||
|
}
|
||
|
|
||
|
HRESULT dxil_dia::InjectedSourcesTable::GetItem(DWORD index, IDiaInjectedSource **ppItem) {
|
||
|
if (index >= m_count)
|
||
|
return E_INVALIDARG;
|
||
|
unsigned itemIndex = index;
|
||
|
if (m_count == m_indexList.size())
|
||
|
itemIndex = m_indexList[index];
|
||
|
*ppItem = CreateOnMalloc<InjectedSource>(m_pMalloc, m_pSession, itemIndex);
|
||
|
if (*ppItem == nullptr)
|
||
|
return E_OUTOFMEMORY;
|
||
|
(*ppItem)->AddRef();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
void dxil_dia::InjectedSourcesTable::Init(llvm::StringRef filename) {
|
||
|
for (unsigned i = 0; i < m_pSession->Contents()->getNumOperands(); ++i) {
|
||
|
llvm::StringRef fn =
|
||
|
llvm::dyn_cast<llvm::MDString>(m_pSession->Contents()->getOperand(i)->getOperand(0))
|
||
|
->getString();
|
||
|
if (fn.equals(filename)) {
|
||
|
m_indexList.emplace_back(i);
|
||
|
}
|
||
|
}
|
||
|
m_count = m_indexList.size();
|
||
|
}
|