From a2f727daf6fdb79a59a852356f9e7b266c6b183a Mon Sep 17 00:00:00 2001 From: Amaury Sechet Date: Wed, 15 Jun 2016 17:50:39 +0000 Subject: [PATCH] Add support for string attributes in the C API. Summary: As per title. This completes the C API Attribute support. Reviewers: Wallbraker, whitequark, echristo, rafael, jyknight Subscribers: mehdi_amini Differential Revision: http://reviews.llvm.org/D21365 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272811 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm-c/Core.h | 10 ++++++++++ include/llvm/IR/Attributes.h | 8 ++++++++ include/llvm/IR/CallSite.h | 8 ++++++++ include/llvm/IR/Function.h | 3 +++ include/llvm/IR/Instructions.h | 12 ++++++++++++ lib/IR/Attributes.cpp | 14 ++++++++++++++ lib/IR/Core.cpp | 24 +++++++++++++++++++++++- lib/IR/Function.cpp | 6 ++++++ lib/IR/Instructions.cpp | 20 ++++++++++++++++++++ 9 files changed, 104 insertions(+), 1 deletion(-) diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index 6257e758b1e..6bdb96ac433 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -2017,8 +2017,13 @@ void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, unsigned KindID); +LLVMAttributeRef LLVMGetStringAttributeAtIndex(LLVMValueRef F, + LLVMAttributeIndex Idx, + const char *K, unsigned KLen); void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, unsigned KindID); +void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, + const char *K, unsigned KLen); /** * Add a target-dependent attribute to a function @@ -2598,8 +2603,13 @@ void LLVMAddCallSiteAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, unsigned KindID); +LLVMAttributeRef LLVMGetCallSiteStringAttribute(LLVMValueRef C, + LLVMAttributeIndex Idx, + const char *K, unsigned KLen); void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, unsigned KindID); +void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, + const char *K, unsigned KLen); /** * Obtain the pointer to the function invoked by this instruction. diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 8a6b568ed8d..52d1a46602a 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -243,6 +243,8 @@ public: static AttributeSet get(LLVMContext &C, ArrayRef Attrs); static AttributeSet get(LLVMContext &C, unsigned Index, ArrayRef Kinds); + static AttributeSet get(LLVMContext &C, unsigned Index, + ArrayRef Kind); static AttributeSet get(LLVMContext &C, unsigned Index, const AttrBuilder &B); /// \brief Add an attribute to the attribute set at the given index. Because @@ -271,6 +273,12 @@ public: AttributeSet removeAttribute(LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const; + /// \brief Remove the specified attribute at the specified index from this + /// attribute list. Because attribute lists are immutable, this returns the + /// new list. + AttributeSet removeAttribute(LLVMContext &C, unsigned Index, + StringRef Kind) const; + /// \brief Remove the specified attributes at the specified index from this /// attribute list. Because attribute lists are immutable, this returns the /// new list. diff --git a/include/llvm/IR/CallSite.h b/include/llvm/IR/CallSite.h index b423ecc6631..23f04747889 100644 --- a/include/llvm/IR/CallSite.h +++ b/include/llvm/IR/CallSite.h @@ -321,6 +321,10 @@ public: CALLSITE_DELEGATE_SETTER(removeAttribute(i, Kind)); } + void removeAttribute(unsigned i, StringRef Kind) { + CALLSITE_DELEGATE_SETTER(removeAttribute(i, Kind)); + } + void removeAttribute(unsigned i, Attribute Attr) { CALLSITE_DELEGATE_SETTER(removeAttribute(i, Attr)); } @@ -344,6 +348,10 @@ public: CALLSITE_DELEGATE_GETTER(getAttribute(i, Kind)); } + Attribute getAttribute(unsigned i, StringRef Kind) const { + CALLSITE_DELEGATE_GETTER(getAttribute(i, Kind)); + } + /// \brief Return true if the data operand at index \p i directly or /// indirectly has the attribute \p A. /// diff --git a/include/llvm/IR/Function.h b/include/llvm/IR/Function.h index 954ccd4f9e3..867cfc4f140 100644 --- a/include/llvm/IR/Function.h +++ b/include/llvm/IR/Function.h @@ -239,6 +239,9 @@ public: /// @brief removes the attribute from the list of attributes. void removeAttribute(unsigned i, Attribute::AttrKind Kind); + /// @brief removes the attribute from the list of attributes. + void removeAttribute(unsigned i, StringRef Kind); + /// @brief removes the attributes from the list of attributes. void removeAttributes(unsigned i, AttributeSet Attrs); diff --git a/include/llvm/IR/Instructions.h b/include/llvm/IR/Instructions.h index 37f64750cd6..ff897e3a48a 100644 --- a/include/llvm/IR/Instructions.h +++ b/include/llvm/IR/Instructions.h @@ -1629,6 +1629,9 @@ public: /// removeAttribute - removes the attribute from the list of attributes. void removeAttribute(unsigned i, Attribute::AttrKind Kind); + /// removeAttribute - removes the attribute from the list of attributes. + void removeAttribute(unsigned i, StringRef Kind); + /// removeAttribute - removes the attribute from the list of attributes. void removeAttribute(unsigned i, Attribute Attr); @@ -1657,6 +1660,9 @@ public: /// \brief Get the attribute of a given kind at a position. Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const; + /// \brief Get the attribute of a given kind at a position. + Attribute getAttribute(unsigned i, StringRef Kind) const; + /// \brief Return true if the data operand at index \p i has the attribute \p /// A. /// @@ -3576,6 +3582,9 @@ public: /// removeAttribute - removes the attribute from the list of attributes. void removeAttribute(unsigned i, Attribute::AttrKind Kind); + /// removeAttribute - removes the attribute from the list of attributes. + void removeAttribute(unsigned i, StringRef Kind); + /// removeAttribute - removes the attribute from the list of attributes. void removeAttribute(unsigned i, Attribute Attr); @@ -3604,6 +3613,9 @@ public: /// \brief Get the attribute of a given kind at a position. Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const; + /// \brief Get the attribute of a given kind at a position. + Attribute getAttribute(unsigned i, StringRef Kind) const; + /// \brief Return true if the data operand at index \p i has the attribute \p /// A. /// diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 3675bad2fb0..b470fac5782 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -807,6 +807,14 @@ AttributeSet AttributeSet::get(LLVMContext &C, unsigned Index, return get(C, Attrs); } +AttributeSet AttributeSet::get(LLVMContext &C, unsigned Index, + ArrayRef Kinds) { + SmallVector, 8> Attrs; + for (StringRef K : Kinds) + Attrs.push_back(std::make_pair(Index, Attribute::get(C, K))); + return get(C, Attrs); +} + AttributeSet AttributeSet::get(LLVMContext &C, ArrayRef Attrs) { if (Attrs.empty()) return AttributeSet(); if (Attrs.size() == 1) return Attrs[0]; @@ -935,6 +943,12 @@ AttributeSet AttributeSet::removeAttribute(LLVMContext &C, unsigned Index, return removeAttributes(C, Index, AttributeSet::get(C, Index, Kind)); } +AttributeSet AttributeSet::removeAttribute(LLVMContext &C, unsigned Index, + StringRef Kind) const { + if (!hasAttribute(Index, Kind)) return *this; + return removeAttributes(C, Index, AttributeSet::get(C, Index, Kind)); +} + AttributeSet AttributeSet::removeAttributes(LLVMContext &C, unsigned Index, AttributeSet Attrs) const { if (!pImpl) return AttributeSet(); diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index c965063d8c7..a1c094a758c 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -209,7 +209,6 @@ LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI) { return severity; } - /*===-- Operations on modules ---------------------------------------------===*/ LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) { @@ -1852,11 +1851,22 @@ LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F, (Attribute::AttrKind)KindID)); } +LLVMAttributeRef LLVMGetStringAttributeAtIndex(LLVMValueRef F, + LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + return wrap(unwrap(F)->getAttribute(Idx, StringRef(K, KLen))); +} + void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, unsigned KindID) { unwrap(F)->removeAttribute(Idx, (Attribute::AttrKind)KindID); } +void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + unwrap(F)->removeAttribute(Idx, StringRef(K, KLen)); +} + void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A, const char *V) { Function *Func = unwrap(Fn); @@ -2213,12 +2223,24 @@ LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C, .getAttribute(Idx, (Attribute::AttrKind)KindID)); } +LLVMAttributeRef LLVMGetCallSiteStringAttribute(LLVMValueRef C, + LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + return wrap(CallSite(unwrap(C)) + .getAttribute(Idx, StringRef(K, KLen))); +} + void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, unsigned KindID) { CallSite(unwrap(C)) .removeAttribute(Idx, (Attribute::AttrKind)KindID); } +void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + CallSite(unwrap(C)).removeAttribute(Idx, StringRef(K, KLen)); +} + LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr) { return wrap(CallSite(unwrap(Instr)).getCalledValue()); } diff --git a/lib/IR/Function.cpp b/lib/IR/Function.cpp index b71e1baf1e9..07b21151e60 100644 --- a/lib/IR/Function.cpp +++ b/lib/IR/Function.cpp @@ -390,6 +390,12 @@ void Function::removeAttribute(unsigned i, Attribute::AttrKind Kind) { setAttributes(PAL); } +void Function::removeAttribute(unsigned i, StringRef Kind) { + AttributeSet PAL = getAttributes(); + PAL = PAL.removeAttribute(getContext(), i, Kind); + setAttributes(PAL); +} + void Function::removeAttributes(unsigned i, AttributeSet Attrs) { AttributeSet PAL = getAttributes(); PAL = PAL.removeAttributes(getContext(), i, Attrs); diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 98d37074b4a..6f60d15c52c 100644 --- a/lib/IR/Instructions.cpp +++ b/lib/IR/Instructions.cpp @@ -355,6 +355,12 @@ void CallInst::removeAttribute(unsigned i, Attribute::AttrKind Kind) { setAttributes(PAL); } +void CallInst::removeAttribute(unsigned i, StringRef Kind) { + AttributeSet PAL = getAttributes(); + PAL = PAL.removeAttribute(getContext(), i, Kind); + setAttributes(PAL); +} + void CallInst::removeAttribute(unsigned i, Attribute Attr) { AttributeSet PAL = getAttributes(); AttrBuilder B(Attr); @@ -390,6 +396,10 @@ Attribute CallInst::getAttribute(unsigned i, Attribute::AttrKind Kind) const { return getAttributes().getAttribute(i, Kind); } +Attribute CallInst::getAttribute(unsigned i, StringRef Kind) const { + return getAttributes().getAttribute(i, Kind); +} + bool CallInst::dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind Kind) const { // There are getNumOperands() - 1 data operands. The last operand is the @@ -724,6 +734,12 @@ void InvokeInst::removeAttribute(unsigned i, Attribute::AttrKind Kind) { setAttributes(PAL); } +void InvokeInst::removeAttribute(unsigned i, StringRef Kind) { + AttributeSet PAL = getAttributes(); + PAL = PAL.removeAttribute(getContext(), i, Kind); + setAttributes(PAL); +} + void InvokeInst::removeAttribute(unsigned i, Attribute Attr) { AttributeSet PAL = getAttributes(); AttrBuilder B(Attr); @@ -737,6 +753,10 @@ Attribute InvokeInst::getAttribute(unsigned i, return getAttributes().getAttribute(i, Kind); } +Attribute InvokeInst::getAttribute(unsigned i, StringRef Kind) const { + return getAttributes().getAttribute(i, Kind); +} + void InvokeInst::addDereferenceableAttr(unsigned i, uint64_t Bytes) { AttributeSet PAL = getAttributes(); PAL = PAL.addDereferenceableAttr(getContext(), i, Bytes); -- 2.50.1