[llvm-commits] [llvm] r111595 - in /llvm/trunk: include/llvm/Support/FormattedStream.h include/llvm/Support/raw_ostream.h lib/Support/FormattedStream.cpp lib/Support/raw_ostream.cpp
Kenneth Uildriks
kennethuil at gmail.com
Sat Aug 21 05:15:20 PDT 2010
Can it be configurable? Sometimes it's helpful to see what the tool
managed to output before it got an error.
On Thu, Aug 19, 2010 at 7:48 PM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Thu Aug 19 19:48:10 2010
> New Revision: 111595
>
> URL: http://llvm.org/viewvc/llvm-project?rev=111595&view=rev
> Log:
> Introduce a new tool_output_file class, which extends raw_ostream with
> functionality that most command-line tools need: ensuring that the
> output file gets deleted if the tool is interrupted or encounters an
> error.
>
> Modified:
> llvm/trunk/include/llvm/Support/FormattedStream.h
> llvm/trunk/include/llvm/Support/raw_ostream.h
> llvm/trunk/lib/Support/FormattedStream.cpp
> llvm/trunk/lib/Support/raw_ostream.cpp
>
> Modified: llvm/trunk/include/llvm/Support/FormattedStream.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FormattedStream.h?rev=111595&r1=111594&r2=111595&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FormattedStream.h (original)
> +++ llvm/trunk/include/llvm/Support/FormattedStream.h Thu Aug 19 19:48:10 2010
> @@ -19,10 +19,14 @@
>
> namespace llvm
> {
> + class formatted_tool_output_file;
> +
> /// formatted_raw_ostream - Formatted raw_fd_ostream to handle
> /// asm-specific constructs.
> ///
> class formatted_raw_ostream : public raw_ostream {
> + friend class formatted_tool_output_file;
> +
> public:
> /// DELETE_STREAM - Tell the destructor to delete the held stream.
> ///
> @@ -136,6 +140,25 @@
> }
> };
>
> + /// formatted_tool_output_file - This is a subclass of formatted_raw_ostream
> + /// for use when the underlying stream is a tool_output_file. It exposes
> + /// the keep() member function.
> + class formatted_tool_output_file : public formatted_raw_ostream {
> + public:
> + formatted_tool_output_file(tool_output_file &Stream, bool Delete = false)
> + : formatted_raw_ostream(Stream, Delete) {}
> +
> + formatted_tool_output_file() {}
> +
> + ~formatted_tool_output_file();
> +
> + void setStream(tool_output_file &Stream, bool Delete = false) {
> + return formatted_raw_ostream::setStream(Stream, Delete);
> + }
> +
> + void keep() { return static_cast<tool_output_file *>(TheStream)->keep(); }
> + };
> +
> /// fouts() - This returns a reference to a formatted_raw_ostream for
> /// standard output. Use it like: fouts() << "foo" << "bar";
> formatted_raw_ostream &fouts();
>
> Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=111595&r1=111594&r2=111595&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
> +++ llvm/trunk/include/llvm/Support/raw_ostream.h Thu Aug 19 19:48:10 2010
> @@ -370,10 +370,11 @@
> ~raw_fd_ostream();
>
> /// close - Manually flush the stream and close the file.
> + /// Note that this does not call fsync.
> void close();
>
> /// seek - Flushes the stream and repositions the underlying file descriptor
> - /// positition to the offset specified from the beginning of the file.
> + /// positition to the offset specified from the beginning of the file.
> uint64_t seek(uint64_t off);
>
> virtual raw_ostream &changeColor(enum Colors colors, bool bold=false,
> @@ -484,6 +485,25 @@
> ~raw_null_ostream();
> };
>
> +/// tool_output_file - This class behaves like a raw_fd_ostream but adds a
> +/// few extra features commonly needed for compiler-like tool output files:
> +/// - The file is automatically deleted if the process is killed.
> +/// - The file is automatically deleted when the tool_output_file
> +/// object is destroyed unless the client calls keep().
> +class tool_output_file : public raw_fd_ostream {
> + std::string Filename;
> + bool Keep;
> +public:
> + tool_output_file(const char *filename, std::string &ErrorInfo,
> + unsigned Flags = 0);
> +
> + ~tool_output_file();
> +
> + /// keep - Indicate that the tool's job wrt this output file has been
> + /// successful and the file should not be deleted.
> + void keep() { Keep = true; }
> +};
> +
> } // end llvm namespace
>
> #endif
>
> Modified: llvm/trunk/lib/Support/FormattedStream.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FormattedStream.cpp?rev=111595&r1=111594&r2=111595&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/FormattedStream.cpp (original)
> +++ llvm/trunk/lib/Support/FormattedStream.cpp Thu Aug 19 19:48:10 2010
> @@ -98,3 +98,6 @@
> static formatted_raw_ostream S(dbgs());
> return S;
> }
> +
> +/// ~formatted_tool_output_file - Out-of-line destructor.
> +formatted_tool_output_file::~formatted_tool_output_file() {}
>
> Modified: llvm/trunk/lib/Support/raw_ostream.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=111595&r1=111594&r2=111595&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/raw_ostream.cpp (original)
> +++ llvm/trunk/lib/Support/raw_ostream.cpp Thu Aug 19 19:48:10 2010
> @@ -19,6 +19,7 @@
> #include "llvm/Config/config.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/ErrorHandling.h"
> +#include "llvm/System/Signals.h"
> #include "llvm/ADT/STLExtras.h"
> #include <cctype>
> #include <cerrno>
> @@ -669,3 +670,30 @@
> uint64_t raw_null_ostream::current_pos() const {
> return 0;
> }
> +
> +//===----------------------------------------------------------------------===//
> +// tool_output_file
> +//===----------------------------------------------------------------------===//
> +
> +/// SetupRemoveOnSignal - This is a helper for tool_output_file's constructor
> +/// to allow the signal handlers to be installed before constructing the
> +/// base class raw_fd_ostream.
> +static const char *SetupRemoveOnSignal(const char *Filename) {
> + // Arrange for the file to be deleted if the process is killed.
> + if (strcmp(Filename, "-") != 0)
> + sys::RemoveFileOnSignal(sys::Path(Filename));
> + return Filename;
> +}
> +
> +tool_output_file::tool_output_file(const char *filename, std::string &ErrorInfo,
> + unsigned Flags)
> + : raw_fd_ostream(SetupRemoveOnSignal(filename), ErrorInfo, Flags),
> + Filename(filename),
> + Keep(!ErrorInfo.empty() /* If open fails, no cleanup is needed. */) {
> +}
> +
> +tool_output_file::~tool_output_file() {
> + // Delete the file if the client hasn't told us not to.
> + if (!Keep && Filename != "-")
> + sys::Path(Filename).eraseFromDisk();
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list