Add LLVMGetAttrKindID 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.

See D18749 for reference.

Reviewers: Wallbraker, whitequark, joker.eph, echristo, rafael

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D19081

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@266842 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Amaury Sechet 2016-04-20 01:02:12 +00:00
parent 2c43473786
commit 7b1322cacb
4 changed files with 53 additions and 0 deletions

View File

@ -54,6 +54,9 @@ Non-comprehensive list of changes in this release
* The C API function LLVMGetDataLayout is deprecated
in favor of LLVMGetDataLayoutStr.
* The C API enum LLVMAttribute is deprecated in favor of
LLVMGetAttrKindID.
* ``TargetFrameLowering::eliminateCallFramePseudoInstr`` now returns an
iterator to the next instruction instead of ``void``. Targets that previously
did ``MBB.erase(I); return;`` now probably want ``return MBB.erase(I);``.

View File

@ -476,6 +476,19 @@ unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name,
unsigned SLen);
unsigned LLVMGetMDKindID(const char *Name, unsigned SLen);
/**
* Return an unique id given the name of a target independent attribute,
* or 0 if no attribute by that name exists.
*
* See http://llvm.org/docs/LangRef.html#parameter-attributes
* and http://llvm.org/docs/LangRef.html#function-attributes
* for the list of available attributes.
*
* NB: Attribute names and/or id are subject to change without
* going through the C API deprecation cycle.
*/
unsigned LLVMGetAttrKindID(const char *Name, size_t SLen);
/**
* @}
*/

View File

@ -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,18 @@ unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) {
return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
}
#define GET_ATTR_KIND_FROM_NAME
#include "AttributesCompatFunc.inc"
unsigned LLVMGetAttrKindID(const char *Name, size_t SLen) {
auto K = getAttrKindFromName(StringRef(Name, SLen));
if (K == Attribute::None) {
return 0;
}
return AttributeImpl::getAttrMask(K);
}
char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) {
std::string MsgStorage;
raw_string_ostream Stream(MsgStorage);

View File

@ -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<Record*> Attrs =
Records.getAllDerivedDefinitions("EnumAttr");
OS << "static Attribute::AttrKind getAttrKindFromName(StringRef AttrName) {\n";
OS << " return StringSwitch<Attribute::AttrKind>(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);
}