avoid creating std::strings in MoveToLine


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40424 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/PrintPreprocessedOutput.cpp b/Driver/PrintPreprocessedOutput.cpp
index e5f4491..87180f4 100644
--- a/Driver/PrintPreprocessedOutput.cpp
+++ b/Driver/PrintPreprocessedOutput.cpp
@@ -148,6 +148,21 @@
 };
 }
 
+/// UToStr - Do itoa on the specified number, in-place in the specified buffer.
+/// endptr points to the end of the buffer.
+static char *UToStr(unsigned N, char *EndPtr) {
+  // Null terminate the buffer.
+  *--EndPtr = '\0';
+  if (N == 0)          // Zero is a special case.
+    *--EndPtr = '0';
+  while (N) {
+    *--EndPtr = '0' + char(N % 10);
+    N /= 10;
+  }
+  return EndPtr;
+}
+
+
 /// MoveToLine - Move the output to the source line specified by the location
 /// object.  We can do this by emitting some number of \n's, or be emitting a
 /// #line directive.
@@ -182,8 +197,9 @@
     
     OutputChar('#');
     OutputChar(' ');
-    std::string Num = llvm::utostr_32(LineNo);
-    OutputString(&Num[0], Num.size());
+    char NumberBuffer[20];
+    const char *NumStr = UToStr(LineNo, NumberBuffer+20);
+    OutputString(NumStr, (NumberBuffer+20)-NumStr-1);
     OutputChar(' ');
     OutputChar('"');
     OutputString(&CurFilename[0], CurFilename.size());