Ver código fonte

Fixed crash in dbgvalue to dbgdeclare from empty struct members, inout args and inout array args (#2762)

Adam Yang 5 anos atrás
pai
commit
b7626e97ee

+ 15 - 9
lib/DxilPIXPasses/DxilDbgValueToDbgDeclare.cpp

@@ -421,9 +421,9 @@ llvm::AllocaInst *VariableRegisters::GetRegisterForAlignedOffset(
   return it->second;
 }
 
-// DITypePeelConstAndTypedef peels const and typedef types off of Ty,
+// DITypePeelTypeAlias peels const, typedef, and other alias types off of Ty,
 // returning the unalised type.
-static llvm::DIType *DITypePeelConstAndTypedef(
+static llvm::DIType *DITypePeelTypeAlias(
     llvm::DIType* Ty
 )
 {
@@ -432,9 +432,11 @@ static llvm::DIType *DITypePeelConstAndTypedef(
     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:
-      return DITypePeelConstAndTypedef(
+      return DITypePeelTypeAlias(
           DerivedTy->getBaseType().resolve(EmptyMap));
     }
   }
@@ -455,7 +457,7 @@ VariableRegisters::VariableRegisters(
 
   PopulateAllocaMap(Ty);
   assert(m_Offsets.GetCurrentPackedOffset() ==
-         DITypePeelConstAndTypedef(Ty)->getSizeInBits());
+         DITypePeelTypeAlias(Ty)->getSizeInBits());
 }
 
 void VariableRegisters::PopulateAllocaMap(
@@ -471,6 +473,8 @@ void VariableRegisters::PopulateAllocaMap(
       assert(!"Unhandled DIDerivedType");
       m_Offsets.AlignToAndAddUnhandledType(DerivedTy);
       return;
+    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:
       PopulateAllocaMap(
@@ -648,11 +652,13 @@ static bool SortMembers(
     case llvm::dwarf::DW_TAG_member: {
       if (auto *Member = llvm::dyn_cast<llvm::DIDerivedType>(Element))
       {
-        auto it = SortedMembers->emplace(std::make_pair(Member->getOffsetInBits(), Member));
-        (void)it;
-        assert(it.second &&
-               "Invalid DIStructType"
-               " - members with the same offset -- are unions possible?");
+        if (Member->getSizeInBits()) {
+          auto it = SortedMembers->emplace(std::make_pair(Member->getOffsetInBits(), Member));
+          (void)it;
+          assert(it.second &&
+                 "Invalid DIStructType"
+                 " - members with the same offset -- are unions possible?");
+        }
         break;
       }
       // FALLTHROUGH

+ 21 - 0
tools/clang/test/HLSLFileCheck/pix/DbgValueToDbgDeclare_aliases.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -Tps_6_0 /Od /Zi %s | %opt -S -dxil-dbg-value-to-dbg-declare
+
+void foo(inout float2 v) {
+  v.x *= 2;
+  v.y *= 2;
+}
+
+void foo(inout float v[2]) {
+  v[0] *= 2;
+  v[1] *= 2;
+}
+
+[RootSignature("")]
+float main() : SV_Target {
+  float v[2] = {0.0, 1.0};
+  float2 u = float2(1, 2);
+  foo(v);
+  foo(u);
+  return v[0] + v[1] + u.x + u.y;
+}
+

+ 18 - 0
tools/clang/test/HLSLFileCheck/pix/DbgValueToDbgDeclare_empty_struct.hlsl

@@ -0,0 +1,18 @@
+// RUN: %dxc -Tps_6_0 /Od /Zi %s | %opt -S -dxil-dbg-value-to-dbg-declare
+
+struct Empty {
+};
+struct S {
+  float bar;
+  Empty empty;
+  float foo;
+};
+
+[RootSignature("")]
+float main(float a : A) : SV_Target {
+  S s;
+  s.bar = a + 2;
+  s.foo = a * 2;
+  return s.foo / s.bar; 
+}
+