[LLVM-C] Add an accessor for the kind of a Metadata Node

Summary: Allows for retrieving the type of a metadata node.  Has the added benefit of ensuring that the C and C++ kind APIs stay in sync as a failure to add a corresponding LLVMMetadataKind will result in the switch in the accessor being semantically malformed.

Reviewers: whitequark, deadalnix

Reviewed By: whitequark

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D52693

llvm-svn: 343469
This commit is contained in:
Robert Widmann 2018-10-01 13:15:09 +00:00
parent a982236e59
commit abda7ee8e7
2 changed files with 56 additions and 0 deletions

View File

@ -126,6 +126,44 @@ typedef enum {
LLVMDWARFEmissionLineTablesOnly
} LLVMDWARFEmissionKind;
/**
* The kind of metadata nodes.
*/
enum {
LLVMMDStringMetadataKind,
LLVMConstantAsMetadataMetadataKind,
LLVMLocalAsMetadataMetadataKind,
LLVMDistinctMDOperandPlaceholderMetadataKind,
LLVMMDTupleMetadataKind,
LLVMDILocationMetadataKind,
LLVMDIExpressionMetadataKind,
LLVMDIGlobalVariableExpressionMetadataKind,
LLVMGenericDINodeMetadataKind,
LLVMDISubrangeMetadataKind,
LLVMDIEnumeratorMetadataKind,
LLVMDIBasicTypeMetadataKind,
LLVMDIDerivedTypeMetadataKind,
LLVMDICompositeTypeMetadataKind,
LLVMDISubroutineTypeMetadataKind,
LLVMDIFileMetadataKind,
LLVMDICompileUnitMetadataKind,
LLVMDISubprogramMetadataKind,
LLVMDILexicalBlockMetadataKind,
LLVMDILexicalBlockFileMetadataKind,
LLVMDINamespaceMetadataKind,
LLVMDIModuleMetadataKind,
LLVMDITemplateTypeParameterMetadataKind,
LLVMDITemplateValueParameterMetadataKind,
LLVMDIGlobalVariableMetadataKind,
LLVMDILocalVariableMetadataKind,
LLVMDILabelMetadataKind,
LLVMDIObjCPropertyMetadataKind,
LLVMDIImportedEntityMetadataKind,
LLVMDIMacroMetadataKind,
LLVMDIMacroFileMetadataKind
};
typedef unsigned LLVMMetadataKind;
/**
* An LLVM DWARF type encoding.
*/
@ -1153,6 +1191,13 @@ LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func);
*/
void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP);
/**
* Obtain the enumerated type of a Metadata instance.
*
* @see llvm::Metadata::getMetadataID()
*/
LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata);
#ifdef __cplusplus
} /* end extern "C" */
#endif

View File

@ -1354,3 +1354,14 @@ LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func) {
void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) {
unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
}
LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata) {
switch(unwrap(Metadata)->getMetadataID()) {
#define HANDLE_METADATA_LEAF(CLASS) \
case Metadata::CLASS##Kind: \
return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
#include "llvm/IR/Metadata.def"
default:
return (LLVMMetadataKind)LLVMGenericDINodeMetadataKind;
}
}