summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/raw_ostream.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-08-17 01:35:29 +0000
committerChris Lattner <sabre@nondot.org>2008-08-17 01:35:29 +0000
commit84b94f77c6cb713e87614f14ac474beb651eaa13 (patch)
tree24530bb7334c2dbecc5f37c26c5cf8e622c73555 /llvm/lib/Support/raw_ostream.cpp
parent0b79bfe50185a33b545a97b22fd0d6cf6dd8aab0 (diff)
downloadbcm5719-llvm-84b94f77c6cb713e87614f14ac474beb651eaa13.tar.gz
bcm5719-llvm-84b94f77c6cb713e87614f14ac474beb651eaa13.zip
add a new raw_ostream class which is an extremely high performance ostream that
can *only* output data (no seeking, reading, etc). This is adapted from the clang "-E outputter", and is roughly 10% faster than stdio on darwin and 30% (or more) faster than std::ostream. llvm-svn: 54855
Diffstat (limited to 'llvm/lib/Support/raw_ostream.cpp')
-rw-r--r--llvm/lib/Support/raw_ostream.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
new file mode 100644
index 00000000000..ec7ac6d0074
--- /dev/null
+++ b/llvm/lib/Support/raw_ostream.cpp
@@ -0,0 +1,64 @@
+//===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This implements support for bulk buffered stream output.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+
+#if !defined(_MSC_VER)
+#include <fcntl.h>
+#else
+#include <io.h>
+#define open(x,y,z) _open(x,y)
+#define write(fd, start, size) _write(fd, start, size)
+#define close(fd) _close(fd)
+#endif
+
+// An out of line virtual method to provide a home for the class vtable.
+void raw_ostream::handle() {}
+
+//===----------------------------------------------------------------------===//
+// raw_fd_ostream
+//===----------------------------------------------------------------------===//
+
+/// raw_fd_ostream - Open the specified file for writing. If an error occurs,
+/// information about the error is put into ErrorInfo, and the stream should
+/// be immediately destroyed.
+raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo) {
+ FD = open(Filename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (FD < 0) {
+ ErrorInfo = "Error opening output file '" + std::string(Filename) + "'";
+ ShouldClose = false;
+ } else {
+ ShouldClose = true;
+ }
+}
+
+raw_fd_ostream::~raw_fd_ostream() {
+ flush();
+ if (ShouldClose)
+ close(FD);
+}
+
+void raw_fd_ostream::flush_impl() {
+ if (OutBufCur-OutBufStart)
+ write(FD, OutBufStart, OutBufCur-OutBufStart);
+ HandleFlush();
+}
+
+
+raw_stdout_ostream::raw_stdout_ostream():raw_fd_ostream(STDOUT_FILENO, false) {}
+raw_stderr_ostream::raw_stderr_ostream():raw_fd_ostream(STDERR_FILENO, false) {}
+
+// An out of line virtual method to provide a home for the class vtable.
+void raw_stdout_ostream::handle() {}
+void raw_stderr_ostream::handle() {}
OpenPOWER on IntegriCloud