diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-01-27 12:50:02 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-01-27 12:50:02 +0000 |
commit | 6a325cc46db9cb0c631ac832474e5df039d04b19 (patch) | |
tree | c25737e3c3773a3fd3c05edfeb99fa17eb38ea35 /lib/IR | |
parent | 2044adfb2ac7435ed3a1a66d48eb49887769745d (diff) | |
download | external_llvm-6a325cc46db9cb0c631ac832474e5df039d04b19.zip external_llvm-6a325cc46db9cb0c631ac832474e5df039d04b19.tar.gz external_llvm-6a325cc46db9cb0c631ac832474e5df039d04b19.tar.bz2 |
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
Diffstat (limited to 'lib/IR')
-rw-r--r-- | lib/IR/AttributeImpl.h | 6 | ||||
-rw-r--r-- | lib/IR/Attributes.cpp | 44 |
2 files changed, 42 insertions, 8 deletions
diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h index d7ebec5..b4c788f 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 8ec192b..780da00 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; |