aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-16 22:08:44 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-16 22:08:44 +0000
commitb451a0cdec5a24965d122bb749671db9084b92ee (patch)
treec6d10ac2d0041542c910a4458a981620ee0b273c /lib/Support
parentde75d7ffcd5ed315240cfe0c52a821cf66411eda (diff)
downloadexternal_llvm-b451a0cdec5a24965d122bb749671db9084b92ee.zip
external_llvm-b451a0cdec5a24965d122bb749671db9084b92ee.tar.gz
external_llvm-b451a0cdec5a24965d122bb749671db9084b92ee.tar.bz2
Make raw_ostream::operator<<(const void *) fast; it doesn't matter but
it is easy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67054 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/raw_ostream.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp
index 43f4683..3c24242 100644
--- a/lib/Support/raw_ostream.cpp
+++ b/lib/Support/raw_ostream.cpp
@@ -96,8 +96,24 @@ raw_ostream &raw_ostream::operator<<(long long N) {
}
raw_ostream &raw_ostream::operator<<(const void *P) {
- // FIXME: This could be much faster if it matters.
- return *this << format("%p", P);
+ uintptr_t N = (uintptr_t) P;
+ *this << '0' << 'x';
+
+ // Zero is a special case.
+ if (N == 0)
+ return *this << '0';
+
+ char NumberBuffer[20];
+ char *EndPtr = NumberBuffer+sizeof(NumberBuffer);
+ char *CurPtr = EndPtr;
+
+ while (N) {
+ unsigned x = N % 16;
+ *--CurPtr = (x < 10 ? '0' + x : 'a' + x - 10);
+ N /= 16;
+ }
+
+ return write(CurPtr, EndPtr-CurPtr);
}
raw_ostream &raw_ostream::write(unsigned char C) {
@@ -105,6 +121,7 @@ raw_ostream &raw_ostream::write(unsigned char C) {
flush_impl();
*OutBufCur++ = C;
+ return *this;
}
raw_ostream &raw_ostream::write(const char *Ptr, unsigned Size) {