Fix validation error when element size for array of struct is not aligned (#2295)

* Fix validation error when element size for array of struct is not 16 aligned.

* Remove outdated comment.
This commit is contained in:
Xiang Li 2019-06-25 11:09:12 -07:00 коммит произвёл GitHub
Родитель 90710a9beb
Коммит cd0e61e77b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 44 добавлений и 6 удалений

Просмотреть файл

@ -3724,19 +3724,20 @@ CollectCBufferRanges(DxilStructAnnotation *annotation,
arrayCount *= EltTy->getArrayNumElements();
EltTy = EltTy->getArrayElementType();
}
unsigned arrayBase = base + offset;
// Base for array must be aligned.
unsigned alignedBase = ((base + 15) & ~(0xf));
unsigned arrayBase = alignedBase + offset;
DxilStructAnnotation *EltAnnotation = nullptr;
if (StructType *EltST = dyn_cast<StructType>(EltTy))
EltAnnotation = typeSys.GetStructAnnotation(EltST);
for (unsigned idx = 0; idx < arrayCount; idx++) {
// 16 bytes align except last component.
if (idx < (arrayCount - 1)) {
arrayBase = (arrayBase + 15) & ~(0xf);
}
arrayBase = (arrayBase + 15) & ~(0xf);
if (arrayBase > (base + cbSize)) {
if (arrayBase > (alignedBase + cbSize)) {
bOutOfBound = true;
break;
}

Просмотреть файл

@ -0,0 +1,37 @@
// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
// CHECK: cbuffer $Globals
// CHECK:{
// CHECK: struct $Globals
// CHECK:{
// CHECK: struct struct.A
// CHECK:{
// CHECK: float4 x[2]; ; Offset: 0
// CHECK: uint y[1]; ; Offset: 32
// CHECK: } a[2];; ; Offset: 0
// CHECK: } $Globals; ; Offset: 0 Size: 84
// CHECK: cbuffer cb
// CHECK: {
// CHECK: struct cb
// CHECK: {
// CHECK: float b; ; Offset: 0
// CHECK: float c[1]; ; Offset: 16
// CHECK: } cb; ; Offset: 0 Size: 20
struct A {
float4 x[2];
uint y[1];
};
A a[2];
cbuffer cb {
float b;
float c[1];
}
float main() : SV_Target {
return a[0].y[0] + c[0];
}