@@ -241,7 +241,47 @@ class SPIRVToLLVMDbgTran {
241241 if (auto n = getExistingNode<DIExpression*>(inst))
242242 return n;
243243
244- return addMDNode (inst, Builder.createExpression ());
244+ OpDebugExpression dbgExpr (inst);
245+
246+ auto numOperations = dbgExpr.getNumOperations ();
247+
248+ llvm::SmallVector<uint64_t , 5 > Exprs;
249+ for (unsigned int i = 0 ; i != numOperations; ++i)
250+ {
251+ OpDebugOperation operation (BM->get <SPIRVExtInst>(dbgExpr.getOperation (i)));
252+ switch (operation.getOperation ())
253+ {
254+ case SPIRVDebug::ExpressionOpCode::Deref:
255+ Exprs.push_back (llvm::dwarf::DW_OP_deref); break ;
256+ case SPIRVDebug::ExpressionOpCode::Plus:
257+ Exprs.push_back (llvm::dwarf::DW_OP_plus); break ;
258+ case SPIRVDebug::ExpressionOpCode::Minus:
259+ Exprs.push_back (llvm::dwarf::DW_OP_minus); break ;
260+ case SPIRVDebug::ExpressionOpCode::PlusUconst:
261+ Exprs.push_back (llvm::dwarf::DW_OP_plus_uconst); break ;
262+ case SPIRVDebug::ExpressionOpCode::BitPiece:
263+ Exprs.push_back (llvm::dwarf::DW_OP_bit_piece); break ;
264+ case SPIRVDebug::ExpressionOpCode::Swap:
265+ Exprs.push_back (llvm::dwarf::DW_OP_swap); break ;
266+ case SPIRVDebug::ExpressionOpCode::Xderef:
267+ Exprs.push_back (llvm::dwarf::DW_OP_xderef); break ;
268+ case SPIRVDebug::ExpressionOpCode::StackValue:
269+ Exprs.push_back (llvm::dwarf::DW_OP_stack_value); break ;
270+ case SPIRVDebug::ExpressionOpCode::Constu:
271+ Exprs.push_back (llvm::dwarf::DW_OP_constu); break ;
272+ case SPIRVDebug::ExpressionOpCode::Fragment:
273+ Exprs.push_back (llvm::dwarf::DW_OP_LLVM_fragment); break ;
274+ default :
275+ break ;
276+ }
277+
278+ for (unsigned int j = 0 ; j != operation.getNumLiterals (); ++j)
279+ {
280+ Exprs.push_back (operation.getLiteral (j));
281+ }
282+ }
283+
284+ return addMDNode (inst, Builder.createExpression (Exprs));
245285 }
246286
247287 DIType* createTypeBasic (SPIRVExtInst* inst)
0 commit comments