This reverts commit r234460 and r234461.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 9 Apr 2015 15:54:59 +0000 (15:54 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 9 Apr 2015 15:54:59 +0000 (15:54 +0000)
Revert "Add classof implementations to the raw_ostream classes."
Revert "Use the cast machinery to remove dummy uses of formatted_raw_ostream."

The underlying issue can be fixed without classof.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234495 91177308-0d34-0410-b5e6-96231b3b80d8

14 files changed:
include/llvm/MC/MCLinkerOptimizationHint.h
include/llvm/Support/FormattedStream.h
include/llvm/Support/circular_raw_ostream.h
include/llvm/Support/raw_os_ostream.h
include/llvm/Support/raw_ostream.h
include/llvm/Target/TargetMachine.h
lib/CodeGen/LLVMTargetMachine.cpp
lib/LTO/LTOCodeGenerator.cpp
lib/Support/Debug.cpp
lib/Support/raw_ostream.cpp
lib/Target/CppBackend/CPPBackend.cpp
lib/Target/CppBackend/CPPTargetMachine.h
lib/Target/TargetMachineC.cpp
tools/gold/gold-plugin.cpp

index 8c0813b6b0a6af52310281c1837ecb22c1c2ad39..890d6385aacde34ce3cd369018f283fe5e171554 100644 (file)
@@ -140,12 +140,8 @@ public:
       uint64_t current_pos() const override { return Count; }
 
     public:
-      raw_counting_ostream() : raw_ostream(SK_COUNTING), Count(0) {}
+      raw_counting_ostream() : Count(0) {}
       ~raw_counting_ostream() { flush(); }
-
-      static bool classof(const raw_ostream *OS) {
-        return OS->getKind() == SK_COUNTING;
-      }
     };
 
     raw_counting_ostream OutStream;
index 71120370a0221919b167eca755e10dfc294a4294..8137daaff1f810d05ed5ba81374c451d63bc217a 100644 (file)
@@ -84,21 +84,15 @@ public:
   /// so it doesn't want another layer of buffering to be happening
   /// underneath it.
   ///
-  formatted_raw_ostream(raw_ostream &Stream, bool Delete = false)
-      : raw_ostream(SK_FORMATTED), TheStream(nullptr), DeleteStream(false),
-        Position(0, 0) {
+  formatted_raw_ostream(raw_ostream &Stream, bool Delete = false) 
+    : raw_ostream(), TheStream(nullptr), DeleteStream(false), Position(0, 0) {
     setStream(Stream, Delete);
   }
   explicit formatted_raw_ostream()
-      : raw_ostream(SK_FORMATTED), TheStream(nullptr), DeleteStream(false),
-        Position(0, 0) {
+    : raw_ostream(), TheStream(nullptr), DeleteStream(false), Position(0, 0) {
     Scanned = nullptr;
   }
 
-  static bool classof(const raw_ostream *OS) {
-    return OS->getKind() == SK_FORMATTED;
-  }
-
   ~formatted_raw_ostream() {
     flush();
     releaseStream();
index 0d1f378846f9bc783218263c8b75e3ac2a7f36ed..3d0f6e83cd35def4039a5dc1a425e9e5d71426d6 100644 (file)
@@ -107,10 +107,14 @@ namespace llvm
     /// management of it, etc.
     ///
     circular_raw_ostream(raw_ostream &Stream, const char *Header,
-                         size_t BuffSize = 0, bool Owns = REFERENCE_ONLY)
-        : raw_ostream(SK_CIRCULAR, /*unbuffered*/ true), TheStream(nullptr),
-          OwnsStream(Owns), BufferSize(BuffSize), BufferArray(nullptr),
-          Filled(false), Banner(Header) {
+                         size_t BuffSize = 0, bool Owns = REFERENCE_ONLY) 
+        : raw_ostream(/*unbuffered*/true),
+            TheStream(nullptr),
+            OwnsStream(Owns),
+            BufferSize(BuffSize),
+            BufferArray(nullptr),
+            Filled(false),
+            Banner(Header) {
       if (BufferSize != 0)
         BufferArray = new char[BufferSize];
       Cur = BufferArray;
@@ -140,10 +144,6 @@ namespace llvm
     ///
     void flushBufferWithBanner();
 
-    static bool classof(const raw_ostream *OS) {
-      return OS->getKind() == SK_CIRCULAR;
-    }
-
   private:
     /// releaseStream - Delete the held stream if needed. Otherwise,
     /// transfer the buffer settings from this circular_raw_ostream
index e41cc71026ff34a1df6ddb6cd0bd6e2db8749921..04cf3b6202c439dadaaf82e07cc7c15eacb25006 100644 (file)
@@ -33,11 +33,8 @@ class raw_os_ostream : public raw_ostream {
   uint64_t current_pos() const override;
 
 public:
-  raw_os_ostream(std::ostream &O) : raw_ostream(SK_STD_OS), OS(O) {}
+  raw_os_ostream(std::ostream &O) : OS(O) {}
   ~raw_os_ostream();
-  static bool classof(const raw_ostream *OS) {
-    return OS->getKind() == SK_STD_OS;
-  }
 };
 
 } // end llvm namespace
index 982271397e4ec9e54ccbcf92c8bdeb69d4dcbac5..dfe25978faf8094ed87036c16a0df7d1fb0ea9f4 100644 (file)
@@ -16,7 +16,6 @@
 
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Casting.h"
 #include "llvm/Support/DataTypes.h"
 #include <system_error>
 
@@ -68,17 +67,6 @@ private:
   } BufferMode;
 
 public:
-  enum StreamKind {
-    SK_FD,
-    SK_STRING,
-    SK_SVECTOR,
-    SK_NULL,
-    SK_STD_OS,
-    SK_CIRCULAR,
-    SK_FORMATTED,
-    SK_COUNTING
-  };
-
   // color order matches ANSI escape sequence, don't change
   enum Colors {
     BLACK=0,
@@ -92,8 +80,8 @@ public:
     SAVEDCOLOR
   };
 
-  explicit raw_ostream(StreamKind Kind, bool unbuffered = false)
-      : BufferMode(unbuffered ? Unbuffered : InternalBuffer), Kind(Kind) {
+  explicit raw_ostream(bool unbuffered=false)
+    : BufferMode(unbuffered ? Unbuffered : InternalBuffer) {
     // Start out ready to flush.
     OutBufStart = OutBufEnd = OutBufCur = nullptr;
   }
@@ -271,10 +259,7 @@ public:
   // Subclass Interface
   //===--------------------------------------------------------------------===//
 
-  StreamKind getKind() const { return Kind; }
-
 private:
-  StreamKind Kind;
   /// The is the piece of the class that is implemented by subclasses.  This
   /// writes the \p Size bytes starting at
   /// \p Ptr to the underlying stream.
@@ -379,8 +364,6 @@ public:
   /// this closes the file when the stream is destroyed.
   raw_fd_ostream(int fd, bool shouldClose, bool unbuffered=false);
 
-  static bool classof(const raw_ostream *OS) { return OS->getKind() == SK_FD; }
-
   ~raw_fd_ostream();
 
   /// Manually flush the stream and close the file. Note that this does not call
@@ -460,13 +443,9 @@ class raw_string_ostream : public raw_ostream {
   /// currently in the buffer.
   uint64_t current_pos() const override { return OS.size(); }
 public:
-  explicit raw_string_ostream(std::string &O) : raw_ostream(SK_STRING), OS(O) {}
+  explicit raw_string_ostream(std::string &O) : OS(O) {}
   ~raw_string_ostream();
 
-  static bool classof(const raw_ostream *OS) {
-    return OS->getKind() == SK_STRING;
-  }
-
   /// Flushes the stream contents to the target string and returns  the string's
   /// reference.
   std::string& str() {
@@ -494,10 +473,6 @@ public:
   explicit raw_svector_ostream(SmallVectorImpl<char> &O);
   ~raw_svector_ostream();
 
-  static bool classof(const raw_ostream *OS) {
-    return OS->getKind() == SK_SVECTOR;
-  }
-
   /// This is called when the SmallVector we're appending to is changed outside
   /// of the raw_svector_ostream's control.  It is only safe to do this if the
   /// raw_svector_ostream has previously been flushed.
@@ -518,11 +493,8 @@ class raw_null_ostream : public raw_ostream {
   uint64_t current_pos() const override;
 
 public:
-  explicit raw_null_ostream() : raw_ostream(SK_NULL) {}
+  explicit raw_null_ostream() {}
   ~raw_null_ostream();
-  static bool classof(const raw_ostream *OS) {
-    return OS->getKind() == SK_NULL;
-  }
 };
 
 } // end llvm namespace
index 605a6d97d0353d58d002a2589fa0f712fa05ae1b..1b26ccef2b61ff77d2253f91c5934ef14ddef627 100644 (file)
@@ -207,9 +207,8 @@ public:
   /// emitted.  Typically this will involve several steps of code generation.
   /// This method should return true if emission of this file type is not
   /// supported, or false on success.
-  /// If producing assembly, the stream must be a formatted_raw_ostream.
-  /// For other formats any raw_ostream will do.
-  virtual bool addPassesToEmitFile(PassManagerBase &, raw_ostream &,
+  virtual bool addPassesToEmitFile(PassManagerBase &,
+                                   formatted_raw_ostream &,
                                    CodeGenFileType,
                                    bool /*DisableVerify*/ = true,
                                    AnalysisID /*StartAfter*/ = nullptr,
@@ -256,7 +255,9 @@ public:
   /// for generating a pipeline of CodeGen passes.
   virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
 
-  bool addPassesToEmitFile(PassManagerBase &PM, raw_ostream &Out,
+  /// Add passes to the specified pass manager to get the specified file
+  /// emitted.  Typically this will involve several steps of code generation.
+  bool addPassesToEmitFile(PassManagerBase &PM, formatted_raw_ostream &Out,
                            CodeGenFileType FileType, bool DisableVerify = true,
                            AnalysisID StartAfter = nullptr,
                            AnalysisID StopAfter = nullptr) override;
index 4574dcfe9efb901081bab45ef96cd2789fcc92e8..301484461956d529df71b3d6d724f61f1871152a 100644 (file)
@@ -140,9 +140,12 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
   return &MMI->getContext();
 }
 
-bool LLVMTargetMachine::addPassesToEmitFile(
-    PassManagerBase &PM, raw_ostream &Out, CodeGenFileType FileType,
-    bool DisableVerify, AnalysisID StartAfter, AnalysisID StopAfter) {
+bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
+                                            formatted_raw_ostream &Out,
+                                            CodeGenFileType FileType,
+                                            bool DisableVerify,
+                                            AnalysisID StartAfter,
+                                            AnalysisID StopAfter) {
   // Add common CodeGen passes.
   MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,
                                                StartAfter, StopAfter);
@@ -182,9 +185,9 @@ bool LLVMTargetMachine::addPassesToEmitFile(
     MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
                                                        TargetCPU);
     MCStreamer *S = getTarget().createAsmStreamer(
-        *Context, cast<formatted_raw_ostream>(Out),
-        Options.MCOptions.AsmVerbose, Options.MCOptions.MCUseDwarfDirectory,
-        InstPrinter, MCE, MAB, Options.MCOptions.ShowMCInst);
+        *Context, Out, Options.MCOptions.AsmVerbose,
+        Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB,
+        Options.MCOptions.ShowMCInst);
     AsmStreamer.reset(S);
     break;
   }
index 2bcdc27e9658aa0af1d165f2cbbba0090979185c..ad73ddc5d7a3d483379b38e77488c15edd56b443 100644 (file)
@@ -38,6 +38,7 @@
 #include "llvm/MC/SubtargetFeature.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/Host.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Signals.h"
@@ -573,11 +574,13 @@ bool LTOCodeGenerator::compileOptimized(raw_ostream &out, std::string &errMsg) {
 
   legacy::PassManager codeGenPasses;
 
+  formatted_raw_ostream Out(out);
+
   // If the bitcode files contain ARC code and were compiled with optimization,
   // the ObjCARCContractPass must be run, so do it unconditionally here.
   codeGenPasses.add(createObjCARCContractPass());
 
-  if (TargetMach->addPassesToEmitFile(codeGenPasses, out,
+  if (TargetMach->addPassesToEmitFile(codeGenPasses, Out,
                                       TargetMachine::CGFT_ObjectFile)) {
     errMsg = "target file type not supported";
     return false;
index 896898c185c4ca049d1a548cbb7d85fc434c7ad9..a88b18e6c06c0aebfaafbc7f29a6a74cb56a455b 100644 (file)
@@ -114,8 +114,9 @@ static void debug_user_sig_handler(void *Cookie) {
   // know that debug mode is enabled and dbgs() really is a
   // circular_raw_ostream.  If NDEBUG is defined, then dbgs() ==
   // errs() but this will never be invoked.
-  llvm::circular_raw_ostream &dbgout = cast<circular_raw_ostream>(llvm::dbgs());
-  dbgout.flushBufferWithBanner();
+  llvm::circular_raw_ostream *dbgout =
+    static_cast<llvm::circular_raw_ostream *>(&llvm::dbgs());
+  dbgout->flushBufferWithBanner();
 }
 
 /// dbgs - Return a circular-buffered debug stream.
index a312126fffec6593846c71a09144670d9fc87c79..051e2dd252fa1eb2a49de21040e10b1638558257 100644 (file)
@@ -489,7 +489,7 @@ void format_object_base::home() {
 
 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
                                sys::fs::OpenFlags Flags)
-    : raw_ostream(SK_FD), Error(false), UseAtomicWrites(false), pos(0) {
+    : Error(false), UseAtomicWrites(false), pos(0) {
   EC = std::error_code();
   // Handle "-" as stdout. Note that when we do this, we consider ourself
   // the owner of stdout. This means that we can do things like close the
@@ -519,8 +519,8 @@ raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
 /// raw_fd_ostream ctor - FD is the file descriptor that this writes to.  If
 /// ShouldClose is true, this closes the file when the stream is destroyed.
 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
-    : raw_ostream(SK_FD, unbuffered), FD(fd), ShouldClose(shouldClose),
-      Error(false), UseAtomicWrites(false) {
+  : raw_ostream(unbuffered), FD(fd),
+    ShouldClose(shouldClose), Error(false), UseAtomicWrites(false) {
 #ifdef O_BINARY
   // Setting STDOUT to binary mode is necessary in Win32
   // to avoid undesirable linefeed conversion.
@@ -749,8 +749,7 @@ void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
 // capacity. This allows raw_ostream to write directly into the correct place,
 // and we only need to set the vector size when the data is flushed.
 
-raw_svector_ostream::raw_svector_ostream(SmallVectorImpl<char> &O)
-    : raw_ostream(SK_SVECTOR), OS(O) {
+raw_svector_ostream::raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {
   // Set up the initial external buffer. We make sure that the buffer has at
   // least 128 bytes free; raw_ostream itself only requires 64, but we want to
   // make sure that we don't grow the buffer unnecessarily on destruction (when
index 0fd6918acc980ff3176bfa52e025c97aa8c91ceb..d0e2010abfd426e090003f6109c9b7e03da075f3 100644 (file)
@@ -2146,13 +2146,13 @@ char CppWriter::ID = 0;
 //                       External Interface declaration
 //===----------------------------------------------------------------------===//
 
-bool CPPTargetMachine::addPassesToEmitFile(PassManagerBase &PM, raw_ostream &o,
+bool CPPTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
+                                           formatted_raw_ostream &o,
                                            CodeGenFileType FileType,
                                            bool DisableVerify,
                                            AnalysisID StartAfter,
                                            AnalysisID StopAfter) {
-  if (FileType != TargetMachine::CGFT_AssemblyFile)
-    return true;
-  PM.add(new CppWriter(cast<formatted_raw_ostream>(o)));
+  if (FileType != TargetMachine::CGFT_AssemblyFile) return true;
+  PM.add(new CppWriter(o));
   return false;
 }
index 04f81e9e9665c16a5af7abb39e8ca1ef978f90aa..678a932cb28686d14ad168e7c374bc826995ecc6 100644 (file)
@@ -29,7 +29,7 @@ struct CPPTargetMachine : public TargetMachine {
       : TargetMachine(T, "", TT, CPU, FS, Options) {}
 
 public:
-  bool addPassesToEmitFile(PassManagerBase &PM, raw_ostream &Out,
+  bool addPassesToEmitFile(PassManagerBase &PM, formatted_raw_ostream &Out,
                            CodeGenFileType FileType, bool DisableVerify,
                            AnalysisID StartAfter,
                            AnalysisID StopAfter) override;
index cbfb914d9dcc81ae66c21719553caa00121817f5..236cb1bed963e3c91b8ee50aa97206c8148bcaf0 100644 (file)
@@ -183,9 +183,7 @@ void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T,
 }
 
 static LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M,
-                                      raw_ostream &OS,
-                                      LLVMCodeGenFileType codegen,
-                                      char **ErrorMessage) {
+  formatted_raw_ostream &OS, LLVMCodeGenFileType codegen, char **ErrorMessage) {
   TargetMachine* TM = unwrap(T);
   Module* Mod = unwrap(M);
 
index 2c7bf5a64eef3b5e5f7b8185fce2d31373911309..93ce3bc0f446b2fbd1223dd3055b9f6252007fd0 100644 (file)
@@ -31,7 +31,7 @@
 #include "llvm/Linker/Linker.h"
 #include "llvm/MC/SubtargetFeature.h"
 #include "llvm/Object/IRObjectFile.h"
-#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/Host.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -804,8 +804,9 @@ static void codegen(Module &M) {
 
   {
     raw_fd_ostream OS(FD, true);
+    formatted_raw_ostream FOS(OS);
 
-    if (TM->addPassesToEmitFile(CodeGenPasses, OS,
+    if (TM->addPassesToEmitFile(CodeGenPasses, FOS,
                                 TargetMachine::CGFT_ObjectFile))
       message(LDPL_FATAL, "Failed to setup codegen");
     CodeGenPasses.run(M);