/////////////////////////////////////////////////////////////////////////////// // // // 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(m_pSession->Contents()->getOperand(m_index)); } llvm::StringRef dxil_dia::InjectedSource::Name() { return llvm::dyn_cast(NameContent()->getOperand(0))->getString(); } llvm::StringRef dxil_dia::InjectedSource::Content() { return llvm::dyn_cast(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(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(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(m_pSession->Contents()->getOperand(i)->getOperand(0)) ->getString(); if (fn.equals(filename)) { m_indexList.emplace_back(i); } } m_count = m_indexList.size(); }