浏览代码

Bitpiece crash when value/addr are null (#3227)

Adam Yang 4 年之前
父节点
当前提交
c3e64e31a6
共有 1 个文件被更改,包括 12 次插入2 次删除
  1. 12 2
      lib/HLSL/DxilPreparePasses.cpp

+ 12 - 2
lib/HLSL/DxilPreparePasses.cpp

@@ -501,10 +501,15 @@ private:
       for (auto it = f->user_begin(), end = f->user_end(); it != end;) {
       for (auto it = f->user_begin(), end = f->user_end(); it != end;) {
         User *u = *(it++);
         User *u = *(it++);
         DbgValueInst *di = cast<DbgValueInst>(u);
         DbgValueInst *di = cast<DbgValueInst>(u);
+        Value *value = di->getValue();
+        if (!value) {
+          di->eraseFromParent();
+          continue;
+        }
         DIExpression *expr = di->getExpression();
         DIExpression *expr = di->getExpression();
         DILocalVariable *var = di->getVariable();
         DILocalVariable *var = di->getVariable();
         if (BitPieceCoversEntireVar(expr, var, TypeIdentifierMap)) {
         if (BitPieceCoversEntireVar(expr, var, TypeIdentifierMap)) {
-          dib.insertDbgValueIntrinsic(di->getValue(), 0, var, DIExpression::get(di->getContext(), {}), di->getDebugLoc(), di);
+          dib.insertDbgValueIntrinsic(value, 0, var, DIExpression::get(di->getContext(), {}), di->getDebugLoc(), di);
           di->eraseFromParent();
           di->eraseFromParent();
         }
         }
       }
       }
@@ -513,10 +518,15 @@ private:
       for (auto it = f->user_begin(), end = f->user_end(); it != end;) {
       for (auto it = f->user_begin(), end = f->user_end(); it != end;) {
         User *u = *(it++);
         User *u = *(it++);
         DbgDeclareInst *di = cast<DbgDeclareInst>(u);
         DbgDeclareInst *di = cast<DbgDeclareInst>(u);
+        Value *addr = di->getAddress();
+        if (!addr) {
+          di->eraseFromParent();
+          continue;
+        }
         DIExpression *expr = di->getExpression();
         DIExpression *expr = di->getExpression();
         DILocalVariable *var = di->getVariable();
         DILocalVariable *var = di->getVariable();
         if (BitPieceCoversEntireVar(expr, var, TypeIdentifierMap)) {
         if (BitPieceCoversEntireVar(expr, var, TypeIdentifierMap)) {
-          dib.insertDeclare(di->getAddress(), var, DIExpression::get(di->getContext(), {}), di->getDebugLoc(), di);
+          dib.insertDeclare(addr, var, DIExpression::get(di->getContext(), {}), di->getDebugLoc(), di);
           di->eraseFromParent();
           di->eraseFromParent();
         }
         }
       }
       }