Skip to content

Commit 3d5afb9

Browse files
committed
Allow retrieving the kind of a metadata node
1 parent 86eec7c commit 3d5afb9

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

Sources/LLVM/IRMetadata.swift

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)