浏览代码

Save signature debug info to alloca. (#1087)

Xiang Li 7 年之前
父节点
当前提交
cda6c52875

+ 21 - 3
lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

@@ -5994,14 +5994,32 @@ void SROA_Parameter_HLSL::createFlattenedFunction(Function *F) {
                              castParamMap[flatArg].second, Builder);
       }
 
-      flatArg->replaceAllUsesWith(Arg);
       // Update arg debug info.
       DbgDeclareInst *DDI = llvm::FindAllocaDbgDeclare(flatArg);
       if (DDI) {
-        Value *VMD = MetadataAsValue::get(Context, ValueAsMetadata::get(Arg));
-        DDI->setArgOperand(0, VMD);
+        if (!flatArg->getType()->isPointerTy()) {
+          // Create alloca to hold the debug info.
+          Value *allocaArg = nullptr;
+          if (flatArg->hasOneUse() && isa<StoreInst>(*flatArg->user_begin())) {
+            StoreInst *SI = cast<StoreInst>(*flatArg->user_begin());
+            allocaArg = SI->getPointerOperand();
+          } else {
+            allocaArg = Builder.CreateAlloca(flatArg->getType());
+            StoreInst *initArg = Builder.CreateStore(flatArg, allocaArg);
+            Value *ldArg = Builder.CreateLoad(allocaArg);
+            flatArg->replaceAllUsesWith(ldArg);
+            initArg->setOperand(0, flatArg);
+          }
+          Value *VMD = MetadataAsValue::get(Context, ValueAsMetadata::get(allocaArg));
+          DDI->setArgOperand(0, VMD);
+        } else {
+          Value *VMD = MetadataAsValue::get(Context, ValueAsMetadata::get(Arg));
+          DDI->setArgOperand(0, VMD);
+        }
       }
 
+      flatArg->replaceAllUsesWith(Arg);
+
       HLModule::MergeGepUse(Arg);
       // Flatten store of array parameter.
       if (Arg->getType()->isPointerTy()) {

+ 10 - 0
tools/clang/test/CodeGenHLSL/quick-test/signature_dbg_info.hlsl

@@ -0,0 +1,10 @@
+// RUN: %dxc -E main -T ps_6_0 -Od -Zi  %s | FileCheck %s
+
+// Make sure debug info for inp exist.
+// CHECK: !DILocalVariable(tag: DW_TAG_arg_variable, name: "inp"
+
+
+float4 main(float4 inp : COLOR) : SV_TARGET0 {
+    float4 a = inp;
+    return a;
+}