From a3f8586d9dcc8e75358cc7bef2eedbd560904bc9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 18 Oct 2002 18:22:46 +0000 Subject: [PATCH] Convert typerec to be a structure instead of a pair git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4226 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/DSGraph.h | 18 +++++++++++++++++- include/llvm/Analysis/DataStructure/DSGraph.h | 18 +++++++++++++++++- lib/Analysis/DataStructure/DataStructure.cpp | 8 ++++---- lib/Analysis/DataStructure/Local.cpp | 1 - lib/Analysis/DataStructure/Printer.cpp | 6 +++--- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h index fb2f28bc1a0..efb82bc10f5 100644 --- a/include/llvm/Analysis/DSGraph.h +++ b/include/llvm/Analysis/DSGraph.h @@ -120,7 +120,23 @@ class DSNode { /// different types can be represented by this single DSNode. This vector is /// kept sorted. /// - typedef std::pair TypeRec; + struct TypeRec { + const Type *Ty; + unsigned Offset; + + TypeRec() : Ty(0), Offset(0) {} + TypeRec(const Type *T, unsigned O) : Ty(T), Offset(O) {} + + bool operator<(const TypeRec &TR) const { + // Sort first by offset! + return Offset < TR.Offset || (Offset == TR.Offset && Ty < TR.Ty); + } + bool operator==(const TypeRec &TR) const { + return Ty == TR.Ty && Offset == TR.Offset; + } + bool operator!=(const TypeRec &TR) const { return !operator==(TR); } + }; + std::vector TypeEntries; /// Globals - The list of global values that are merged into this node. diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h index fb2f28bc1a0..efb82bc10f5 100644 --- a/include/llvm/Analysis/DataStructure/DSGraph.h +++ b/include/llvm/Analysis/DataStructure/DSGraph.h @@ -120,7 +120,23 @@ class DSNode { /// different types can be represented by this single DSNode. This vector is /// kept sorted. /// - typedef std::pair TypeRec; + struct TypeRec { + const Type *Ty; + unsigned Offset; + + TypeRec() : Ty(0), Offset(0) {} + TypeRec(const Type *T, unsigned O) : Ty(T), Offset(O) {} + + bool operator<(const TypeRec &TR) const { + // Sort first by offset! + return Offset < TR.Offset || (Offset == TR.Offset && Ty < TR.Ty); + } + bool operator==(const TypeRec &TR) const { + return Ty == TR.Ty && Offset == TR.Offset; + } + bool operator!=(const TypeRec &TR) const { return !operator==(TR); } + }; + std::vector TypeEntries; /// Globals - The list of global values that are merged into this node. diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index 2313cd09e87..e7e40108c60 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -61,7 +61,7 @@ DSNode::DSNode(enum NodeTy NT, const Type *T) : NodeType(NT) { } } - TypeEntries.push_back(std::make_pair(T, 0)); + TypeEntries.push_back(TypeRec(T, 0)); } // DSNode copy constructor... do not copy over the referrers list! @@ -323,9 +323,9 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) { // If this merging into node has more than just void nodes in it, merge! assert(!N->TypeEntries.empty() && "TypeEntries is empty for a node?"); - if (N->TypeEntries.size() != 1 || N->TypeEntries[0].first != Type::VoidTy) { + if (N->TypeEntries.size() != 1 || N->TypeEntries[0].Ty != Type::VoidTy) { // If the current node just has a Void entry in it, remove it. - if (TypeEntries.size() == 1 && TypeEntries[0].first == Type::VoidTy) + if (TypeEntries.size() == 1 && TypeEntries[0].Ty == Type::VoidTy) TypeEntries.clear(); // Adjust all of the type entries we are merging in by the offset... and add @@ -334,7 +334,7 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) { if (NOffset != 0) { // This case is common enough to optimize for // Offset all of the TypeEntries in N with their new offset for (unsigned i = 0, e = N->TypeEntries.size(); i != e; ++i) - N->TypeEntries[i].second += NOffset; + N->TypeEntries[i].Offset += NOffset; } MergeSortedVectors(TypeEntries, N->TypeEntries); diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index 43fd5a4a544..b27652379ef 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -413,4 +413,3 @@ bool LocalDataStructures::run(Module &M) { DSInfo.insert(std::make_pair(I, new DSGraph(*I))); return false; } - diff --git a/lib/Analysis/DataStructure/Printer.cpp b/lib/Analysis/DataStructure/Printer.cpp index 8b29c1c6c0b..7539aac1025 100644 --- a/lib/Analysis/DataStructure/Printer.cpp +++ b/lib/Analysis/DataStructure/Printer.cpp @@ -28,9 +28,9 @@ static string getCaption(const DSNode *N, const DSGraph *G) { Module *M = G && &G->getFunction() ? G->getFunction().getParent() : 0; for (unsigned i = 0, e = N->getTypeEntries().size(); i != e; ++i) { - WriteTypeSymbolic(OS, N->getTypeEntries()[i].first, M); - if (N->getTypeEntries()[i].second) - OS << "@" << N->getTypeEntries()[i].second; + WriteTypeSymbolic(OS, N->getTypeEntries()[i].Ty, M); + if (N->getTypeEntries()[i].Offset) + OS << "@" << N->getTypeEntries()[i].Offset; OS << "\n"; }