[PATCH] D19181: Map Attribute in the C API.

James Y Knight via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 20:42:28 PDT 2016


jyknight added a comment.

Seems to me it'd be cleaner to actually expose the set of attributes. Here's the API I'd propose:

  typedef unsigned LLVMAttrKind;
  
  /* Returns the number corresponding to a given built-in attribute. */
  LLVMAttrKind LLVMGetAttributeKindForName(const char *Name);
  
  /* In the below APIs, "Index" shall refer either to the parameter number (1 to N),
     LLVMAttributeReturnIndex, or LLVMAttributeFunctionIndex. */
  enum { 
    LLVMAttributeReturnIndex = 0U,
    LLVMAttributeFunctionIndex = ~0U
  };
  
  
  /* Retrieve and replace attribute sets. These work on CallInst, InvokeInst, and Function values. */
  LLVMAttributeSetRef LLVMGetAttrs(LLVMValueRef Val);
  void LLVMSetAttrs(LLVMValueRef Val, LLVMAttributeSetRef AS);
  
  /* Retrieve the number of attributes in a set */
  unsigned LLVMASNumAttributes(LLVMAttributeSetRef AS, unsigned Index);
  
  /* Whether the attr kind of the given attribute is a String, not an LLVMAttrKind enum */
  bool LLVMASAttrIsStringKindAtIndex(LLVMAttributeSetRef AS, unsigned Index, unsigned i);
  /* Retrieve the kind of attribute at a given index. Returns 0 on failure, e.g. if that attribute is a string attribute. */
  LLVMAttrKind LLVMASGetKindAtIndex(LLVMAttributeSetRef AS, unsigned Index, unsigned i);
  /* Retrieve the kind string of a string attribute. Returns NULL on failure, e.g. if that attribute is of an LLVMAttrKind enum */
  char *LLVMASGetStringKindAtIndex(LLVMAttributeSetRef AS, unsigned Index, unsigned i);
  
  /* Query if a given attribute kind is present */
  LLVMBool LLVMASHasAttribute(LLVMAttributeSetRef AS, unsigned Index, LLVMAttrKind Kind);
  
  /* Retrieve the value of an integer attribute. Fails if the given kind doesn't store an integer */
  uint64_t LLVMASGetIntAttribute(LLVMAttributeSetRef AS, unsigned Index, LLVMAttrKind Kind);
  /* Retrieve the value of a string attribute; if not present, returns NULL */
  char *LLVMASGetStringAttribute(LLVMAttributeSetRef AS, unsigned Index, char *Name);
  
  /* Note: all setters return a new LLVMAttributeSetRef, they do not mutate the argument in place. */
  
  LLVMAttributeSetRef LLVMASSetAttribute(LLVMAttributeSetRef AS, unsigned Index, LLVMAttrKind Kind);
  LLVMAttributeSetRef LLVMASSetIntAttribute(LLVMAttributeSetRef AS, unsigned Index, LLVMAttrKind Kind, uint64_t Val);
  LLVMAttributeSetRef LLVMASSetStringAttribute(LLVMAttributeSetRef AS, char *Name, char *Val);
  
  LLVMAttributeSetRef LLVMASRemoveAttribute(LLVMAttributeSetRef AS, unsigned Index, LLVMAttrKind Kind);
  LLVMAttributeSetRef LLVMASRemoveStringAttribute(LLVMAttributeSetRef AS, unsigned Index, char *Name);
  
  LLVMAttributeSetRef LLVMCreateEmptyAS(LLVMContextRef Ctx);

I think that API is implementable except for one detail: empty AttributeSets don't actually store a Context right now, so all the mutating operations would need an extra LLVMContext argument, in case the input LLVMAttributeSetRef is empty. (But, I think that could/should be easily fixed, for a marginally nicer C++ API, too.)


http://reviews.llvm.org/D19181





More information about the llvm-commits mailing list