Add the target-dependent (string) attributes from the AttrBuilder to the AttributeSet.
authorBill Wendling <isanbard@gmail.com>
Tue, 5 Feb 2013 23:48:36 +0000 (23:48 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 5 Feb 2013 23:48:36 +0000 (23:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174467 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/Attributes.h
lib/IR/Attributes.cpp

index 46d279c1576471b85e90c55799eaae218e8dc707..83396e1fabe9996e34dbd451602cfa582450bcb5 100644 (file)
@@ -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<Attribute::AttrKind>::iterator       iterator;
   typedef DenseSet<Attribute::AttrKind>::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<std::string, std::string>                td_type;
+  typedef std::map<std::string, std::string>::iterator       td_iterator;
+  typedef std::map<std::string, std::string>::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)
index d61bd09e2c91ce37bf37861248575767e5580802..dc1a65734390d1412328e00da1ea109aec9399c1 100644 (file)
@@ -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<std::pair<unsigned, Attribute>, 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);
 }