[PATCH] D18749: Add LLVMGetAttrKindIDInContext in the C API in order to facilitate migration away from LLVMAttribute

Amaury SECHET via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 3 18:26:43 PDT 2016


deadalnix created this revision.
deadalnix added reviewers: Wallbraker, whitequark, joker.eph, echristo.
deadalnix added a subscriber: llvm-commits.

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.

http://reviews.llvm.org/D18749

Files:
  include/llvm-c/Core.h
  lib/IR/Core.cpp
  utils/TableGen/Attributes.cpp

Index: utils/TableGen/Attributes.cpp
===================================================================
--- utils/TableGen/Attributes.cpp
+++ utils/TableGen/Attributes.cpp
@@ -27,6 +27,7 @@
 
 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 @@
   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 getAtrKindFromName(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::emit(raw_ostream &OS) {
   emitTargetIndependentEnums(OS);
+  emitConversionFn(OS);
   emitFnAttrCompatCheck(OS, false);
 }
 
Index: lib/IR/Core.cpp
===================================================================
--- lib/IR/Core.cpp
+++ 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"
@@ -109,6 +111,20 @@
   return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
 }
 
+#define GET_ATTR_KIND_FROM_NAME
+#include "AttributesCompatFunc.inc"
+
+unsigned LLVMGetAttrKindIDInContext(LLVMContextRef C, const char* Name,
+                                    unsigned SLen) {
+  auto K = getAtrKindFromName(StringRef(Name, SLen));
+  assert(K != Attribute::None && "Invalid attribute");
+  return AttributeImpl::getAttrMask(K);
+}
+
+unsigned LLVMGetAttrKindID(const char* Name, unsigned SLen) {
+  return LLVMGetAttrKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
+}
+
 char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) {
   std::string MsgStorage;
   raw_string_ostream Stream(MsgStorage);
Index: include/llvm-c/Core.h
===================================================================
--- include/llvm-c/Core.h
+++ include/llvm-c/Core.h
@@ -434,6 +434,10 @@
                                   unsigned SLen);
 unsigned LLVMGetMDKindID(const char* Name, unsigned SLen);
 
+unsigned LLVMGetAttrKindIDInContext(LLVMContextRef C, const char* Name,
+                                    unsigned SLen);
+unsigned LLVMGetAttrKindID(const char* Name, unsigned SLen);
+
 /**
  * @}
  */


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18749.52518.patch
Type: text/x-patch
Size: 3058 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160404/508ed05d/attachment.bin>


More information about the llvm-commits mailing list