summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-01-27 12:50:02 +0000
committerBill Wendling <isanbard@gmail.com>2013-01-27 12:50:02 +0000
commit6a325cc46db9cb0c631ac832474e5df039d04b19 (patch)
treec25737e3c3773a3fd3c05edfeb99fa17eb38ea35
parent2044adfb2ac7435ed3a1a66d48eb49887769745d (diff)
downloadllvm-6a325cc46db9cb0c631ac832474e5df039d04b19.tar.gz
llvm-6a325cc46db9cb0c631ac832474e5df039d04b19.tar.bz2
llvm-6a325cc46db9cb0c631ac832474e5df039d04b19.tar.xz
In the AttributeSetImpl c'tor, fill in the AttrNodes data structure with the attributes being passed in.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173618 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/IR/AttributeImpl.h6
-rw-r--r--lib/IR/Attributes.cpp44
2 files changed, 42 insertions, 8 deletions
diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h
index d7ebec5daa..b4c788fa9d 100644
--- a/lib/IR/AttributeImpl.h
+++ b/lib/IR/AttributeImpl.h
@@ -115,11 +115,9 @@ class AttributeSetImpl : public FoldingSetNode {
void operator=(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
AttributeSetImpl(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
public:
- AttributeSetImpl(LLVMContext &C, ArrayRef<AttributeWithIndex> attrs)
- : Context(C), AttrList(attrs.begin(), attrs.end()) {}
+ AttributeSetImpl(LLVMContext &C, ArrayRef<AttributeWithIndex> attrs);
AttributeSetImpl(LLVMContext &C,
- ArrayRef<std::pair<uint64_t, AttributeSetNode*> > attrs)
- : Context(C), AttrNodes(attrs.begin(), attrs.end()) {}
+ ArrayRef<std::pair<uint64_t, AttributeSetNode*> > attrs);
LLVMContext &getContext() { return Context; }
ArrayRef<AttributeWithIndex> getAttributes() const { return AttrList; }
diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp
index 8ec192b813..780da00ac0 100644
--- a/lib/IR/Attributes.cpp
+++ b/lib/IR/Attributes.cpp
@@ -525,6 +525,46 @@ AttributeSetNode *AttributeSetNode::get(LLVMContext &C,
// AttributeSetImpl Definition
//===----------------------------------------------------------------------===//
+AttributeSetImpl::
+AttributeSetImpl(LLVMContext &C,
+ ArrayRef<AttributeWithIndex> attrs)
+ : Context(C), AttrList(attrs.begin(), attrs.end()) {
+ for (unsigned I = 0, E = attrs.size(); I != E; ++I) {
+ const AttributeWithIndex &AWI = attrs[I];
+ uint64_t Mask = AWI.Attrs.Raw();
+ SmallVector<Attribute, 8> Attrs;
+
+ for (Attribute::AttrKind II = Attribute::None;
+ II != Attribute::EndAttrKinds; II = Attribute::AttrKind(II + 1)) {
+ if (uint64_t A = (Mask & AttributeImpl::getAttrMask(II))) {
+ AttrBuilder B;
+
+ if (II == Attribute::Alignment)
+ B.addAlignmentAttr(1ULL << ((A >> 16) - 1));
+ else if (II == Attribute::StackAlignment)
+ B.addStackAlignmentAttr(1ULL << ((A >> 26) - 1));
+ else
+ B.addAttribute(II);
+
+ Attrs.push_back(Attribute::get(C, B));
+ }
+ }
+
+ AttrNodes.push_back(std::make_pair(AWI.Index,
+ AttributeSetNode::get(C, Attrs)));
+ }
+}
+
+AttributeSetImpl::
+AttributeSetImpl(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t, AttributeSetNode*> > attrs)
+ : Context(C), AttrNodes(attrs.begin(), attrs.end()) {
+}
+
+//===----------------------------------------------------------------------===//
+// AttributeSet Method Implementations
+//===----------------------------------------------------------------------===//
+
AttributeSet AttributeSet::getParamAttributes(unsigned Idx) const {
// FIXME: Remove.
return AttrList && hasAttributes(Idx) ?
@@ -616,10 +656,6 @@ AttributeSet AttributeSet::get(LLVMContext &C, ArrayRef<AttributeSet> Attrs) {
return get(C, AttrList);
}
-//===----------------------------------------------------------------------===//
-// AttributeSet Method Implementations
-//===----------------------------------------------------------------------===//
-
const AttributeSet &AttributeSet::operator=(const AttributeSet &RHS) {
AttrList = RHS.AttrList;
return *this;