@@ -91,7 +91,8 @@ SPIRVExtInst *SPIRVToLLVMDbgTran::getDbgInst(const SPIRVId Id) {
9191 if (isa<OpExtInst>(E)) {
9292 SPIRVExtInst *EI = static_cast <SPIRVExtInst *>(E);
9393 if (EI ->getExtSetKind () == SPIRV ::SPIRVEIS_Debug ||
94- EI ->getExtSetKind () == SPIRV ::SPIRVEIS_OpenCL_DebugInfo_100)
94+ EI ->getExtSetKind () == SPIRV ::SPIRVEIS_OpenCL_DebugInfo_100 ||
95+ EI ->getExtSetKind () == SPIRV ::SPIRVEIS_NonSemantic_Kernel_DebugInfo_100)
9596 return EI ;
9697 }
9798 return nullptr ;
@@ -199,46 +200,37 @@ SPIRVToLLVMDbgTran::transTypeArray(const SPIRVExtInst *DebugInst) {
199200 transDebugInst<DIType>(BM ->get <SPIRVExtInst>(Ops[BaseTypeIdx]));
200201 size_t TotalCount = 1 ;
201202 SmallVector<llvm::Metadata *, 8 > Subscripts;
202- // Ops looks like: { BaseType, count1|upperBound1, count2|upperBound2, ...,
203- // countN|upperBoundN, lowerBound1, lowerBound2, ..., lowerBoundN }
204- for (size_t I = ComponentCountIdx, E = Ops.size () / 2 + 1 ; I < E; ++I) {
205- if (auto *LocalVar = getDbgInst<SPIRVDebug::LocalVariable>(Ops[I])) {
206- auto *UpperBound = transDebugInst<DILocalVariable>(LocalVar);
207- SPIRVConstant *C = BM ->get <SPIRVConstant>(Ops[Ops.size () / 2 + I]);
208- int64_t ConstantAsInt = static_cast <int64_t >(C->getZExtIntValue ());
209- auto *LowerBound = ConstantAsMetadata::get (
210- ConstantInt::get (M->getContext (), APInt (64 , ConstantAsInt)));
211- Subscripts.push_back (Builder.getOrCreateSubrange (nullptr , LowerBound,
212- UpperBound, nullptr ));
213- continue ;
203+ if (DebugInst->isExtInst (SPIRVEIS_NonSemantic_Kernel_DebugInfo_100,
204+ SPIRVDebug::TypeArray)) {
205+ for (size_t I = SubrangesIdx; I < Ops.size (); ++I) {
206+ auto *SR = transDebugInst<DISubrange>(BM ->get <SPIRVExtInst>(Ops[I]));
207+ if (auto *Count = SR ->getCount ().get <ConstantInt *>())
208+ TotalCount *= Count->getZExtValue () > 0 ? Count->getZExtValue () : 0 ;
209+ Subscripts.push_back (SR );
214210 }
215- if (auto *ExprUB = getDbgInst<SPIRVDebug::Expression>(Ops[I])) {
216- auto *UpperBound = transDebugInst<DIExpression>(ExprUB);
217- auto *ExprLB =
218- getDbgInst<SPIRVDebug::Expression>(Ops[Ops.size () / 2 + I]);
219- auto *LowerBound = transDebugInst<DIExpression>(ExprLB);
220- Subscripts.push_back (Builder.getOrCreateSubrange (nullptr , LowerBound,
221- UpperBound, nullptr ));
222- continue ;
223- }
224- if (!getDbgInst<SPIRVDebug::DebugInfoNone>(Ops[I])) {
225- SPIRVConstant *C = BM ->get <SPIRVConstant>(Ops[I]);
226- int64_t Count = static_cast <int64_t >(C->getZExtIntValue ());
227- // If the SPIR-V file was generated by an older version of the translator,
228- // Ops may not contain the LowerBound
229- if (Ops.size () / 2 + I < Ops.size ()) {
230- C = BM ->get <SPIRVConstant>(Ops[Ops.size () / 2 + I]);
231- int64_t LowerBound = static_cast <int64_t >(C->getZExtIntValue ());
232- Subscripts.push_back (Builder.getOrCreateSubrange (LowerBound, Count));
233- } else {
211+ } else {
212+ for (size_t I = ComponentCountIdx, E = Ops.size (); I < E; ++I) {
213+ // Otherwise Count could be a constant or DIVariable
214+ if (auto *LocalVarCount = getDbgInst<SPIRVDebug::LocalVariable>(Ops[I])) {
215+ auto *DILocalVarCount = transDebugInst<DILocalVariable>(LocalVarCount);
216+ Subscripts.push_back (Builder.getOrCreateSubrange (
217+ DILocalVarCount, nullptr , nullptr , nullptr ));
218+ } else if (auto *GlobalVarCount =
219+ getDbgInst<SPIRVDebug::GlobalVariable>(Ops[I])) {
220+ auto *DIGlobalVarCount =
221+ transDebugInst<DIGlobalVariable>(GlobalVarCount);
222+ Subscripts.push_back (Builder.getOrCreateSubrange (
223+ DIGlobalVarCount, nullptr , nullptr , nullptr ));
224+ } else if (!getDbgInst<SPIRVDebug::DebugInfoNone>(Ops[I])) {
225+ SPIRVConstant *C = BM ->get <SPIRVConstant>(Ops[I]);
226+ int64_t Count = static_cast <int64_t >(C->getZExtIntValue ());
227+ // Count = -1 means that the array is empty
228+ TotalCount *= Count > 0 ? Count : 0 ;
234229 auto *CountAsMD = ConstantAsMetadata::get (
235230 ConstantInt::get (M->getContext (), APInt (64 , Count)));
236231 Subscripts.push_back (
237232 Builder.getOrCreateSubrange (CountAsMD, nullptr , nullptr , nullptr ));
238233 }
239- // Count = -1 means that the array is empty
240- TotalCount *= Count > 0 ? static_cast <size_t >(Count) : 0 ;
241- continue ;
242234 }
243235 }
244236 DINodeArray SubscriptArray = Builder.getOrCreateArray (Subscripts);
@@ -286,6 +278,8 @@ SPIRVToLLVMDbgTran::transTypeComposite(const SPIRVExtInst *DebugInst) {
286278 SPIRVEntry *SizeEntry = BM ->getEntry (Ops[SizeIdx]);
287279 if (!(SizeEntry->isExtInst (SPIRVEIS_Debug, SPIRVDebug::DebugInfoNone) ||
288280 SizeEntry->isExtInst (SPIRVEIS_OpenCL_DebugInfo_100,
281+ SPIRVDebug::DebugInfoNone) ||
282+ SizeEntry->isExtInst (SPIRVEIS_NonSemantic_Kernel_DebugInfo_100,
289283 SPIRVDebug::DebugInfoNone))) {
290284 Size = BM ->get <SPIRVConstant>(Ops[SizeIdx])->getZExtIntValue ();
291285 }
@@ -341,6 +335,36 @@ SPIRVToLLVMDbgTran::transTypeComposite(const SPIRVExtInst *DebugInst) {
341335 return CT ;
342336}
343337
338+ DISubrange *
339+ SPIRVToLLVMDbgTran::transTypeSubrange (const SPIRVExtInst *DebugInst) {
340+ using namespace SPIRVDebug ::Operand::TypeSubrange;
341+ const SPIRVWordVec &Ops = DebugInst->getArguments ();
342+ assert (Ops.size () == OperandCount && " Invalid number of operands" );
343+ std::vector<Metadata *> TranslatedOps (OperandCount, nullptr );
344+ auto transOperand = [&Ops, &TranslatedOps, this ](int Idx) -> void {
345+ if (!getDbgInst<SPIRVDebug::DebugInfoNone>(Ops[Idx])) {
346+ if (auto *GlobalVar = getDbgInst<SPIRVDebug::GlobalVariable>(Ops[Idx])) {
347+ TranslatedOps[Idx] =
348+ cast<Metadata>(transDebugInst<DIGlobalVariable>(GlobalVar));
349+ } else if (auto *LocalVar =
350+ getDbgInst<SPIRVDebug::LocalVariable>(Ops[Idx])) {
351+ TranslatedOps[Idx] =
352+ cast<Metadata>(transDebugInst<DILocalVariable>(LocalVar));
353+ } else if (auto *Expr = getDbgInst<SPIRVDebug::Expression>(Ops[Idx])) {
354+ TranslatedOps[Idx] = cast<Metadata>(transDebugInst<DIExpression>(Expr));
355+ } else if (auto *Const = BM ->get <SPIRVConstant>(Ops[Idx])) {
356+ int64_t ConstantAsInt = static_cast <int64_t >(Const->getZExtIntValue ());
357+ TranslatedOps[Idx] = cast<Metadata>(ConstantAsMetadata::get (
358+ ConstantInt::get (M->getContext (), APInt (64 , ConstantAsInt))));
359+ }
360+ }
361+ };
362+ for (int Idx = CountIdx; Idx < OperandCount; ++Idx)
363+ transOperand (Idx);
364+ return Builder.getOrCreateSubrange (TranslatedOps[0 ], TranslatedOps[1 ],
365+ TranslatedOps[2 ], TranslatedOps[3 ]);
366+ }
367+
344368DINode *SPIRVToLLVMDbgTran::transTypeMember (const SPIRVExtInst *DebugInst) {
345369 using namespace SPIRVDebug ::Operand::TypeMember;
346370 const SPIRVWordVec &Ops = DebugInst->getArguments ();
@@ -887,6 +911,9 @@ MDNode *SPIRVToLLVMDbgTran::transDebugInstImpl(const SPIRVExtInst *DebugInst) {
887911 case SPIRVDebug::TypeArray:
888912 return transTypeArray (DebugInst);
889913
914+ case SPIRVDebug::TypeSubrange:
915+ return transTypeSubrange (DebugInst);
916+
890917 case SPIRVDebug::TypeVector:
891918 return transTypeVector (DebugInst);
892919
0 commit comments