@@ -8,6 +8,104 @@ public unsafe partial struct LLVMMetadataRef(IntPtr handle) : IEquatable<LLVMMet
88{
99 public IntPtr Handle = handle ;
1010
11+ public readonly uint AlignInBits => IsType ? LLVM . DITypeGetAlignInBits ( this ) : default ;
12+
13+ public readonly uint Column => Kind switch {
14+ LLVMMetadataKind . LLVMDILocationMetadataKind => LLVM . DILocationGetColumn ( this ) ,
15+ _ => default ,
16+ } ;
17+
18+ public readonly LLVMMetadataRef Expression => Kind switch {
19+ LLVMMetadataKind . LLVMDIGlobalVariableExpressionMetadataKind => LLVM . DIGlobalVariableExpressionGetExpression ( this ) ,
20+ _ => default ,
21+ } ;
22+
23+ public readonly LLVMMetadataRef File => Kind switch {
24+ LLVMMetadataKind . LLVMDIFileMetadataKind => this ,
25+ LLVMMetadataKind . LLVMDISubprogramMetadataKind => LLVM . DIScopeGetFile ( this ) ,
26+ _ when IsVariable => LLVM . DIVariableGetFile ( this ) ,
27+ _ => default ,
28+ } ;
29+
30+ public readonly LLVMDIFlags Flags => IsType ? LLVM . DITypeGetFlags ( this ) : default ;
31+
32+ public readonly LLVMMetadataRef InlinedAt => Kind switch {
33+ LLVMMetadataKind . LLVMDILocationMetadataKind => LLVM . DILocationGetInlinedAt ( this ) ,
34+ _ => default ,
35+ } ;
36+
37+ public readonly bool IsDINode => Kind is >= LLVMMetadataKind . LLVMDILocationMetadataKind and <= LLVMMetadataKind . LLVMDIAssignIDMetadataKind ;
38+
39+ public readonly bool IsTemplateParameter => Kind switch {
40+ LLVMMetadataKind . LLVMDITemplateTypeParameterMetadataKind => true ,
41+ LLVMMetadataKind . LLVMDITemplateValueParameterMetadataKind => true ,
42+ _ => false ,
43+ } ;
44+
45+ public readonly bool IsType => Kind switch {
46+ LLVMMetadataKind . LLVMDICompositeTypeMetadataKind => true ,
47+ LLVMMetadataKind . LLVMDIDerivedTypeMetadataKind => true ,
48+ LLVMMetadataKind . LLVMDIStringTypeMetadataKind => true ,
49+ LLVMMetadataKind . LLVMDIBasicTypeMetadataKind => true ,
50+ LLVMMetadataKind . LLVMDISubroutineTypeMetadataKind => true ,
51+ _ => false ,
52+ } ;
53+
54+ public readonly bool IsVariable => Kind switch {
55+ LLVMMetadataKind . LLVMDILocalVariableMetadataKind => true ,
56+ LLVMMetadataKind . LLVMDIGlobalVariableMetadataKind => true ,
57+ _ => false ,
58+ } ;
59+
60+ public readonly LLVMMetadataKind Kind => Handle == default
61+ ? ( LLVMMetadataKind ) ( - 1 ) // 0 is a valid kind, so we use -1 to indicate a null metadata reference
62+ : ( LLVMMetadataKind ) LLVM . GetMetadataKind ( this ) ;
63+
64+ public readonly uint Line => Kind switch {
65+ LLVMMetadataKind . LLVMDISubprogramMetadataKind => LLVM . DISubprogramGetLine ( this ) ,
66+ LLVMMetadataKind . LLVMDILocationMetadataKind => LLVM . DILocationGetLine ( this ) ,
67+ _ when IsType => LLVM . DITypeGetLine ( this ) ,
68+ _ when IsVariable => LLVM . DIVariableGetLine ( this ) ,
69+ _ => default ,
70+ } ;
71+
72+ public readonly string Name
73+ {
74+ get
75+ {
76+ if ( ! IsType )
77+ {
78+ return "" ;
79+ }
80+
81+ nuint nameLength = 0 ;
82+ sbyte * namePtr = LLVM . DITypeGetName ( this , & nameLength ) ;
83+ if ( namePtr == null )
84+ {
85+ return "" ;
86+ }
87+
88+ return new ReadOnlySpan < byte > ( namePtr , ( int ) nameLength ) . AsString ( ) ;
89+ }
90+ }
91+
92+ public readonly ulong OffsetInBits => IsType ? LLVM . DITypeGetOffsetInBits ( this ) : default ;
93+
94+ public readonly LLVMMetadataRef Scope => Kind switch {
95+ LLVMMetadataKind . LLVMDILocationMetadataKind => LLVM . DILocationGetScope ( this ) ,
96+ _ when IsVariable => LLVM . DIVariableGetScope ( this ) ,
97+ _ => default ,
98+ } ;
99+
100+ public readonly ulong SizeInBits => IsType ? LLVM . DITypeGetSizeInBits ( this ) : default ;
101+
102+ public readonly ushort Tag => IsDINode ? LLVM . GetDINodeTag ( this ) : default ;
103+
104+ public readonly LLVMMetadataRef Variable => Kind switch {
105+ LLVMMetadataKind . LLVMDIGlobalVariableExpressionMetadataKind => LLVM . DIGlobalVariableExpressionGetVariable ( this ) ,
106+ _ => default ,
107+ } ;
108+
11109 public static implicit operator LLVMMetadataRef ( LLVMOpaqueMetadata * value ) => new LLVMMetadataRef ( ( IntPtr ) value ) ;
12110
13111 public static implicit operator LLVMOpaqueMetadata * ( LLVMMetadataRef value ) => ( LLVMOpaqueMetadata * ) value . Handle ;
@@ -16,11 +114,19 @@ public unsafe partial struct LLVMMetadataRef(IntPtr handle) : IEquatable<LLVMMet
16114
17115 public static bool operator != ( LLVMMetadataRef left , LLVMMetadataRef right ) => ! ( left == right ) ;
18116
117+ public readonly LLVMValueRef AsValue ( LLVMContextRef context ) => context . MetadataAsValue ( this ) ;
118+
19119 public override readonly bool Equals ( object ? obj ) => ( obj is LLVMMetadataRef other ) && Equals ( other ) ;
20120
21121 public readonly bool Equals ( LLVMMetadataRef other ) => this == other ;
22122
23123 public override readonly int GetHashCode ( ) => Handle . GetHashCode ( ) ;
24124
125+ public readonly string GetMDString ( LLVMContextRef context , out uint length )
126+ {
127+ var value = context . MetadataAsValue ( this ) ;
128+ return value . GetMDString ( out length ) ;
129+ }
130+
25131 public override readonly string ToString ( ) => $ "{ nameof ( LLVMMetadataRef ) } : { Handle : X} ";
26132}
0 commit comments