aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/DSGraph.h18
-rw-r--r--include/llvm/Analysis/DataStructure/DSGraph.h18
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp8
-rw-r--r--lib/Analysis/DataStructure/Local.cpp1
-rw-r--r--lib/Analysis/DataStructure/Printer.cpp6
5 files changed, 41 insertions, 10 deletions
diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h
index fb2f28bc1a..efb82bc10f 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<const Type *, unsigned> 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<TypeRec> 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 fb2f28bc1a..efb82bc10f 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<const Type *, unsigned> 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<TypeRec> 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 2313cd09e8..e7e40108c6 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 43fd5a4a54..b27652379e 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 8b29c1c6c0..7539aac102 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";
}