From 64754f499058b5dc748ea6d06a084af0ed539ec4 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 5 Feb 2013 23:48:36 +0000 Subject: [PATCH] Add the target-dependent (string) attributes from the AttrBuilder to the AttributeSet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174467 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/Attributes.h | 15 +++++++++++++++ lib/IR/Attributes.cpp | 15 +++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 46d279c1576..83396e1fabe 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -140,6 +140,9 @@ public: /// \brief Return true if the attribute is present. bool hasAttribute(AttrKind Val) const; + /// \brief Return true if the target-dependent attribute is present. + bool hasAttribute(StringRef Val) const; + /// \brief Return the attribute's kind as an enum (Attribute::AttrKind). This /// requires the attribute to be an enum or alignment attribute. Attribute::AttrKind getKindAsEnum() const; @@ -418,6 +421,7 @@ public: /// the form used internally in Attribute. AttrBuilder &addStackAlignmentAttr(unsigned Align); + // Iterators for target-independent attributes. typedef DenseSet::iterator iterator; typedef DenseSet::const_iterator const_iterator; @@ -427,6 +431,17 @@ public: const_iterator begin() const { return Attrs.begin(); } const_iterator end() const { return Attrs.end(); } + // Iterators for target-dependent attributes. + typedef std::pair td_type; + typedef std::map::iterator td_iterator; + typedef std::map::const_iterator td_const_iterator; + + td_iterator td_begin() { return TargetDepAttrs.begin(); } + td_iterator td_end() { return TargetDepAttrs.end(); } + + td_const_iterator td_begin() const { return TargetDepAttrs.begin(); } + td_const_iterator td_end() const { return TargetDepAttrs.end(); } + /// \brief Remove attributes that are used on functions only. void removeFunctionOnlyAttrs() { removeAttribute(Attribute::NoReturn) diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index d61bd09e2c9..dc1a6573439 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -126,8 +126,13 @@ StringRef Attribute::getValueAsString() const { return pImpl ? pImpl->getValueAsString() : StringRef(); } -bool Attribute::hasAttribute(AttrKind Val) const { - return (pImpl && pImpl->hasAttribute(Val)) || (!pImpl && Val == None); +bool Attribute::hasAttribute(AttrKind Kind) const { + return (pImpl && pImpl->hasAttribute(Kind)) || (!pImpl && Kind == None); +} + +bool Attribute::hasAttribute(StringRef Kind) const { + if (!isStringAttribute()) return false; + return pImpl && pImpl->hasAttribute(Kind); } /// This returns the alignment field of an attribute as a byte alignment value. @@ -552,6 +557,7 @@ AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) { if (!B.hasAttributes()) return AttributeSet(); + // Add target-independent attributes. SmallVector, 8> Attrs; for (AttrBuilder::iterator I = B.begin(), E = B.end(); I != E; ++I) { Attribute::AttrKind Kind = *I; @@ -565,6 +571,11 @@ AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) { Attrs.push_back(std::make_pair(Idx, Attribute::get(C, Kind))); } + // Add target-dependent (string) attributes. + for (AttrBuilder::td_iterator I = B.td_begin(), E = B.td_end(); + I != E; ++I) + Attrs.push_back(std::make_pair(Idx, Attribute::get(C, I->first,I->second))); + return get(C, Attrs); }