mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:39:47 +00:00
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 llvm-svn: 266842
This commit is contained in:
parent
3600a30ffa
commit
8c1203a67d
@ -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);``.
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user