@@ -196,6 +196,10 @@ struct SPIRVEmitNonSemanticDI : public MachineFunctionPass {
196196 SPIRVCodeGenContext &Ctx,
197197 const DenseMap<StringRef, Register> &MacroDefRegs);
198198
199+ void emitDebugTypeEnum (
200+ const SmallPtrSetImpl<const DICompositeType *> &EnumTypes,
201+ SPIRVCodeGenContext &Ctx);
202+
199203 void emitDebugQualifiedTypes (
200204 const SmallPtrSetImpl<DIDerivedType *> &QualifiedDerivedTypes,
201205 SPIRVCodeGenContext &Ctx);
@@ -465,30 +469,20 @@ bool SPIRVEmitNonSemanticDI::emitGlobalDI(MachineFunction &MF) {
465469 emitDebugMacroDefs (MF, Ctx);
466470 emitDebugBuildIdentifier (BuildIdentifier, Ctx);
467471 emitDebugStoragePath (BuildStoragePath, Ctx);
468-
469- // *** MODIFIED ORDER *** Emit basic types first
470472 emitDebugBasicTypes (Collector.BasicTypes , Ctx);
471473
472- // Now emit types that might depend on basic types or each other
473474 emitSubroutineTypes (Collector.SubRoutineTypes , Ctx);
474- emitSubprograms (Collector.SubPrograms ,
475- Ctx); // Subprograms use SubroutineTypes
475+ emitSubprograms (Collector.SubPrograms , Ctx);
476476 emitLexicalScopes (Collector.LexicalScopes , Ctx);
477- emitDebugPointerTypes (Collector.PointerDerivedTypes ,
478- Ctx); // Pointers use BaseTypes (Basic/Composite)
479- emitDebugArrayTypes (Collector.ArrayTypes , Ctx); // Arrays use BaseTypes
480- emitAllDebugTypeComposites (
481- Collector.CompositeTypes ,
482- Ctx); // Composites define types used by Pointers/Members
477+ emitDebugPointerTypes (Collector.PointerDerivedTypes , Ctx);
478+ emitDebugArrayTypes (Collector.ArrayTypes , Ctx);
479+ emitAllDebugTypeComposites (Collector.CompositeTypes , Ctx);
480+ emitDebugTypeEnum (Collector.EnumTypes , Ctx);
483481 emitAllTemplateDebugInstructions (Collector.CompositeTypesWithTemplates ,
484- Ctx); // Templates use Composites & Params
485- emitDebugQualifiedTypes (Collector.QualifiedDerivedTypes ,
486- Ctx); // Qualifiers use BaseTypes
487- emitDebugTypedefs (Collector.TypedefTypes , Ctx); // Typedefs use BaseTypes
488- emitDebugTypePtrToMember (Collector.PtrToMemberTypes ,
489- Ctx); // PtrToMember uses BaseTypes
490-
491- // Emit entities that use types
482+ Ctx);
483+ emitDebugQualifiedTypes (Collector.QualifiedDerivedTypes , Ctx);
484+ emitDebugTypedefs (Collector.TypedefTypes , Ctx);
485+ emitDebugTypePtrToMember (Collector.PtrToMemberTypes , Ctx);
492486 emitAllDebugGlobalVariables (MF, Ctx);
493487 emitDebugImportedEntities (Collector.ImportedEntities , Ctx);
494488 }
@@ -535,7 +529,6 @@ Register SPIRVEmitNonSemanticDI::EmitDIInstruction(
535529 SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100))
536530 .addImm (Inst);
537531 for (auto Reg : Operands) {
538- llvm::errs () << " Adding operand register: " << Reg << " \n " ;
539532 MIB.addUse (Reg);
540533 }
541534 MIB.constrainAllUses (*Ctx.TII , *Ctx.TRI , *Ctx.RBI );
@@ -613,6 +606,72 @@ uint32_t SPIRVEmitNonSemanticDI::mapDebugFlags(DINode::DIFlags DFlags) {
613606 return Flags;
614607}
615608
609+ void SPIRVEmitNonSemanticDI::emitDebugTypeEnum (
610+ const SmallPtrSetImpl<const DICompositeType *> &EnumTypes,
611+ SPIRVCodeGenContext &Ctx) {
612+ for (auto *EnumTy : EnumTypes) {
613+ if (!EnumTy || EnumTy->getTag () != dwarf::DW_TAG_enumeration_type)
614+ continue ;
615+ if (Register Existing = Ctx.GR ->getDebugValue (EnumTy); Existing.isValid ())
616+ continue ;
617+ Register NameStr = EmitOpString (EnumTy->getName (), Ctx);
618+ bool UnderlyingTypeIsFwd = false ;
619+ Register UnderlyingTypeReg = findBaseTypeRegisterRecursive (
620+ EnumTy->getBaseType (), Ctx, UnderlyingTypeIsFwd);
621+ if (!UnderlyingTypeReg.isValid ()) {
622+ UnderlyingTypeReg = EmitDIInstruction (
623+ SPIRV::NonSemanticExtInst::DebugInfoNone, {}, Ctx, false );
624+ UnderlyingTypeIsFwd = false ;
625+ }
626+ Register SourceReg =
627+ findRegisterFromMap (EnumTy->getFile (), Ctx.SourceRegPairs );
628+ if (!SourceReg.isValid ()) {
629+ SourceReg = EmitDIInstruction (SPIRV::NonSemanticExtInst::DebugInfoNone,
630+ {}, Ctx, false );
631+ }
632+ Register Line = Ctx.GR ->buildConstantInt (EnumTy->getLine (), Ctx.MIRBuilder ,
633+ Ctx.I32Ty , false );
634+ Register Column =
635+ Ctx.GR ->buildConstantInt (1 , Ctx.MIRBuilder , Ctx.I32Ty , false );
636+
637+ Register ParentReg = Ctx.GR ->getDebugValue (EnumTy->getScope ());
638+ if (!ParentReg.isValid ()) {
639+ llvm::errs () << " Warning: Could not find Parent scope register for Enum: "
640+ << EnumTy->getName () << " \n " ;
641+ ParentReg = Ctx.GR ->getDebugValue (EnumTy->getFile ());
642+ if (!ParentReg.isValid ()) {
643+ ParentReg = EmitDIInstruction (SPIRV::NonSemanticExtInst::DebugInfoNone,
644+ {}, Ctx, false );
645+ }
646+ }
647+ Register Size = Ctx.GR ->buildConstantInt (EnumTy->getSizeInBits (),
648+ Ctx.MIRBuilder , Ctx.I32Ty , false );
649+ uint32_t Flags = transDebugFlags (EnumTy);
650+ Register FlagsReg =
651+ Ctx.GR ->buildConstantInt (Flags, Ctx.MIRBuilder , Ctx.I32Ty , false );
652+ SmallVector<Register, 16 > EnumOperands;
653+ for (Metadata *MD : EnumTy->getElements ()) {
654+ if (auto *E = dyn_cast<DIEnumerator>(MD)) {
655+ Register Val = Ctx.GR ->buildConstantInt (
656+ E->getValue ().getZExtValue (), Ctx.MIRBuilder , Ctx.I32Ty , false );
657+ Register Name = EmitOpString (E->getName (), Ctx);
658+ EnumOperands.push_back (Val);
659+ EnumOperands.push_back (Name);
660+ }
661+ }
662+ SmallVector<Register, 12 > Ops = {
663+ NameStr, UnderlyingTypeReg, SourceReg, Line,
664+ Column, ParentReg, Size, FlagsReg};
665+ Ops.append (EnumOperands);
666+ bool HasForwardRef = UnderlyingTypeIsFwd;
667+ Register DefReg = Ctx.GR ->getDebugValue (EnumTy);
668+ Register Res = EmitDIInstruction (SPIRV::NonSemanticExtInst::DebugTypeEnum,
669+ Ops, Ctx, HasForwardRef, DefReg);
670+ Ctx.GR ->addDebugValue (EnumTy, Res);
671+ Ctx.CompositeTypeRegPairs .emplace_back (EnumTy, Res);
672+ }
673+ }
674+
616675void SPIRVEmitNonSemanticDI::emitSingleCompilationUnit (
617676 StringRef FilePath, int64_t Language, SPIRVCodeGenContext &Ctx,
618677 Register DebugInfoVersionReg, Register DwarfVersionReg,
@@ -845,10 +904,7 @@ void SPIRVEmitNonSemanticDI::emitDebugPointerTypes(
845904 Ctx.I32Ty , false , false );
846905
847906 const DIType *BaseTy = PointerDerivedType->getBaseType ();
848- llvm::errs () << " Pointer Derived Type BaseTy: "
849- << (BaseTy ? BaseTy->getName () : " null" ) << " \n " ;
850-
851- bool HasForwardRef = false ;
907+ bool HasForwardRef = false ;
852908 Register BaseTypeReg =
853909 findBaseTypeRegisterRecursive (BaseTy, Ctx, HasForwardRef);
854910
@@ -1230,7 +1286,7 @@ void SPIRVEmitNonSemanticDI::emitDebugArrayTypes(
12301286 Register BaseTypeReg =
12311287 findBaseTypeRegisterRecursive (ElementType, Ctx, HasForwardRef);
12321288
1233- if (!BaseTypeReg.isValid ()) { // If still not valid after recursive lookup
1289+ if (!BaseTypeReg.isValid ()) {
12341290 llvm::errs ()
12351291 << " Warning: Could not find element type for Array/Vector.\n " ;
12361292 BaseTypeReg = EmitDIInstruction (SPIRV::NonSemanticExtInst::DebugInfoNone,
@@ -1433,9 +1489,6 @@ void SPIRVEmitNonSemanticDI::emitDebugTypeComposite(
14331489 Ctx.GR ->buildConstantInt (Flags, Ctx.MIRBuilder , Ctx.I32Ty , false , false );
14341490
14351491 Register DefReg = Ctx.GR ->getDebugValue (CompTy);
1436- llvm::errs () << " Emitting DebugTypeComposite for: " << CompTy->getName ()
1437- << " , Found Res: " << DefReg << " \n " ;
1438-
14391492 SmallVector<Register, 4 > MemberRegs;
14401493 bool HasForwardRef = false ;
14411494
@@ -1744,8 +1797,6 @@ Register SPIRVEmitNonSemanticDI::findBaseTypeRegisterRecursive(
17441797 IsForwardRef = Ctx.GR ->isForwardPlaceholder (Found);
17451798 return Found;
17461799 }
1747- llvm::errs () << " Creating placeholder for CompositeType: " << Ty->getName ()
1748- << " \n " ;
17491800 Register PlaceholderReg = Ctx.MRI .createVirtualRegister (&SPIRV::IDRegClass);
17501801 Ctx.MRI .setType (PlaceholderReg, LLT::scalar (32 ));
17511802 Ctx.GR ->markAsForwardPlaceholder (PlaceholderReg);
0 commit comments