From ee0dd4d289cf2a6dcc2de13866ccee4016ee87c0 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 9 Apr 2015 15:54:59 +0000 Subject: [PATCH] This reverts commit r234460 and r234461. 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. llvm-svn: 234495 --- .../llvm/MC/MCLinkerOptimizationHint.h | 6 +--- llvm/include/llvm/Support/FormattedStream.h | 12 ++----- .../llvm/Support/circular_raw_ostream.h | 16 ++++----- llvm/include/llvm/Support/raw_os_ostream.h | 5 +-- llvm/include/llvm/Support/raw_ostream.h | 36 +++---------------- llvm/include/llvm/Target/TargetMachine.h | 9 ++--- llvm/lib/CodeGen/LLVMTargetMachine.cpp | 15 ++++---- llvm/lib/LTO/LTOCodeGenerator.cpp | 5 ++- llvm/lib/Support/Debug.cpp | 5 +-- llvm/lib/Support/raw_ostream.cpp | 9 +++-- llvm/lib/Target/CppBackend/CPPBackend.cpp | 8 ++--- llvm/lib/Target/CppBackend/CPPTargetMachine.h | 2 +- llvm/lib/Target/TargetMachineC.cpp | 4 +-- llvm/tools/gold/gold-plugin.cpp | 5 +-- 14 files changed, 51 insertions(+), 86 deletions(-) diff --git a/llvm/include/llvm/MC/MCLinkerOptimizationHint.h b/llvm/include/llvm/MC/MCLinkerOptimizationHint.h index 8c0813b6b0a6..890d6385aacd 100644 --- a/llvm/include/llvm/MC/MCLinkerOptimizationHint.h +++ b/llvm/include/llvm/MC/MCLinkerOptimizationHint.h @@ -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; diff --git a/llvm/include/llvm/Support/FormattedStream.h b/llvm/include/llvm/Support/FormattedStream.h index 71120370a022..8137daaff1f8 100644 --- a/llvm/include/llvm/Support/FormattedStream.h +++ b/llvm/include/llvm/Support/FormattedStream.h @@ -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(); diff --git a/llvm/include/llvm/Support/circular_raw_ostream.h b/llvm/include/llvm/Support/circular_raw_ostream.h index 0d1f378846f9..3d0f6e83cd35 100644 --- a/llvm/include/llvm/Support/circular_raw_ostream.h +++ b/llvm/include/llvm/Support/circular_raw_ostream.h @@ -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 diff --git a/llvm/include/llvm/Support/raw_os_ostream.h b/llvm/include/llvm/Support/raw_os_ostream.h index e41cc71026ff..04cf3b6202c4 100644 --- a/llvm/include/llvm/Support/raw_os_ostream.h +++ b/llvm/include/llvm/Support/raw_os_ostream.h @@ -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 diff --git a/llvm/include/llvm/Support/raw_ostream.h b/llvm/include/llvm/Support/raw_ostream.h index 982271397e4e..dfe25978faf8 100644 --- a/llvm/include/llvm/Support/raw_ostream.h +++ b/llvm/include/llvm/Support/raw_ostream.h @@ -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 @@ -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 &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 diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h index 605a6d97d035..1b26ccef2b61 100644 --- a/llvm/include/llvm/Target/TargetMachine.h +++ b/llvm/include/llvm/Target/TargetMachine.h @@ -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; diff --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/llvm/lib/CodeGen/LLVMTargetMachine.cpp index 4574dcfe9efb..301484461956 100644 --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -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(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; } diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 2bcdc27e9658..ad73ddc5d7a3 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -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; diff --git a/llvm/lib/Support/Debug.cpp b/llvm/lib/Support/Debug.cpp index 896898c185c4..a88b18e6c06c 100644 --- a/llvm/lib/Support/Debug.cpp +++ b/llvm/lib/Support/Debug.cpp @@ -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(llvm::dbgs()); - dbgout.flushBufferWithBanner(); + llvm::circular_raw_ostream *dbgout = + static_cast(&llvm::dbgs()); + dbgout->flushBufferWithBanner(); } /// dbgs - Return a circular-buffered debug stream. diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp index a312126fffec..051e2dd252fa 100644 --- a/llvm/lib/Support/raw_ostream.cpp +++ b/llvm/lib/Support/raw_ostream.cpp @@ -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 &O) - : raw_ostream(SK_SVECTOR), OS(O) { +raw_svector_ostream::raw_svector_ostream(SmallVectorImpl &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 diff --git a/llvm/lib/Target/CppBackend/CPPBackend.cpp b/llvm/lib/Target/CppBackend/CPPBackend.cpp index 0fd6918acc98..d0e2010abfd4 100644 --- a/llvm/lib/Target/CppBackend/CPPBackend.cpp +++ b/llvm/lib/Target/CppBackend/CPPBackend.cpp @@ -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(o))); + if (FileType != TargetMachine::CGFT_AssemblyFile) return true; + PM.add(new CppWriter(o)); return false; } diff --git a/llvm/lib/Target/CppBackend/CPPTargetMachine.h b/llvm/lib/Target/CppBackend/CPPTargetMachine.h index 04f81e9e9665..678a932cb286 100644 --- a/llvm/lib/Target/CppBackend/CPPTargetMachine.h +++ b/llvm/lib/Target/CppBackend/CPPTargetMachine.h @@ -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; diff --git a/llvm/lib/Target/TargetMachineC.cpp b/llvm/lib/Target/TargetMachineC.cpp index cbfb914d9dcc..236cb1bed963 100644 --- a/llvm/lib/Target/TargetMachineC.cpp +++ b/llvm/lib/Target/TargetMachineC.cpp @@ -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); diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 2c7bf5a64eef..93ce3bc0f446 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -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);