diff options
| author | Amaury Sechet <deadalnix@gmail.com> | 2016-06-15 17:50:39 +0000 |
|---|---|---|
| committer | Amaury Sechet <deadalnix@gmail.com> | 2016-06-15 17:50:39 +0000 |
| commit | 6100adfeb541b6bdb27cd0f6f58cbe70c754fc04 (patch) | |
| tree | 315ea358751051499d3b26c57665ce738cddb42b | |
| parent | cd5fe14d89e895b068eab56c77f5a7de3930e041 (diff) | |
| download | bcm5719-llvm-6100adfeb541b6bdb27cd0f6f58cbe70c754fc04.tar.gz bcm5719-llvm-6100adfeb541b6bdb27cd0f6f58cbe70c754fc04.zip | |
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
llvm-svn: 272811
| -rw-r--r-- | llvm/include/llvm-c/Core.h | 10 | ||||
| -rw-r--r-- | llvm/include/llvm/IR/Attributes.h | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/IR/CallSite.h | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/IR/Function.h | 3 | ||||
| -rw-r--r-- | llvm/include/llvm/IR/Instructions.h | 12 | ||||
| -rw-r--r-- | llvm/lib/IR/Attributes.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/IR/Core.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/IR/Function.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/IR/Instructions.cpp | 20 |
9 files changed, 104 insertions, 1 deletions
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h index 6257e758b1e..6bdb96ac433 100644 --- a/llvm/include/llvm-c/Core.h +++ b/llvm/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/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h index 8a6b568ed8d..52d1a46602a 100644 --- a/llvm/include/llvm/IR/Attributes.h +++ b/llvm/include/llvm/IR/Attributes.h @@ -243,6 +243,8 @@ public: static AttributeSet get(LLVMContext &C, ArrayRef<AttributeSet> Attrs); static AttributeSet get(LLVMContext &C, unsigned Index, ArrayRef<Attribute::AttrKind> Kinds); + static AttributeSet get(LLVMContext &C, unsigned Index, + ArrayRef<StringRef> 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/llvm/include/llvm/IR/CallSite.h b/llvm/include/llvm/IR/CallSite.h index b423ecc6631..23f04747889 100644 --- a/llvm/include/llvm/IR/CallSite.h +++ b/llvm/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/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h index 954ccd4f9e3..867cfc4f140 100644 --- a/llvm/include/llvm/IR/Function.h +++ b/llvm/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/llvm/include/llvm/IR/Instructions.h b/llvm/include/llvm/IR/Instructions.h index 37f64750cd6..ff897e3a48a 100644 --- a/llvm/include/llvm/IR/Instructions.h +++ b/llvm/include/llvm/IR/Instructions.h @@ -1630,6 +1630,9 @@ public: 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); /// \brief adds the dereferenceable attribute to the list of attributes. @@ -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. /// @@ -3577,6 +3583,9 @@ public: 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); /// \brief adds the dereferenceable attribute to the list of attributes. @@ -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/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp index 3675bad2fb0..b470fac5782 100644 --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/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<StringRef> Kinds) { + SmallVector<std::pair<unsigned, Attribute>, 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<AttributeSet> 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/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index c965063d8c7..a1c094a758c 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/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<Function>(F)->getAttribute(Idx, StringRef(K, KLen))); +} + void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, unsigned KindID) { unwrap<Function>(F)->removeAttribute(Idx, (Attribute::AttrKind)KindID); } +void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + unwrap<Function>(F)->removeAttribute(Idx, StringRef(K, KLen)); +} + void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A, const char *V) { Function *Func = unwrap<Function>(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<Instruction>(C)) + .getAttribute(Idx, StringRef(K, KLen))); +} + void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, unsigned KindID) { CallSite(unwrap<Instruction>(C)) .removeAttribute(Idx, (Attribute::AttrKind)KindID); } +void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, + const char *K, unsigned KLen) { + CallSite(unwrap<Instruction>(C)).removeAttribute(Idx, StringRef(K, KLen)); +} + LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr) { return wrap(CallSite(unwrap<Instruction>(Instr)).getCalledValue()); } diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index b71e1baf1e9..07b21151e60 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/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/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 98d37074b4a..6f60d15c52c 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/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); |

