| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- ///////////////////////////////////////////////////////////////////////////////
- // //
- // 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();
- }
|