Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 53 additions & 5 deletions lib/DxilDia/DxilDiaSymbolManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,7 @@ class SymbolManagerInit {
void Embed(const TypeInfo &TI);

void AddBasicType(llvm::DIBasicType *BT);
void AppendSize(uint64_t baseSize);

private:
DWORD m_dwTypeID;
Expand Down Expand Up @@ -1151,6 +1152,12 @@ void dxil_dia::hlsl_symbols::SymbolManagerInit::TypeInfo::Embed(const TypeInfo &
m_dwCurrentSizeInBytes += TI.m_dwCurrentSizeInBytes;
}

void dxil_dia::hlsl_symbols::SymbolManagerInit::TypeInfo::AppendSize(
uint64_t baseSize) {
static constexpr DWORD kNumBitsPerByte = 8;
m_dwCurrentSizeInBytes += baseSize / kNumBitsPerByte;
}

void dxil_dia::hlsl_symbols::SymbolManagerInit::TypeInfo::AddBasicType(llvm::DIBasicType *BT) {
m_Layout.emplace_back(BT);

Expand Down Expand Up @@ -1439,6 +1446,33 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateBasicType(DWORD dwParen
return S_OK;
}

static uint64_t getBaseClassSize(llvm::DIType * Ty)
{
uint64_t sizeInBits = Ty->getSizeInBits();
auto *DerivedTy = llvm::dyn_cast<llvm::DIDerivedType>(Ty);
if (DerivedTy != nullptr) {
// Working around a bug where byte size is stored instead of bit size
if (sizeInBits == 4 && Ty->getSizeInBits() == 32) {
sizeInBits = 32;
}
if (sizeInBits == 0) {
const llvm::DITypeIdentifierMap EmptyMap;
switch (DerivedTy->getTag()) {
case llvm::dwarf::DW_TAG_restrict_type:
case llvm::dwarf::DW_TAG_reference_type:
case llvm::dwarf::DW_TAG_const_type:
case llvm::dwarf::DW_TAG_typedef: {
llvm::DIType *baseType = DerivedTy->getBaseType().resolve(EmptyMap);
if (baseType != nullptr) {
return getBaseClassSize(baseType);
}
}
}
}
}
return sizeInBits;
}

HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateCompositeType(DWORD dwParentID, llvm::DICompositeType *CT, DWORD *pNewTypeID) {
switch (CT->getTag()) {
case llvm::dwarf::DW_TAG_array_type: {
Expand Down Expand Up @@ -1529,13 +1563,27 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateCompositeType(DWORD dwP
TypeInfo *udtTI;
IFR(GetTypeInfo(CT, &udtTI));
auto udtScope = BeginUDTScope(udtTI);
for (llvm::DINode *N : CT->getElements()) {
if (auto *Field = llvm::dyn_cast<llvm::DIType>(N)) {
DWORD dwUnusedFieldID;
IFR(CreateType(Field, &dwUnusedFieldID));
if (CT->getElements().size() == 0) {
// "Resources" (textures, samplers, etc.) are composite types without any elements,
// but they do have a size.
udtTI->AppendSize(CT->getSizeInBits());
} else {
for (llvm::DINode *N : CT->getElements()) {
if (auto *Field = llvm::dyn_cast<llvm::DIType>(N)) {
DWORD dwUnusedFieldID;
IFR(CreateType(Field, &dwUnusedFieldID));
if (Field->getTag() == llvm::dwarf::DW_TAG_inheritance) {
// The base class is a type of its own, so will have contributed to
// its own TypeInfo. But we still need to remember the size that it
// contributed to this type:
auto *DerivedType = llvm::cast<llvm::DIDerivedType>(Field);
const llvm::DITypeIdentifierMap EmptyMap;
llvm::DIType *BaseType = DerivedType->getBaseType().resolve(EmptyMap);
udtTI->AppendSize(getBaseClassSize(BaseType));
}
}
}
}

return S_OK;
}

Expand Down
3 changes: 2 additions & 1 deletion lib/DxilPIXPasses/DxilDbgValueToDbgDeclare.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,8 @@ static OffsetInBits SplitValue(
else
{
assert(VTy->isFloatTy() || VTy->isDoubleTy() || VTy->isHalfTy() ||
VTy->isIntegerTy(32) || VTy->isIntegerTy(64) || VTy->isIntegerTy(16));
VTy->isIntegerTy(32) || VTy->isIntegerTy(64) || VTy->isIntegerTy(16) ||
VTy->isPointerTy());
Values->emplace_back(ValueAndOffset{V, CurrentOffset});
CurrentOffset += VTy->getScalarSizeInBits();
}
Expand Down
Loading