[llvm] r173722 - Remove the AttributeWithIndex class.
Bill Wendling
isanbard at gmail.com
Mon Jan 28 13:55:20 PST 2013
Author: void
Date: Mon Jan 28 15:55:20 2013
New Revision: 173722
URL: http://llvm.org/viewvc/llvm-project?rev=173722&view=rev
Log:
Remove the AttributeWithIndex class.
The AttributeWithIndex class exposed the interior structure of the AttributeSet
class. That was gross. Remove it and all of the code that relied upon it.
Modified:
llvm/trunk/include/llvm/IR/Attributes.h
llvm/trunk/lib/IR/AttributeImpl.h
llvm/trunk/lib/IR/Attributes.cpp
Modified: llvm/trunk/include/llvm/IR/Attributes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Attributes.h?rev=173722&r1=173721&r2=173722&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Attributes.h (original)
+++ llvm/trunk/include/llvm/IR/Attributes.h Mon Jan 28 15:55:20 2013
@@ -177,22 +177,7 @@ template<> struct DenseMapInfo<Attribute
class AttrBuilder;
class AttributeSetImpl;
-
-//===----------------------------------------------------------------------===//
-/// \class
-/// \brief This is just a pair of values to associate a set of attributes with
-/// an index.
-struct AttributeWithIndex {
- Attribute Attrs; ///< The attributes that are set, or'd together.
- unsigned Index; ///< Index of the parameter for which the attributes apply.
-
- static AttributeWithIndex get(unsigned Idx, Attribute Attrs) {
- AttributeWithIndex P;
- P.Index = Idx;
- P.Attrs = Attrs;
- return P;
- }
-};
+class AttributeSetNode;
//===----------------------------------------------------------------------===//
/// \class
@@ -216,9 +201,17 @@ private:
/// for the result are denoted with Idx = 0.
Attribute getAttributes(unsigned Idx) const;
- /// \brief Create an AttributeSet from the AttributeWithIndex structures.
- /// N.B. this is only temporary. It will be disappearing in the future.
- static AttributeSet get(LLVMContext &C, ArrayRef<AttributeWithIndex> Attrs);
+ /// \brief Create an AttributeSet with the specified parameters in it.
+ static AttributeSet get(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t, Attribute> > Attrs);
+ static AttributeSet get(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t,
+ AttributeSetNode*> > Attrs);
+
+ static AttributeSet getImpl(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t,
+ AttributeSetNode*> > Attrs);
+
explicit AttributeSet(AttributeSetImpl *LI) : pImpl(LI) {}
public:
Modified: llvm/trunk/lib/IR/AttributeImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AttributeImpl.h?rev=173722&r1=173721&r2=173722&view=diff
==============================================================================
--- llvm/trunk/lib/IR/AttributeImpl.h (original)
+++ llvm/trunk/lib/IR/AttributeImpl.h Mon Jan 28 15:55:20 2013
@@ -115,7 +115,6 @@ class AttributeSetImpl : public FoldingS
friend class AttributeSet;
LLVMContext &Context;
- SmallVector<AttributeWithIndex, 4> AttrList;
typedef std::pair<uint64_t, AttributeSetNode*> IndexAttrPair;
SmallVector<IndexAttrPair, 4> AttrNodes;
@@ -124,13 +123,13 @@ class AttributeSetImpl : public FoldingS
void operator=(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
AttributeSetImpl(const AttributeSetImpl &) LLVM_DELETED_FUNCTION;
public:
- AttributeSetImpl(LLVMContext &C, ArrayRef<AttributeWithIndex> attrs);
+ AttributeSetImpl(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t, AttributeSetNode*> > attrs)
+ : Context(C), AttrNodes(attrs.begin(), attrs.end()) {}
/// \brief Get the context that created this AttributeSetImpl.
LLVMContext &getContext() { return Context; }
- ArrayRef<AttributeWithIndex> getAttributes() const { return AttrList; }
-
/// \brief Return the number of attributes this AttributeSet contains.
unsigned getNumAttributes() const { return AttrNodes.size(); }
@@ -147,7 +146,7 @@ public:
/// parameter/ function which the attributes apply to.
AttributeSet getSlotAttributes(unsigned Slot) const {
// FIXME: This needs to use AttrNodes instead.
- return AttributeSet::get(Context, AttrList[Slot]);
+ return AttributeSet::get(Context, AttrNodes[Slot]);
}
typedef AttributeSetNode::iterator iterator;
@@ -164,17 +163,9 @@ public:
{ return AttrNodes[Idx].second->end(); }
void Profile(FoldingSetNodeID &ID) const {
- Profile(ID, AttrList);
+ Profile(ID, AttrNodes);
}
static void Profile(FoldingSetNodeID &ID,
- ArrayRef<AttributeWithIndex> AttrList) {
- for (unsigned i = 0, e = AttrList.size(); i != e; ++i) {
- ID.AddInteger(AttrList[i].Index);
- ID.AddInteger(AttrList[i].Attrs.Raw());
- }
- }
-
- static void Profile(FoldingSetNodeID &ID,
ArrayRef<std::pair<uint64_t, AttributeSetNode*> > Nodes) {
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
ID.AddInteger(Nodes[i].first);
Modified: llvm/trunk/lib/IR/Attributes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Attributes.cpp?rev=173722&r1=173721&r2=173722&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Attributes.cpp (original)
+++ llvm/trunk/lib/IR/Attributes.cpp Mon Jan 28 15:55:20 2013
@@ -1,4 +1,4 @@
-//===-- Attribute.cpp - Implement AttributesList -------------------------===//
+//===-- Attributes.cpp - Implement AttributesList -------------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,7 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements the Attribute, AttributeImpl, AttrBuilder,
+// \file
+// \brief This file implements the Attribute, AttributeImpl, AttrBuilder,
// AttributeSetImpl, and AttributeSet classes.
//
//===----------------------------------------------------------------------===//
@@ -540,44 +541,6 @@ AttributeSetNode *AttributeSetNode::get(
// 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)));
- }
-
- assert(AttrNodes.size() == AttrList.size() &&
- "Number of attributes is different between lists!");
-#ifndef NDEBUG
- for (unsigned I = 0, E = AttrNodes.size(); I != E; ++I)
- assert((I == 0 || AttrNodes[I - 1].first < AttrNodes[I].first) &&
- "Attributes not in ascending order!");
-#endif
-}
-
uint64_t AttributeSetImpl::Raw(uint64_t Index) const {
for (unsigned I = 0, E = getNumAttributes(); I != E; ++I) {
if (getSlotIndex(I) != Index) continue;
@@ -587,9 +550,6 @@ uint64_t AttributeSetImpl::Raw(uint64_t
for (AttributeSetNode::const_iterator II = ASN->begin(),
IE = ASN->end(); II != IE; ++II)
B.addAttributes(*II);
-
- assert(B.Raw() == AttrList[I].Attrs.Raw() &&
- "Attributes aren't the same!");
return B.Raw();
}
@@ -604,7 +564,8 @@ AttributeSet AttributeSet::getParamAttri
// FIXME: Remove.
return pImpl && hasAttributes(Idx) ?
AttributeSet::get(pImpl->getContext(),
- AttributeWithIndex::get(Idx, getAttributes(Idx))) :
+ ArrayRef<std::pair<uint64_t, Attribute> >(
+ std::make_pair(Idx, getAttributes(Idx)))) :
AttributeSet();
}
@@ -612,8 +573,9 @@ AttributeSet AttributeSet::getRetAttribu
// FIXME: Remove.
return pImpl && hasAttributes(ReturnIndex) ?
AttributeSet::get(pImpl->getContext(),
- AttributeWithIndex::get(ReturnIndex,
- getAttributes(ReturnIndex))) :
+ ArrayRef<std::pair<uint64_t, Attribute> >(
+ std::make_pair(ReturnIndex,
+ getAttributes(ReturnIndex)))) :
AttributeSet();
}
@@ -621,27 +583,15 @@ AttributeSet AttributeSet::getFnAttribut
// FIXME: Remove.
return pImpl && hasAttributes(FunctionIndex) ?
AttributeSet::get(pImpl->getContext(),
- AttributeWithIndex::get(FunctionIndex,
- getAttributes(FunctionIndex))) :
+ ArrayRef<std::pair<uint64_t, Attribute> >(
+ std::make_pair(FunctionIndex,
+ getAttributes(FunctionIndex)))) :
AttributeSet();
}
-AttributeSet AttributeSet::get(LLVMContext &C,
- ArrayRef<AttributeWithIndex> Attrs) {
- // If there are no attributes then return a null AttributesList pointer.
- if (Attrs.empty())
- return AttributeSet();
-
-#ifndef NDEBUG
- for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
- assert(Attrs[i].Attrs.hasAttributes() &&
- "Pointless attribute!");
- assert((!i || Attrs[i-1].Index < Attrs[i].Index) &&
- "Misordered AttributesList!");
- }
-#endif
-
- // Otherwise, build a key to look up the existing attributes.
+AttributeSet AttributeSet::getImpl(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t,
+ AttributeSetNode*> > Attrs) {
LLVMContextImpl *pImpl = C.pImpl;
FoldingSetNodeID ID;
AttributeSetImpl::Profile(ID, Attrs);
@@ -660,35 +610,75 @@ AttributeSet AttributeSet::get(LLVMConte
return AttributeSet(PA);
}
+AttributeSet AttributeSet::get(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t, Attribute> > Attrs){
+ // If there are no attributes then return a null AttributesList pointer.
+ if (Attrs.empty())
+ return AttributeSet();
+
+#ifndef NDEBUG
+ for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
+ assert((!i || Attrs[i-1].first <= Attrs[i].first) &&
+ "Misordered Attributes list!");
+ assert(Attrs[i].second.hasAttributes() &&
+ "Pointless attribute!");
+ }
+#endif
+
+ // Create a vector if (uint64_t, AttributeSetNode*) pairs from the attributes
+ // list.
+ SmallVector<std::pair<uint64_t, AttributeSetNode*>, 8> AttrPairVec;
+ for (ArrayRef<std::pair<uint64_t, Attribute> >::iterator I = Attrs.begin(),
+ E = Attrs.end(); I != E; ) {
+ uint64_t Index = I->first;
+ SmallVector<Attribute, 4> AttrVec;
+ while (I->first == Index && I != E) {
+ AttrVec.push_back(I->second);
+ ++I;
+ }
+
+ AttrPairVec.push_back(std::make_pair(Index,
+ AttributeSetNode::get(C, AttrVec)));
+ }
+
+ return getImpl(C, AttrPairVec);
+}
+
+AttributeSet AttributeSet::get(LLVMContext &C,
+ ArrayRef<std::pair<uint64_t,
+ AttributeSetNode*> > Attrs) {
+ // If there are no attributes then return a null AttributesList pointer.
+ if (Attrs.empty())
+ return AttributeSet();
+
+ return getImpl(C, Attrs);
+}
+
AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) {
- // FIXME: This should be implemented as a loop that creates the
- // AttributeWithIndexes that then are used to create the AttributeSet.
if (!B.hasAttributes())
return AttributeSet();
- return get(C, AttributeWithIndex::get(Idx, Attribute::get(C, B)));
+ return get(C, ArrayRef<std::pair<uint64_t, Attribute> >(
+ std::make_pair(Idx, Attribute::get(C, B))));
}
AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx,
ArrayRef<Attribute::AttrKind> Kind) {
- // FIXME: This is temporary. Ultimately, the AttributeWithIndex will be
- // replaced by an object that holds multiple Attribute::AttrKinds.
- AttrBuilder B;
+ SmallVector<std::pair<uint64_t, Attribute>, 8> Attrs;
for (ArrayRef<Attribute::AttrKind>::iterator I = Kind.begin(),
E = Kind.end(); I != E; ++I)
- B.addAttribute(*I);
- return get(C, Idx, B);
+ Attrs.push_back(std::make_pair(Idx, Attribute::get(C, *I)));
+ return get(C, Attrs);
}
AttributeSet AttributeSet::get(LLVMContext &C, ArrayRef<AttributeSet> Attrs) {
- SmallVector<AttributeWithIndex, 8> AttrList;
- for (ArrayRef<AttributeSet>::iterator I = Attrs.begin(), E = Attrs.end();
- I != E; ++I) {
- AttributeSet AS = *I;
+ SmallVector<std::pair<uint64_t, AttributeSetNode*>, 8> AttrNodeVec;
+ for (unsigned I = 0, E = Attrs.size(); I != E; ++I) {
+ AttributeSet AS = Attrs[I];
if (!AS.pImpl) continue;
- AttrList.append(AS.pImpl->AttrList.begin(), AS.pImpl->AttrList.end());
+ AttrNodeVec.append(AS.pImpl->AttrNodes.begin(), AS.pImpl->AttrNodes.end());
}
- return get(C, AttrList);
+ return get(C, AttrNodeVec);
}
/// \brief Return the number of slots used in this attribute list. This is the
More information about the llvm-commits
mailing list