mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
Create a new class: AttributeSetNode.
This is a helper class for the AttributeSetImpl class. It holds a set of attributes that apply to a single element: function, return type, or parameter. These are uniqued. llvm-svn: 173310
This commit is contained in:
parent
de48b99148
commit
1898f7c8a5
@ -18,6 +18,7 @@
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
@ -129,6 +130,10 @@ public:
|
||||
bool operator==(AttrKind K) const;
|
||||
bool operator!=(AttrKind K) const;
|
||||
|
||||
bool operator<(Attribute A) const;
|
||||
|
||||
void Profile(FoldingSetNodeID &ID) const;
|
||||
|
||||
// FIXME: Remove these 'operator' methods.
|
||||
bool operator==(const Attribute &A) const {
|
||||
return pImpl == A.pImpl;
|
||||
|
@ -56,6 +56,8 @@ public:
|
||||
bool operator==(StringRef Kind) const;
|
||||
bool operator!=(StringRef Kind) const;
|
||||
|
||||
bool operator<(const AttributeImpl &AI) const;
|
||||
|
||||
uint64_t Raw() const; // FIXME: Remove.
|
||||
|
||||
static uint64_t getAttrMask(Attribute::AttrKind Val);
|
||||
@ -69,7 +71,38 @@ public:
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \class
|
||||
/// \brief This class represents a set of attributes.
|
||||
/// \brief This class represents a group of attributes that apply to one
|
||||
/// element: function, return type, or parameter.
|
||||
class AttributeSetNode : public FoldingSetNode {
|
||||
SmallVector<Attribute, 4> AttrList;
|
||||
|
||||
AttributeSetNode(ArrayRef<Attribute> Attrs)
|
||||
: AttrList(Attrs.begin(), Attrs.end()) {}
|
||||
public:
|
||||
static AttributeSetNode *get(LLVMContext &C, ArrayRef<Attribute> Attrs);
|
||||
|
||||
typedef SmallVectorImpl<Attribute>::iterator iterator;
|
||||
typedef SmallVectorImpl<Attribute>::const_iterator const_iterator;
|
||||
|
||||
iterator begin() { return AttrList.begin(); }
|
||||
iterator end() { return AttrList.end(); }
|
||||
|
||||
const_iterator begin() const { return AttrList.begin(); }
|
||||
const_iterator end() const { return AttrList.end(); }
|
||||
|
||||
void Profile(FoldingSetNodeID &ID) const {
|
||||
Profile(ID, AttrList);
|
||||
}
|
||||
static void Profile(FoldingSetNodeID &ID, ArrayRef<Attribute> AttrList) {
|
||||
for (unsigned I = 0, E = AttrList.size(); I != E; ++I)
|
||||
AttrList[I].Profile(ID);
|
||||
}
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \class
|
||||
/// \brief This class represents a set of attributes that apply to the function,
|
||||
/// return type, and parameters.
|
||||
class AttributeSetImpl : public FoldingSetNode {
|
||||
LLVMContext &Context;
|
||||
SmallVector<AttributeWithIndex, 4> AttrList;
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include "llvm/Support/Mutex.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -91,6 +92,18 @@ bool Attribute::operator!=(AttrKind K) const {
|
||||
return !(*this == K);
|
||||
}
|
||||
|
||||
bool Attribute::operator<(Attribute A) const {
|
||||
if (!pImpl && !A.pImpl) return false;
|
||||
if (!pImpl) return true;
|
||||
if (!A.pImpl) return false;
|
||||
return *pImpl < *A.pImpl;
|
||||
}
|
||||
|
||||
|
||||
void Attribute::Profile(FoldingSetNodeID &ID) const {
|
||||
ID.AddPointer(pImpl);
|
||||
}
|
||||
|
||||
uint64_t Attribute::Raw() const {
|
||||
return pImpl ? pImpl->Raw() : 0;
|
||||
}
|
||||
@ -431,10 +444,34 @@ bool AttributeImpl::operator==(StringRef Kind) const {
|
||||
return CDA->getAsString() == Kind;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AttributeImpl::operator!=(StringRef Kind) const {
|
||||
return !(*this == Kind);
|
||||
}
|
||||
|
||||
bool AttributeImpl::operator<(const AttributeImpl &AI) const {
|
||||
if (!Data && !AI.Data) return false;
|
||||
if (!Data && AI.Data) return true;
|
||||
if (Data && !AI.Data) return false;
|
||||
|
||||
ConstantInt *ThisCI = dyn_cast<ConstantInt>(Data);
|
||||
ConstantInt *ThatCI = dyn_cast<ConstantInt>(AI.Data);
|
||||
|
||||
ConstantDataArray *ThisCDA = dyn_cast<ConstantDataArray>(Data);
|
||||
ConstantDataArray *ThatCDA = dyn_cast<ConstantDataArray>(AI.Data);
|
||||
|
||||
if (ThisCI && ThatCI)
|
||||
return ThisCI->getZExtValue() < ThatCI->getZExtValue();
|
||||
|
||||
if (ThisCI && ThatCDA)
|
||||
return true;
|
||||
|
||||
if (ThisCDA && ThatCI)
|
||||
return false;
|
||||
|
||||
return ThisCDA->getAsString() < ThatCDA->getAsString();
|
||||
}
|
||||
|
||||
uint64_t AttributeImpl::Raw() const {
|
||||
// FIXME: Remove this.
|
||||
return cast<ConstantInt>(Data)->getZExtValue();
|
||||
@ -522,6 +559,41 @@ AttributeWithIndex AttributeWithIndex::get(LLVMContext &C, unsigned Idx,
|
||||
return get(Idx, Attribute::get(C, B));
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AttributeSetNode Definition
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
AttributeSetNode *AttributeSetNode::get(LLVMContext &C,
|
||||
ArrayRef<Attribute> Attrs) {
|
||||
if (Attrs.empty())
|
||||
return 0;
|
||||
|
||||
// Otherwise, build a key to look up the existing attributes.
|
||||
LLVMContextImpl *pImpl = C.pImpl;
|
||||
FoldingSetNodeID ID;
|
||||
|
||||
SmallVector<Attribute, 8> SortedAttrs(Attrs.begin(), Attrs.end());
|
||||
std::sort(SortedAttrs.begin(), SortedAttrs.end());
|
||||
|
||||
for (SmallVectorImpl<Attribute>::iterator I = SortedAttrs.begin(),
|
||||
E = SortedAttrs.end(); I != E; ++I)
|
||||
I->Profile(ID);
|
||||
|
||||
void *InsertPoint;
|
||||
AttributeSetNode *PA =
|
||||
pImpl->AttrsSetNodes.FindNodeOrInsertPos(ID, InsertPoint);
|
||||
|
||||
// If we didn't find any existing attributes of the same shape then create a
|
||||
// new one and insert it.
|
||||
if (!PA) {
|
||||
PA = new AttributeSetNode(SortedAttrs);
|
||||
pImpl->AttrsSetNodes.InsertNode(PA, InsertPoint);
|
||||
}
|
||||
|
||||
// Return the AttributesListNode that we found or created.
|
||||
return PA;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AttributeSetImpl Definition
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -249,6 +249,7 @@ public:
|
||||
|
||||
FoldingSet<AttributeImpl> AttrsSet;
|
||||
FoldingSet<AttributeSetImpl> AttrsLists;
|
||||
FoldingSet<AttributeSetNode> AttrsSetNodes;
|
||||
|
||||
StringMap<Value*> MDStringCache;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user