summaryrefslogtreecommitdiff
path: root/include/llvm
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-11 17:24:50 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-11 17:24:50 +0000
commit1f801fa5ada9cb40fb97ae755c282e91af54a1bc (patch)
tree892502fb68fc883c8ed89d9185f8cd586e8ef8a9 /include/llvm
parent04feb51886805046e8b1af10b7d21bc1ef85f457 (diff)
downloadllvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.gz
llvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.bz2
llvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.xz
Added "Profile" method to APFloat for use with FoldingSet.
Added member template "Add" to FoldingSetNodeID that allows "adding" arbitrary objects to a profile via dispatch to FoldingSetTrait<T>::Profile(). Removed FoldingSetNodeID::AddAPFloat and FoldingSetNodeID::APInt, as their functionality is now replaced using the above mentioned member template. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46957 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm')
-rw-r--r--include/llvm/ADT/APFloat.h4
-rw-r--r--include/llvm/ADT/FoldingSet.h31
-rw-r--r--include/llvm/Support/AlignOf.h4
3 files changed, 24 insertions, 15 deletions
diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h
index 9e3e484943..73d1e0244c 100644
--- a/include/llvm/ADT/APFloat.h
+++ b/include/llvm/ADT/APFloat.h
@@ -181,6 +181,10 @@ namespace llvm {
APFloat(const APFloat &);
~APFloat();
+ /// Profile - Used to insert APFloat objects, or objects that contain
+ /// APFloat objects, into FoldingSets.
+ void Profile(FoldingSetNodeID& NID) const;
+
/// @brief Used by the Bitcode serializer to emit APInts to Bitcode.
void Emit(Serializer& S) const;
diff --git a/include/llvm/ADT/FoldingSet.h b/include/llvm/ADT/FoldingSet.h
index ac7f428b3e..0efe78d7bd 100644
--- a/include/llvm/ADT/FoldingSet.h
+++ b/include/llvm/ADT/FoldingSet.h
@@ -178,6 +178,19 @@ protected:
virtual void GetNodeProfile(FoldingSetNodeID &ID, Node *N) const = 0;
};
+//===----------------------------------------------------------------------===//
+/// FoldingSetTrait - This trait class is used to define behavior of how
+/// to "profile" (in the FoldingSet parlance) an object of a given type.
+/// The default behavior is to invoke a 'Profile' method on an object, but
+/// through template specialization the behavior can be tailored for specific
+/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects
+/// to FoldingSets that were not originally designed to have that behavior.
+///
+template<typename T> struct FoldingSetTrait {
+ static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);}
+ static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); }
+};
+
//===--------------------------------------------------------------------===//
/// FoldingSetNodeID - This class is used to gather all the unique data bits of
/// a node. When all the bits are gathered this class is used to produce a
@@ -206,10 +219,11 @@ public:
void AddInteger(uint64_t I);
void AddFloat(float F);
void AddDouble(double D);
- void AddAPFloat(const APFloat& apf);
- void AddAPInt(const APInt& api);
void AddString(const std::string &String);
+ template <typename T>
+ inline void Add(const T& x) { FoldingSetTrait<T>::Profile(x, *this); }
+
/// clear - Clear the accumulated profile, allowing this FoldingSetNodeID
/// object to be used to compute a new profile.
inline void clear() { Bits.clear(); }
@@ -227,19 +241,6 @@ public:
typedef FoldingSetImpl::Node FoldingSetNode;
template<class T> class FoldingSetIterator;
template<class T> class FoldingSetBucketIterator;
-
-//===----------------------------------------------------------------------===//
-/// FoldingSetTrait - This trait class is used to define behavior of how
-/// to "profile" (in the FoldingSet parlance) an object of a given type.
-/// The default behavior is to invoke a 'Profile' method on an object, but
-/// through template specialization the behavior can be tailored for specific
-/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects
-/// to FoldingSets that were not originally designed to have that behavior.
-///
-template<typename T> struct FoldingSetTrait {
- static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);}
- static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); }
-};
//===----------------------------------------------------------------------===//
/// FoldingSet - This template class is used to instantiate a specialized
diff --git a/include/llvm/Support/AlignOf.h b/include/llvm/Support/AlignOf.h
index 26592b9ef6..a6d3f25c26 100644
--- a/include/llvm/Support/AlignOf.h
+++ b/include/llvm/Support/AlignOf.h
@@ -35,6 +35,10 @@ private:
template <typename T>
struct AlignOf {
enum { Alignment = sizeof(AlignmentCalcImpl<T>) - sizeof(T) };
+ enum { Alignment_GreaterEqual_2Bytes = Alignment >= 2 ? 1 : 0 };
+ enum { Alignment_GreaterEqual_4Bytes = Alignment >= 4 ? 1 : 0 };
+ enum { Alignment_GreaterEqual_8Bytes = Alignment >= 8 ? 1 : 0 };
+ enum { Alignment_GreaterEqual_16Bytes = Alignment >= 16 ? 1 : 0 };
};
/// alignof - A templated function that returns the mininum alignment of