@@ -69,6 +69,11 @@ extension IRMetadata {
6969 public func forceCast< DestTy: IRMetadata > ( to: DestTy . Type ) -> DestTy {
7070 return DestTy ( llvm: self . asMetadata ( ) )
7171 }
72+
73+ /// Returns the kind of this metadata node.
74+ public var kind : IRMetadataKind {
75+ return IRMetadataKind ( raw: LLVMGetMetadataKind ( self . asMetadata ( ) ) )
76+ }
7277}
7378
7479/// Denotes a scope in which child metadata nodes can be inserted.
@@ -377,3 +382,76 @@ public struct ExpressionMetadata: IRMetadata {
377382 self . llvm = llvm
378383 }
379384}
385+
386+ /// Enumerates the kind of metadata nodes.
387+ public enum IRMetadataKind {
388+ case mdString
389+ case constantAsMetadata
390+ case localAsMetadata
391+ case distinctMDOperandPlaceholder
392+ case mdTuple
393+ case location
394+ case expression
395+ case globalVariableExpression
396+ case genericDINode
397+ case subrange
398+ case enumerator
399+ case basicType
400+ case derivedType
401+ case compositeType
402+ case subroutineType
403+ case file
404+ case compileUnit
405+ case subprogram
406+ case lexicalBlock
407+ case lexicalBlockFile
408+ case namespace
409+ case module
410+ case templateTypeParameter
411+ case templateValueParameter
412+ case globalVariable
413+ case localVariable
414+ case label
415+ case objCProperty
416+ case importedEntity
417+ case macro
418+ case macroFile
419+
420+ fileprivate init ( raw: LLVMMetadataKind ) {
421+ switch Int ( raw) {
422+ case LLVMMDStringMetadataKind: self = . mdString
423+ case LLVMConstantAsMetadataMetadataKind: self = . constantAsMetadata
424+ case LLVMLocalAsMetadataMetadataKind: self = . localAsMetadata
425+ case LLVMDistinctMDOperandPlaceholderMetadataKind: self = . distinctMDOperandPlaceholder
426+ case LLVMMDTupleMetadataKind: self = . mdTuple
427+ case LLVMDILocationMetadataKind: self = . location
428+ case LLVMDIExpressionMetadataKind: self = . expression
429+ case LLVMDIGlobalVariableExpressionMetadataKind: self = . globalVariableExpression
430+ case LLVMGenericDINodeMetadataKind: self = . genericDINode
431+ case LLVMDISubrangeMetadataKind: self = . subrange
432+ case LLVMDIEnumeratorMetadataKind: self = . enumerator
433+ case LLVMDIBasicTypeMetadataKind: self = . basicType
434+ case LLVMDIDerivedTypeMetadataKind: self = . derivedType
435+ case LLVMDICompositeTypeMetadataKind: self = . compositeType
436+ case LLVMDISubroutineTypeMetadataKind: self = . subroutineType
437+ case LLVMDIFileMetadataKind: self = . file
438+ case LLVMDICompileUnitMetadataKind: self = . compileUnit
439+ case LLVMDISubprogramMetadataKind: self = . subprogram
440+ case LLVMDILexicalBlockMetadataKind: self = . lexicalBlock
441+ case LLVMDILexicalBlockFileMetadataKind: self = . lexicalBlockFile
442+ case LLVMDINamespaceMetadataKind: self = . namespace
443+ case LLVMDIModuleMetadataKind: self = . module
444+ case LLVMDITemplateTypeParameterMetadataKind: self = . templateTypeParameter
445+ case LLVMDITemplateValueParameterMetadataKind: self = . templateValueParameter
446+ case LLVMDIGlobalVariableMetadataKind: self = . globalVariable
447+ case LLVMDILocalVariableMetadataKind: self = . localVariable
448+ case LLVMDILabelMetadataKind: self = . label
449+ case LLVMDIObjCPropertyMetadataKind: self = . objCProperty
450+ case LLVMDIImportedEntityMetadataKind: self = . importedEntity
451+ case LLVMDIMacroMetadataKind: self = . macro
452+ case LLVMDIMacroFileMetadataKind: self = . macroFile
453+ default :
454+ fatalError ( " Unknown kind " )
455+ }
456+ }
457+ }
0 commit comments