mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-05 14:34:55 +00:00
Do not use SmallVector to store MDNode elements.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84784 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a55d33d96e
commit
028fa77d56
@ -110,6 +110,7 @@ class MDNode : public MetadataBase, public FoldingSetNode {
|
||||
// Use CallbackVH to hold MDNOde elements.
|
||||
struct ElementVH : public CallbackVH {
|
||||
MDNode *Parent;
|
||||
ElementVH() {}
|
||||
ElementVH(Value *V, MDNode *P) : CallbackVH(V), Parent(P) {}
|
||||
~ElementVH() {}
|
||||
|
||||
@ -124,7 +125,8 @@ class MDNode : public MetadataBase, public FoldingSetNode {
|
||||
// Replace each instance of F from the element list of this node with T.
|
||||
void replaceElement(Value *F, Value *T);
|
||||
|
||||
SmallVector<ElementVH, 4> Node;
|
||||
ElementVH *Node;
|
||||
unsigned NodeSize;
|
||||
|
||||
protected:
|
||||
explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals);
|
||||
@ -150,19 +152,7 @@ public:
|
||||
}
|
||||
|
||||
/// getNumElements - Return number of MDNode elements.
|
||||
unsigned getNumElements() const {
|
||||
return Node.size();
|
||||
}
|
||||
|
||||
// Element access
|
||||
typedef SmallVectorImpl<ElementVH>::const_iterator const_elem_iterator;
|
||||
typedef SmallVectorImpl<ElementVH>::iterator elem_iterator;
|
||||
/// elem_empty - Return true if MDNode is empty.
|
||||
bool elem_empty() const { return Node.empty(); }
|
||||
const_elem_iterator elem_begin() const { return Node.begin(); }
|
||||
const_elem_iterator elem_end() const { return Node.end(); }
|
||||
elem_iterator elem_begin() { return Node.begin(); }
|
||||
elem_iterator elem_end() { return Node.end(); }
|
||||
unsigned getNumElements() const { return NodeSize; }
|
||||
|
||||
/// Profile - calculate a unique identifier for this MDNode to collapse
|
||||
/// duplicates
|
||||
|
@ -214,10 +214,9 @@ void ValueEnumerator::EnumerateMetadata(const MetadataBase *MD) {
|
||||
MDValues.push_back(std::make_pair(MD, 1U));
|
||||
MDValueMap[MD] = MDValues.size();
|
||||
MDValueID = MDValues.size();
|
||||
for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end();
|
||||
I != E; ++I) {
|
||||
if (*I)
|
||||
EnumerateValue(*I);
|
||||
for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) {
|
||||
if (Value *V = N->getElement(i))
|
||||
EnumerateValue(V);
|
||||
else
|
||||
EnumerateType(Type::getVoidTy(MD->getContext()));
|
||||
}
|
||||
|
@ -818,9 +818,8 @@ void SlotTracker::CreateMetadataSlot(const MDNode *N) {
|
||||
unsigned DestSlot = mdnNext++;
|
||||
mdnMap[N] = DestSlot;
|
||||
|
||||
for (MDNode::const_elem_iterator MDI = N->elem_begin(),
|
||||
MDE = N->elem_end(); MDI != MDE; ++MDI) {
|
||||
const Value *TV = *MDI;
|
||||
for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) {
|
||||
const Value *TV = N->getElement(i);
|
||||
if (TV)
|
||||
if (const MDNode *N2 = dyn_cast<MDNode>(TV))
|
||||
CreateMetadataSlot(N2);
|
||||
@ -906,9 +905,8 @@ static void WriteMDNodes(formatted_raw_ostream &Out, TypePrinting &TypePrinter,
|
||||
Out << '!' << i << " = metadata ";
|
||||
const MDNode *Node = Nodes[i];
|
||||
Out << "!{";
|
||||
for (MDNode::const_elem_iterator NI = Node->elem_begin(),
|
||||
NE = Node->elem_end(); NI != NE;) {
|
||||
const Value *V = *NI;
|
||||
for (unsigned mi = 0, me = Node->getNumElements(); mi != me; ++mi) {
|
||||
const Value *V = Node->getElement(mi);
|
||||
if (!V)
|
||||
Out << "null";
|
||||
else if (const MDNode *N = dyn_cast<MDNode>(V)) {
|
||||
@ -916,11 +914,12 @@ static void WriteMDNodes(formatted_raw_ostream &Out, TypePrinting &TypePrinter,
|
||||
Out << '!' << Machine.getMetadataSlot(N);
|
||||
}
|
||||
else {
|
||||
TypePrinter.print((*NI)->getType(), Out);
|
||||
TypePrinter.print(V->getType(), Out);
|
||||
Out << ' ';
|
||||
WriteAsOperandInternal(Out, *NI, &TypePrinter, &Machine);
|
||||
WriteAsOperandInternal(Out, Node->getElement(mi),
|
||||
&TypePrinter, &Machine);
|
||||
}
|
||||
if (++NI != NE)
|
||||
if (mi + 1 != me)
|
||||
Out << ", ";
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,9 @@ MDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals)
|
||||
: MetadataBase(Type::getMetadataTy(C), Value::MDNodeVal) {
|
||||
NumOperands = 0;
|
||||
resizeOperands(NumVals);
|
||||
NodeSize = NumVals;
|
||||
Node = new ElementVH[NodeSize];
|
||||
ElementVH *Ptr = Node;
|
||||
for (unsigned i = 0; i != NumVals; ++i) {
|
||||
// Only record metadata uses.
|
||||
if (MetadataBase *MB = dyn_cast_or_null<MetadataBase>(Vals[i]))
|
||||
@ -74,13 +77,13 @@ MDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals)
|
||||
else if(Vals[i] &&
|
||||
Vals[i]->getType()->getTypeID() == Type::MetadataTyID)
|
||||
OperandList[NumOperands++] = Vals[i];
|
||||
Node.push_back(ElementVH(Vals[i], this));
|
||||
*Ptr++ = ElementVH(Vals[i], this);
|
||||
}
|
||||
}
|
||||
|
||||
void MDNode::Profile(FoldingSetNodeID &ID) const {
|
||||
for (const_elem_iterator I = elem_begin(), E = elem_end(); I != E; ++I)
|
||||
ID.AddPointer(*I);
|
||||
for (unsigned i = 0, e = getNumElements(); i != e; ++i)
|
||||
ID.AddPointer(getElement(i));
|
||||
}
|
||||
|
||||
MDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) {
|
||||
@ -109,7 +112,8 @@ MDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) {
|
||||
/// dropAllReferences - Remove all uses and clear node vector.
|
||||
void MDNode::dropAllReferences() {
|
||||
User::dropAllReferences();
|
||||
Node.clear();
|
||||
delete [] Node;
|
||||
Node = NULL;
|
||||
}
|
||||
|
||||
MDNode::~MDNode() {
|
||||
@ -132,9 +136,8 @@ void MDNode::replaceElement(Value *From, Value *To) {
|
||||
// From in this MDNode's element list.
|
||||
SmallVector<unsigned, 4> Indexes;
|
||||
unsigned Index = 0;
|
||||
for (SmallVector<ElementVH, 4>::iterator I = Node.begin(),
|
||||
E = Node.end(); I != E; ++I, ++Index) {
|
||||
Value *V = *I;
|
||||
for (unsigned i = 0, e = getNumElements(); i != e; ++i, ++Index) {
|
||||
Value *V = getElement(i);
|
||||
if (V && V == From)
|
||||
Indexes.push_back(Index);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user