summaryrefslogtreecommitdiff
path: root/lib/Support
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
commit60d396262460f0613175e52c00be5e8bfb89d8fb (patch)
treeb09a27364396b43a1bd0066f173f007dab70b7ca /lib/Support
parentafc20ae0e538a731f379dc1ae9ac564023078978 (diff)
downloadllvm-60d396262460f0613175e52c00be5e8bfb89d8fb.tar.gz
llvm-60d396262460f0613175e52c00be5e8bfb89d8fb.tar.bz2
llvm-60d396262460f0613175e52c00be5e8bfb89d8fb.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54855 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/raw_ostream.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp
new file mode 100644
index 0000000000..ec7ac6d007
--- /dev/null
+++ b/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() {}