diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-emit-spirv-ops-debug-info-ext.h | 7 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 28 | ||||
| -rw-r--r-- | source/slang/slang-ir-util.cpp | 2 |
3 files changed, 32 insertions, 5 deletions
diff --git a/source/slang/slang-emit-spirv-ops-debug-info-ext.h b/source/slang/slang-emit-spirv-ops-debug-info-ext.h index a48a9eb04..0969b65a4 100644 --- a/source/slang/slang-emit-spirv-ops-debug-info-ext.h +++ b/source/slang/slang-emit-spirv-ops-debug-info-ext.h @@ -106,6 +106,13 @@ SpvInst* emitOpDebugTypeMatrix(SpvInstParent* parent, IRInst* inst, const T& idR } template<typename T> +SpvInst* emitOpDebugTypePointer(SpvInstParent* parent, IRInst* inst, const T& idResultType, SpvInst* set, SpvInst* baseType, IRInst* storageClass, IRInst* flags) +{ + static_assert(isSingular<T>); + return emitInst(parent, inst, SpvOpExtInst, idResultType, kResultID, set, SpvWord(3), baseType, storageClass, flags); +} + +template<typename T> SpvInst* emitOpDebugScope(SpvInstParent* parent, IRInst* inst, const T& idResultType, SpvInst* set, SpvInst* scope) { static_assert(isSingular<T>); diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 8acc1505b..9ad8513fc 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -5700,16 +5700,36 @@ struct SPIRVEmitContext builder.getIntValue(builder.getUIntType(), spvEncoding), builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); } - else if (as<IRPtrTypeBase>(type)) + else if (auto ptrType = as<IRPtrTypeBase>(type)) { - StringBuilder sbName; - getTypeNameHint(sbName, basicType); + IRType* baseType = ptrType->getValueType(); + if (as<IRBasicType>(baseType)) + { + // If the base type of the pointer is basic types, + // emit the basic types and emit DebugTypePointer with it. + SpvInst* debugBaseType = emitDebugType(baseType); + SpvStorageClass storageClass = SpvStorageClassFunction; + if (ptrType->hasAddressSpace()) + storageClass = (SpvStorageClass)ptrType->getAddressSpace(); + + return emitOpDebugTypePointer( + getSection(SpvLogicalSectionID::ConstantsAndTypes), + nullptr, + m_voidType, + getNonSemanticDebugInfoExtInst(), + debugBaseType, + builder.getIntValue(builder.getUIntType(), storageClass), + builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); + } + + // If the base type of the pointer is more complex, + // emit the pointer as "uintptr" of DebugTypeBasic. return emitOpDebugTypeBasic( getSection(SpvLogicalSectionID::ConstantsAndTypes), nullptr, m_voidType, getNonSemanticDebugInfoExtInst(), - builder.getStringValue(sbName.getUnownedSlice()), + builder.getStringValue(String("uint64").getUnownedSlice()), builder.getIntValue(builder.getUIntType(), 64), builder.getIntValue(builder.getUIntType(), 0), builder.getIntValue(builder.getUIntType(), kUnknownPhysicalLayout)); diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 967db3aff..40d169c48 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -227,10 +227,10 @@ bool isSimpleDataType(IRType* type) case kIROp_MatrixType: case kIROp_InterfaceType: case kIROp_AnyValueType: + case kIROp_PtrType: return true; case kIROp_ArrayType: case kIROp_UnsizedArrayType: - case kIROp_PtrType: return isSimpleDataType((IRType*)type->getOperand(0)); default: return false; |
