From ec080467f5b322441055de1f6cd4f08edc23d7df Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 11 Sep 2009 20:46:33 +0000 Subject: Fix llvm-extract's "writing bitcode to a terminal" warning, which wasn't working. To support this, add an is_displayed() function to raw_ostream, and generalize Process::StandardOutIsDisplayed and friends in order to support it. Also, call RemoveFileOnSignal before creating a file instead of after, so that the file isn't left behind if the program is interrupted between when the file is created and RemoveFileOnSignal is called. While here, add a -S to llvm-extract and port it to IRReader so that it supports assembly input. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81568 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-as/llvm-as.cpp | 13 ++++++------- tools/llvm-dis/llvm-dis.cpp | 12 ++++++------ tools/llvm-extract/Makefile | 2 +- tools/llvm-extract/llvm-extract.cpp | 36 ++++++++++++++++++++---------------- tools/opt/opt.cpp | 8 ++++---- 5 files changed, 37 insertions(+), 34 deletions(-) (limited to 'tools') diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp index 9027cfc3cf2..d510297aa35 100644 --- a/tools/llvm-as/llvm-as.cpp +++ b/tools/llvm-as/llvm-as.cpp @@ -94,7 +94,12 @@ int main(int argc, char **argv) { OutputFilename += ".bc"; } } - + + // Make sure that the Out file gets unlinked from the disk if we get a + // SIGINT. + if (OutputFilename != "-") + sys::RemoveFileOnSignal(sys::Path(OutputFilename)); + std::string ErrorInfo; std::auto_ptr Out (new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo, @@ -103,12 +108,6 @@ int main(int argc, char **argv) { errs() << ErrorInfo << '\n'; return 1; } - - - // Make sure that the Out file gets unlinked from the disk if we get a - // SIGINT. - if (OutputFilename != "-") - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); if (!DisableOutput) if (Force || !CheckBitcodeOutputToConsole(*Out, true)) diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp index 89073c08843..43bde53599c 100644 --- a/tools/llvm-dis/llvm-dis.cpp +++ b/tools/llvm-dis/llvm-dis.cpp @@ -89,7 +89,12 @@ int main(int argc, char **argv) { OutputFilename = IFN+".ll"; } } - + + // Make sure that the Out file gets unlinked from the disk if we get a + // SIGINT. + if (OutputFilename != "-") + sys::RemoveFileOnSignal(sys::Path(OutputFilename)); + std::string ErrorInfo; std::auto_ptr Out(new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo, @@ -99,11 +104,6 @@ int main(int argc, char **argv) { return 1; } - // Make sure that the Out file gets unlinked from the disk if we get a - // SIGINT. - if (OutputFilename != "-") - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); - // All that llvm-dis does is write the assembly to a file. if (!DontPrint) { PassManager Passes; diff --git a/tools/llvm-extract/Makefile b/tools/llvm-extract/Makefile index 2ef88415c6a..5672aa3299a 100644 --- a/tools/llvm-extract/Makefile +++ b/tools/llvm-extract/Makefile @@ -10,7 +10,7 @@ LEVEL = ../.. TOOLNAME = llvm-extract -LINK_COMPONENTS := ipo bitreader bitwriter +LINK_COMPONENTS := ipo bitreader bitwriter asmparser # This tool has no plugins, optimize startup time. TOOL_NO_EXPORTS = 1 diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp index 543d01f9103..517244f55ba 100644 --- a/tools/llvm-extract/llvm-extract.cpp +++ b/tools/llvm-extract/llvm-extract.cpp @@ -15,10 +15,12 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/PassManager.h" +#include "llvm/Assembly/PrintModulePass.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Transforms/IPO.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/IRReader.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" @@ -57,6 +59,10 @@ static cl::opt ExtractGlobal("glob", cl::desc("Specify global to extract"), cl::init(""), cl::value_desc("global")); +static cl::opt +OutputAssembly("S", + cl::desc("Write output as LLVM assembly"), cl::Hidden); + int main(int argc, char **argv) { // Print a stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); @@ -66,19 +72,12 @@ int main(int argc, char **argv) { llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. cl::ParseCommandLineOptions(argc, argv, "llvm extractor\n"); + SMDiagnostic Err; std::auto_ptr M; - - MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename); - if (Buffer == 0) { - errs() << argv[0] << ": Error reading file '" + InputFilename + "'\n"; - return 1; - } else { - M.reset(ParseBitcodeFile(Buffer, Context)); - } - delete Buffer; - + M.reset(ParseIRFile(InputFilename, Err, Context)); + if (M.get() == 0) { - errs() << argv[0] << ": bitcode didn't read correctly.\n"; + Err.Print(argv[0], errs()); return 1; } @@ -111,17 +110,22 @@ int main(int argc, char **argv) { Passes.add(createDeadTypeEliminationPass()); // Remove dead types... Passes.add(createStripDeadPrototypesPass()); // Remove dead func decls + // Make sure that the Output file gets unlinked from the disk if we get a + // SIGINT + sys::RemoveFileOnSignal(sys::Path(OutputFilename)); + std::string ErrorInfo; - std::auto_ptr - Out(new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo, - raw_fd_ostream::F_Binary)); + raw_fd_ostream Out(OutputFilename.c_str(), ErrorInfo, + raw_fd_ostream::F_Binary); if (!ErrorInfo.empty()) { errs() << ErrorInfo << '\n'; return 1; } - if (Force || !CheckBitcodeOutputToConsole(*Out, true)) - Passes.add(createBitcodeWriterPass(*Out)); + if (OutputAssembly) + Passes.add(createPrintModulePass(&Out)); + else if (Force || !CheckBitcodeOutputToConsole(Out, true)) + Passes.add(createBitcodeWriterPass(Out)); Passes.run(*M.get()); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index e4700667122..fe0e03649dd 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -362,6 +362,10 @@ int main(int argc, char **argv) { // FIXME: outs() is not binary! raw_ostream *Out = &outs(); // Default to printing to stdout... if (OutputFilename != "-") { + // Make sure that the Output file gets unlinked from the disk if we get a + // SIGINT + sys::RemoveFileOnSignal(sys::Path(OutputFilename)); + std::string ErrorInfo; Out = new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo, raw_fd_ostream::F_Binary); @@ -370,10 +374,6 @@ int main(int argc, char **argv) { delete Out; return 1; } - - // Make sure that the Output file gets unlinked from the disk if we get a - // SIGINT - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); } // If the output is set to be emitted to standard out, and standard out is a -- cgit v1.2.3