@@ -442,6 +442,32 @@ class SPIRVToLLVMDbgTran {
442442 return addMDNode (inst, Builder.createExpression (Exprs));
443443 }
444444
445+ DINode::DIFlags static decodeFlag (SPIRVWord spirvFlags)
446+ {
447+ DINode::DIFlags flags = DINode::FlagZero;
448+
449+ if (spirvFlags & SPIRVDebug::FlagIsArtificial)
450+ flags |= llvm::DINode::FlagArtificial;
451+ if (spirvFlags & SPIRVDebug::FlagIsExplicit)
452+ flags |= llvm::DINode::FlagExplicit;
453+ if (spirvFlags & SPIRVDebug::FlagIsPrototyped)
454+ flags |= llvm::DINode::FlagPrototyped;
455+ if (spirvFlags & SPIRVDebug::FlagIsLValueReference)
456+ flags |= llvm::DINode::FlagLValueReference;
457+ if (spirvFlags & SPIRVDebug::FlagIsRValueReference)
458+ flags |= llvm::DINode::FlagRValueReference;
459+ if ((spirvFlags & SPIRVDebug::FlagAccess) == SPIRVDebug::FlagIsPublic)
460+ flags |= llvm::DINode::FlagPublic;
461+ if (spirvFlags & SPIRVDebug::FlagIsProtected)
462+ flags |= llvm::DINode::FlagProtected;
463+ if (spirvFlags & SPIRVDebug::FlagIsPrivate)
464+ flags |= llvm::DINode::FlagPrivate;
465+ if (spirvFlags & SPIRVDebug::FlagIsObjectPointer)
466+ flags |= llvm::DINode::FlagObjectPointer;
467+
468+ return flags;
469+ }
470+
445471 DIType* createTypeBasic (SPIRVExtInst* inst)
446472 {
447473 if (auto n = getExistingNode<DIType*>(inst))
@@ -498,6 +524,8 @@ class SPIRVToLLVMDbgTran {
498524 return addMDNode (inst, Builder.createReferenceType (dwarf::DW_TAG_reference_type, pointeeType, M->getDataLayout ().getPointerSizeInBits ()));
499525 else if (flags == SPIRVDebug::Flag::FlagIsRValueReference)
500526 return addMDNode (inst, Builder.createReferenceType (dwarf::DW_TAG_rvalue_reference_type, pointeeType, M->getDataLayout ().getPointerSizeInBits ()));
527+ else if (flags & SPIRVDebug::Flag::FlagIsObjectPointer)
528+ return addMDNode (inst, Builder.createObjectPointerType (pointeeType));
501529 else
502530 return addMDNode (inst, Builder.createPointerType (pointeeType, M->getDataLayout ().getPointerSizeInBits ()));
503531 }
@@ -643,13 +671,7 @@ class SPIRVToLLVMDbgTran {
643671 auto spirvFlags = compositeType.getFlags ();
644672 auto scope = createScope (BM->get <SPIRVExtInst>(compositeType.getParent ()));
645673
646- DINode::DIFlags flags = DINode::FlagZero;
647- if (spirvFlags & SPIRVDebug::FlagIsFwdDecl)
648- flags |= DINode::FlagFwdDecl;
649- if (spirvFlags & SPIRVDebug::FlagTypePassByValue)
650- flags |= DINode::FlagTypePassByValue;
651- if (spirvFlags & SPIRVDebug::FlagTypePassByReference)
652- flags |= DINode::FlagTypePassByReference;
674+ DINode::DIFlags flags = decodeFlag (spirvFlags);
653675
654676 if (!scope)
655677 scope = cu;
@@ -911,12 +933,20 @@ class SPIRVToLLVMDbgTran {
911933 auto line = funcDcl.getLine ();
912934 auto type = createSubroutineType (BM->get <SPIRVExtInst>(funcDcl.getType ()));
913935
936+ auto spirvFlags = funcDcl.getFlags ();
937+
938+ DINode::DIFlags flags = decodeFlag (spirvFlags);
939+
940+ bool isDefinition = spirvFlags & SPIRVDebug::FlagIsDefinition;
941+ bool isOptimized = spirvFlags & SPIRVDebug::FlagIsOptimized;
942+ bool isLocal = spirvFlags & SPIRVDebug::FlagIsLocal;
943+
914944 if (isa<DICompositeType>(scope) || isa<DINamespace>(scope))
915945 return addMDNode (inst, Builder.createMethod (scope, name, linkageName, file, line, type,
916- true , true ));
946+ isLocal, isDefinition, 0 , 0 , 0 , nullptr , flags, isOptimized ));
917947 else
918948 return addMDNode (inst, Builder.createTempFunctionFwdDecl (scope, name, linkageName, file, (unsigned int )line, type,
919- true , true , (unsigned int )line));
949+ isLocal, isDefinition , (unsigned int )line, flags, isOptimized ));
920950 }
921951
922952 bool isTemplateType (SPIRVExtInst* inst)
@@ -975,23 +1005,7 @@ class SPIRVToLLVMDbgTran {
9751005 auto spType = createSubroutineType (BM->get <SPIRVExtInst>(sp.getType ()));
9761006 auto spirvFlags = sp.getFlags ();
9771007
978- DINode::DIFlags flags = DINode::FlagZero;
979- if (spirvFlags & SPIRVDebug::FlagIsArtificial)
980- flags |= llvm::DINode::FlagArtificial;
981- if (spirvFlags & SPIRVDebug::FlagIsExplicit)
982- flags |= llvm::DINode::FlagExplicit;
983- if (spirvFlags & SPIRVDebug::FlagIsPrototyped)
984- flags |= llvm::DINode::FlagPrototyped;
985- if (spirvFlags & SPIRVDebug::FlagIsLValueReference)
986- flags |= llvm::DINode::FlagLValueReference;
987- if (spirvFlags & SPIRVDebug::FlagIsRValueReference)
988- flags |= llvm::DINode::FlagRValueReference;
989- if ((spirvFlags & SPIRVDebug::FlagAccess) == SPIRVDebug::FlagIsPublic)
990- flags |= llvm::DINode::FlagPublic;
991- if (spirvFlags & SPIRVDebug::FlagIsProtected)
992- flags |= llvm::DINode::FlagProtected;
993- if (spirvFlags & SPIRVDebug::FlagIsPrivate)
994- flags |= llvm::DINode::FlagPrivate;
1008+ DINode::DIFlags flags = decodeFlag (spirvFlags);
9951009
9961010 bool isDefinition = spirvFlags & SPIRVDebug::FlagIsDefinition;
9971011 bool isOptimized = spirvFlags & SPIRVDebug::FlagIsOptimized;
@@ -1155,15 +1169,18 @@ class SPIRVToLLVMDbgTran {
11551169 auto & name = BM->get <SPIRVString>(var.getName ())->getStr ();
11561170 auto file = getDIFile (BM->get <SPIRVExtInst>(var.getSource ()));
11571171 auto type = createType (BM->get <SPIRVExtInst>(var.getType ()));
1172+ auto spirvFlags = var.getFlags ();
11581173 auto line = var.getLine ();
11591174
1175+ auto flags = decodeFlag (spirvFlags);
1176+
11601177 if (var.isParamVar ())
11611178 {
1162- return addMDNode (inst, Builder.createParameterVariable (scope, name, var.getArgNo (), file, line, type));
1179+ return addMDNode (inst, Builder.createParameterVariable (scope, name, var.getArgNo (), file, line, type, false , flags ));
11631180 }
11641181 else
11651182 {
1166- return addMDNode (inst, Builder.createAutoVariable (scope, name, file, line, type));
1183+ return addMDNode (inst, Builder.createAutoVariable (scope, name, file, line, type, false , flags ));
11671184 }
11681185 }
11691186
0 commit comments