From 85df6b43403d3ebf5d80023a85699c6fb254941a Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Wed, 6 Feb 2013 01:16:00 +0000 Subject: [PATCH] Add methods to merge an AttrBuilder into another builder. This is useful when parsing an object that references multiple attribute groups. N.B. If both builders have alignments specified, then they should match! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174480 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/Attributes.h | 7 +++++++ lib/IR/Attributes.cpp | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 83396e1fabe..d0fe2e15bc7 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -373,6 +373,10 @@ public: addAttribute(A); } AttrBuilder(AttributeSet AS, unsigned Idx); + AttrBuilder(const AttrBuilder &B) + : Attrs(B.Attrs), + TargetDepAttrs(B.TargetDepAttrs.begin(), B.TargetDepAttrs.end()), + Alignment(B.Alignment), StackAlignment(B.StackAlignment) {} void clear(); @@ -394,6 +398,9 @@ public: /// \brief Remove the target-dependent attribute to the builder. AttrBuilder &removeAttribute(StringRef A); + /// \brief Add the attributes from the builder. + AttrBuilder &merge(const AttrBuilder &B); + /// \brief Return true if the builder has the specified attribute. bool contains(Attribute::AttrKind A) const; diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index dc1a6573439..67ab4eaa699 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -956,6 +956,23 @@ AttrBuilder &AttrBuilder::addStackAlignmentAttr(unsigned Align) { return *this; } +AttrBuilder &AttrBuilder::merge(const AttrBuilder &B) { + // FIXME: What if both have alignments, but they don't match?! + if (!Alignment) + Alignment = B.Alignment; + + if (!StackAlignment) + StackAlignment = B.StackAlignment; + + Attrs.insert(B.Attrs.begin(), B.Attrs.end()); + + for (td_const_iterator I = B.TargetDepAttrs.begin(), + E = B.TargetDepAttrs.end(); I != E; ++I) + TargetDepAttrs[I->first] = I->second; + + return *this; +} + bool AttrBuilder::contains(Attribute::AttrKind A) const { return Attrs.count(A); }