[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