From 2af3e8f7984572c1ae586c15e2160ebf14f74de7 Mon Sep 17 00:00:00 2001 From: Amaury Sechet Date: Wed, 13 Apr 2016 22:51:40 +0000 Subject: [PATCH] Add LLVMGetAttrKindIDInContext in the C API in order to facilitate migration away from LLVMAttribute Summary: LLVMAttribute has outlived its utility and is becoming a problem for C API users that what to use all the LLVM attributes. In order to help moving away from LLVMAttribute in a smooth manner, this diff introduce LLVMGetAttrKindIDInContext, which can be used instead of the enum values. Reviewers: Wallbraker, whitequark, joker.eph, echristo Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D18749 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@266257 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm-c/Core.h | 3 +++ lib/IR/Core.cpp | 12 ++++++++++++ utils/TableGen/Attributes.cpp | 23 +++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index d9b6712ac27..114b8788b1b 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -476,6 +476,9 @@ unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name, unsigned SLen); unsigned LLVMGetMDKindID(const char *Name, unsigned SLen); +unsigned LLVMGetAttrKindIDInContext(LLVMContextRef C, const char *Name, + size_t SLen); + /** * @} */ diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index 1b4ad203969..147700dea0a 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -13,6 +13,8 @@ //===----------------------------------------------------------------------===// #include "llvm-c/Core.h" +#include "llvm/ADT/StringSwitch.h" +#include "AttributeImpl.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/CallSite.h" @@ -119,6 +121,16 @@ unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) { return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen); } +#define GET_ATTR_KIND_FROM_NAME +#include "AttributesCompatFunc.inc" + +unsigned LLVMGetAttrKindIDInContext(LLVMContextRef C, const char *Name, + size_t SLen) { + auto K = getAttrKindFromName(StringRef(Name, SLen)); + assert(K != Attribute::None && "Invalid attribute"); + return AttributeImpl::getAttrMask(K); +} + char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) { std::string MsgStorage; raw_string_ostream Stream(MsgStorage); diff --git a/utils/TableGen/Attributes.cpp b/utils/TableGen/Attributes.cpp index 7b001bf14de..58dbe5767ad 100644 --- a/utils/TableGen/Attributes.cpp +++ b/utils/TableGen/Attributes.cpp @@ -27,6 +27,7 @@ public: private: void emitTargetIndependentEnums(raw_ostream &OS); + void emitConversionFn(raw_ostream &OS); void emitFnAttrCompatCheck(raw_ostream &OS, bool IsStringAttr); void printEnumAttrClasses(raw_ostream &OS, @@ -52,6 +53,27 @@ void Attributes::emitTargetIndependentEnums(raw_ostream &OS) { OS << "#endif\n"; } +void Attributes::emitConversionFn(raw_ostream &OS) { + OS << "#ifdef GET_ATTR_KIND_FROM_NAME\n"; + OS << "#undef GET_ATTR_KIND_FROM_NAME\n"; + + std::vector Attrs = + Records.getAllDerivedDefinitions("EnumAttr"); + + OS << "static Attribute::AttrKind getAttrKindFromName(StringRef AttrName) {\n"; + OS << " return StringSwitch(AttrName)\n"; + + for (auto A : Attrs) { + OS << " .Case(\"" << A->getValueAsString("AttrString"); + OS << "\", Attribute::" << A->getName() << ")\n"; + } + + OS << " .Default(Attribute::None);\n"; + OS << "}\n\n"; + + OS << "#endif\n"; +} + void Attributes::emitFnAttrCompatCheck(raw_ostream &OS, bool IsStringAttr) { OS << "#ifdef GET_ATTR_COMPAT_FUNC\n"; OS << "#undef GET_ATTR_COMPAT_FUNC\n"; @@ -144,6 +166,7 @@ void Attributes::printStrBoolAttrClasses(raw_ostream &OS, void Attributes::emit(raw_ostream &OS) { emitTargetIndependentEnums(OS); + emitConversionFn(OS); emitFnAttrCompatCheck(OS, false); } -- 2.11.0