@@ -6342,24 +6342,93 @@ const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD)
6342
6342
case DW_TAG_class_type:
6343
6343
case DW_TAG_structure_type:
6344
6344
{
6345
- typeData.name = *compositeType->name ;
6346
- typeData.type = VarType::Struct;
6347
6345
typeData.sizeInBytes = (uint32_t )(compositeType->sizeInBits / 8 );
6348
6346
typeData.alignInBytes = (uint32_t )(compositeType->alignInBits / 8 );
6349
- const Metadata *elementsMD = compositeType->elements ;
6350
- size_t countMembers = elementsMD->children .size ();
6351
- for (size_t i = 0 ; i < countMembers; ++i)
6347
+
6348
+ bool isVector = compositeType->name ->beginsWith (" vector<" );
6349
+ bool isMatrix = !isVector && compositeType->name ->beginsWith (" matrix<" );
6350
+
6351
+ if ((compositeType->templateParams ) && (isVector || isMatrix))
6352
6352
{
6353
- const Metadata *memberMD = elementsMD->children [i];
6354
- const DXIL::DIBase *memberBase = memberMD->dwarf ;
6355
- RDCASSERTEQUAL (memberBase->type , DXIL::DIBase::DerivedType);
6356
- const DXIL::DIDerivedType *member = memberBase->As <DIDerivedType>();
6357
- RDCASSERTEQUAL (member->tag , DXIL::DW_TAG_member);
6358
- // const TypeData &memberType = AddDebugType(member->base);
6359
- AddDebugType (member->base );
6360
- typeData.structMembers .push_back ({*member->name , member->base });
6361
- uint32_t offset = (uint32_t )member->offsetInBits / 8 ;
6362
- typeData.memberOffsets .push_back (offset);
6353
+ const Metadata *params = compositeType->templateParams ;
6354
+ uint32_t countParams = (uint32_t )params->children .size ();
6355
+ if (isVector)
6356
+ RDCASSERTEQUAL (countParams, 2 );
6357
+ else if (isMatrix)
6358
+ RDCASSERTEQUAL (countParams, 3 );
6359
+ // Vector needs at least two parameters
6360
+ isVector &= (countParams >= 2 );
6361
+ // Matrix needs at least three parameters
6362
+ isMatrix &= (countParams >= 3 );
6363
+ }
6364
+
6365
+ if ((compositeType->templateParams ) && (isVector || isMatrix))
6366
+ {
6367
+ const Metadata *params = compositeType->templateParams ;
6368
+ {
6369
+ RDCASSERTEQUAL (params->children [1 ]->dwarf ->type , DXIL::DIBase::TemplateValueParameter);
6370
+ const DITemplateValueParameter *firstDim =
6371
+ params->children [1 ]->dwarf ->As <DITemplateValueParameter>();
6372
+
6373
+ // don't need the template value parameter name, it should be 'element_count' or
6374
+ // 'row_count', just need the value
6375
+ RDCASSERT (getival<uint32_t >(firstDim->value ->value , typeData.vecSize ));
6376
+ }
6377
+
6378
+ if (isMatrix)
6379
+ {
6380
+ RDCASSERTEQUAL (params->children [2 ]->dwarf ->type , DXIL::DIBase::TemplateValueParameter);
6381
+ const DITemplateValueParameter *secondDim =
6382
+ params->children [1 ]->dwarf ->As <DITemplateValueParameter>();
6383
+
6384
+ // don't need the template value parameter name, it should be 'col_count', just need the value
6385
+ RDCASSERT (getival<uint32_t >(secondDim->value ->value , typeData.matSize ));
6386
+
6387
+ // for now treat all matrices as column major. This way secondDim = matSize =
6388
+ // columns and we don't need to flip for matrices
6389
+ typeData.colMajorMat = true ;
6390
+ }
6391
+
6392
+ RDCASSERTEQUAL (params->children [0 ]->dwarf ->type , DXIL::DIBase::TemplateTypeParameter);
6393
+ const DITemplateTypeParameter *baseType =
6394
+ params->children [0 ]->dwarf ->As <DITemplateTypeParameter>();
6395
+
6396
+ typeData.baseType = baseType->type ;
6397
+
6398
+ // don't need the template type parameter name, it should be 'element', just need the base type
6399
+ const TypeData &baseTypeData = AddDebugType (typeData.baseType );
6400
+
6401
+ typeData.type = baseTypeData.type ;
6402
+
6403
+ if (isVector)
6404
+ typeData.name =
6405
+ StringFormat::Fmt (" %s%u" , ToStr (typeData.type ).c_str (), typeData.vecSize );
6406
+ else if (isMatrix)
6407
+ typeData.name = StringFormat::Fmt (" %s%ux%u" , ToStr (typeData.type ).c_str (),
6408
+ typeData.vecSize , typeData.matSize );
6409
+ }
6410
+ else
6411
+ {
6412
+ typeData.name = *compositeType->name ;
6413
+
6414
+ RDCASSERT (!isVector && !isMatrix, isVector, isMatrix, typeData.name );
6415
+
6416
+ typeData.type = VarType::Struct;
6417
+ const Metadata *elementsMD = compositeType->elements ;
6418
+ size_t countMembers = elementsMD->children .size ();
6419
+ for (size_t i = 0 ; i < countMembers; ++i)
6420
+ {
6421
+ const Metadata *memberMD = elementsMD->children [i];
6422
+ const DXIL::DIBase *memberBase = memberMD->dwarf ;
6423
+ RDCASSERTEQUAL (memberBase->type , DXIL::DIBase::DerivedType);
6424
+ const DXIL::DIDerivedType *member = memberBase->As <DIDerivedType>();
6425
+ RDCASSERTEQUAL (member->tag , DXIL::DW_TAG_member);
6426
+ // const TypeData &memberType = AddDebugType(member->base);
6427
+ AddDebugType (member->base );
6428
+ typeData.structMembers .push_back ({*member->name , member->base });
6429
+ uint32_t offset = (uint32_t )member->offsetInBits / 8 ;
6430
+ typeData.memberOffsets .push_back (offset);
6431
+ }
6363
6432
}
6364
6433
break ;
6365
6434
}
@@ -6753,12 +6822,12 @@ void Debugger::ParseDebugData()
6753
6822
6754
6823
if (typeWalk->colMajorMat )
6755
6824
{
6756
- rows = RDCMAX (1U , vec. vecSize );
6825
+ rows = RDCMAX (1U , typeWalk-> vecSize );
6757
6826
columns = RDCMAX (1U , typeWalk->matSize );
6758
6827
}
6759
6828
else
6760
6829
{
6761
- columns = RDCMAX (1U , vec. vecSize );
6830
+ columns = RDCMAX (1U , typeWalk-> vecSize );
6762
6831
rows = RDCMAX (1U , typeWalk->matSize );
6763
6832
}
6764
6833
}
@@ -6821,12 +6890,12 @@ void Debugger::ParseDebugData()
6821
6890
elementType = scalar.type ;
6822
6891
if (childType->colMajorMat )
6823
6892
{
6824
- childRows = RDCMAX (1U , vec. vecSize );
6893
+ childRows = RDCMAX (1U , childType-> vecSize );
6825
6894
childColumns = RDCMAX (1U , childType->matSize );
6826
6895
}
6827
6896
else
6828
6897
{
6829
- childColumns = RDCMAX (1U , vec. vecSize );
6898
+ childColumns = RDCMAX (1U , childType-> vecSize );
6830
6899
childRows = RDCMAX (1U , childType->matSize );
6831
6900
}
6832
6901
}
@@ -6945,12 +7014,12 @@ void Debugger::ParseDebugData()
6945
7014
elementType = scalar.type ;
6946
7015
if (memberType->colMajorMat )
6947
7016
{
6948
- memberRows = RDCMAX (1U , vec. vecSize );
7017
+ memberRows = RDCMAX (1U , memberType-> vecSize );
6949
7018
memberColumns = RDCMAX (1U , memberType->matSize );
6950
7019
}
6951
7020
else
6952
7021
{
6953
- memberColumns = RDCMAX (1U , vec. vecSize );
7022
+ memberColumns = RDCMAX (1U , memberType-> vecSize );
6954
7023
memberRows = RDCMAX (1U , memberType->matSize );
6955
7024
}
6956
7025
}
@@ -7000,20 +7069,17 @@ void Debugger::ParseDebugData()
7000
7069
7001
7070
if (typeWalk->colMajorMat )
7002
7071
{
7003
- rows = RDCMAX (1U , vec. vecSize );
7072
+ rows = RDCMAX (1U , typeWalk-> vecSize );
7004
7073
columns = RDCMAX (1U , typeWalk->matSize );
7005
7074
}
7006
7075
else
7007
7076
{
7008
- columns = RDCMAX (1U , vec. vecSize );
7077
+ columns = RDCMAX (1U , typeWalk-> vecSize );
7009
7078
rows = RDCMAX (1U , typeWalk->matSize );
7010
7079
}
7011
7080
usage->rows = rows;
7012
7081
usage->columns = columns;
7013
7082
7014
- RDCERR (" Matrix types not handled yet %s %u %u" , typeWalk->name .c_str (), byteOffset,
7015
- bytesRemaining);
7016
-
7017
7083
if (bytesRemaining == 0 )
7018
7084
{
7019
7085
// Remove mappings : this mapping covers everything
0 commit comments