[llvm-commits] [llvm] r52995 - in /llvm/trunk: include/llvm/ADT/FoldingSet.h lib/Support/FoldingSet.cpp
Owen Anderson
resistor at mac.com
Tue Jul 1 16:49:59 PDT 2008
Author: resistor
Date: Tue Jul 1 18:49:59 2008
New Revision: 52995
URL: http://llvm.org/viewvc/llvm-project?rev=52995&view=rev
Log:
Add a version of AddString that takes a const char* so we can avoid extraneous
conversions to std::string.
Modified:
llvm/trunk/include/llvm/ADT/FoldingSet.h
llvm/trunk/lib/Support/FoldingSet.cpp
Modified: llvm/trunk/include/llvm/ADT/FoldingSet.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/FoldingSet.h?rev=52995&r1=52994&r2=52995&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/FoldingSet.h (original)
+++ llvm/trunk/include/llvm/ADT/FoldingSet.h Tue Jul 1 18:49:59 2008
@@ -220,6 +220,7 @@
void AddFloat(float F);
void AddDouble(double D);
void AddString(const std::string &String);
+ void AddString(const char* String);
template <typename T>
inline void Add(const T& x) { FoldingSetTrait<T>::Profile(x, *this); }
Modified: llvm/trunk/lib/Support/FoldingSet.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FoldingSet.cpp?rev=52995&r1=52994&r2=52995&view=diff
==============================================================================
--- llvm/trunk/lib/Support/FoldingSet.cpp (original)
+++ llvm/trunk/lib/Support/FoldingSet.cpp Tue Jul 1 18:49:59 2008
@@ -57,6 +57,44 @@
void FoldingSetNodeID::AddDouble(double D) {
AddInteger(DoubleToBits(D));
}
+
+void FoldingSetNodeID::AddString(const char *String) {
+ unsigned Size = static_cast<unsigned>(strlen(String));
+ Bits.push_back(Size);
+ if (!Size) return;
+
+ unsigned Units = Size / 4;
+ unsigned Pos = 0;
+ const unsigned *Base = (const unsigned *)String;
+
+ // If the string is aligned do a bulk transfer.
+ if (!((intptr_t)Base & 3)) {
+ Bits.append(Base, Base + Units);
+ Pos = (Units + 1) * 4;
+ } else {
+ // Otherwise do it the hard way.
+ for ( Pos += 4; Pos <= Size; Pos += 4) {
+ unsigned V = ((unsigned char)String[Pos - 4] << 24) |
+ ((unsigned char)String[Pos - 3] << 16) |
+ ((unsigned char)String[Pos - 2] << 8) |
+ (unsigned char)String[Pos - 1];
+ Bits.push_back(V);
+ }
+ }
+
+ // With the leftover bits.
+ unsigned V = 0;
+ // Pos will have overshot size by 4 - #bytes left over.
+ switch (Pos - Size) {
+ case 1: V = (V << 8) | (unsigned char)String[Size - 3]; // Fall thru.
+ case 2: V = (V << 8) | (unsigned char)String[Size - 2]; // Fall thru.
+ case 3: V = (V << 8) | (unsigned char)String[Size - 1]; break;
+ default: return; // Nothing left.
+ }
+
+ Bits.push_back(V);
+}
+
void FoldingSetNodeID::AddString(const std::string &String) {
unsigned Size = static_cast<unsigned>(String.size());
Bits.push_back(Size);
More information about the llvm-commits
mailing list