diff options
Diffstat (limited to 'lib/CompilerDriver/Main.cpp')
-rw-r--r-- | lib/CompilerDriver/Main.cpp | 123 |
1 files changed, 56 insertions, 67 deletions
diff --git a/lib/CompilerDriver/Main.cpp b/lib/CompilerDriver/Main.cpp index b5e507dfc3a37..0a6613aa77a3b 100644 --- a/lib/CompilerDriver/Main.cpp +++ b/lib/CompilerDriver/Main.cpp @@ -11,16 +11,15 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CompilerDriver/AutoGenerated.h" #include "llvm/CompilerDriver/BuiltinOptions.h" #include "llvm/CompilerDriver/CompilationGraph.h" #include "llvm/CompilerDriver/Error.h" -#include "llvm/CompilerDriver/Plugin.h" #include "llvm/Support/raw_ostream.h" #include "llvm/System/Path.h" #include <sstream> -#include <stdexcept> #include <string> namespace cl = llvm::cl; @@ -31,9 +30,9 @@ namespace { std::stringstream* GlobalTimeLog; - sys::Path getTempDir() { - sys::Path tempDir; - + /// GetTempDir - Get the temporary directory location. Returns non-zero value + /// on error. + int GetTempDir(sys::Path& tempDir) { // The --temp-dir option. if (!TempDirname.empty()) { tempDir = TempDirname; @@ -41,7 +40,7 @@ namespace { // GCC 4.5-style -save-temps handling. else if (SaveTemps == SaveTempsEnum::Unset) { tempDir = sys::Path::GetTemporaryDirectory(); - return tempDir; + return 0; } else if (SaveTemps == SaveTempsEnum::Obj && !OutputFilename.empty()) { tempDir = OutputFilename; @@ -49,35 +48,35 @@ namespace { } else { // SaveTemps == Cwd --> use current dir (leave tempDir empty). - return tempDir; + return 0; } if (!tempDir.exists()) { std::string ErrMsg; - if (tempDir.createDirectoryOnDisk(true, &ErrMsg)) - throw std::runtime_error(ErrMsg); + if (tempDir.createDirectoryOnDisk(true, &ErrMsg)) { + PrintError(ErrMsg); + return 1; + } } - return tempDir; + return 0; } - /// BuildTargets - A small wrapper for CompilationGraph::Build. + /// BuildTargets - A small wrapper for CompilationGraph::Build. Returns + /// non-zero value in case of error. int BuildTargets(CompilationGraph& graph, const LanguageMap& langMap) { int ret; - const sys::Path& tempDir = getTempDir(); + sys::Path tempDir; bool toDelete = (SaveTemps == SaveTempsEnum::Unset); - try { - ret = graph.Build(tempDir, langMap); - } - catch(...) { - if (toDelete) - tempDir.eraseFromDisk(true); - throw; - } + if (int ret = GetTempDir(tempDir)) + return ret; + + ret = graph.Build(tempDir, langMap); if (toDelete) tempDir.eraseFromDisk(true); + return ret; } } @@ -89,68 +88,58 @@ void AppendToGlobalTimeLog(const std::string& cmd, double time) { *GlobalTimeLog << "# " << cmd << ' ' << time << '\n'; } -// Sometimes plugins want to condition on the value in argv[0]. +// Sometimes user code wants to access the argv[0] value. const char* ProgramName; int Main(int argc, char** argv) { - try { - LanguageMap langMap; - CompilationGraph graph; - - ProgramName = argv[0]; + int ret = 0; + LanguageMap langMap; + CompilationGraph graph; - cl::ParseCommandLineOptions - (argc, argv, "LLVM Compiler Driver (Work In Progress)", - /* ReadResponseFiles = */ false); + ProgramName = argv[0]; - PluginLoader Plugins; - Plugins.RunInitialization(langMap, graph); + cl::ParseCommandLineOptions + (argc, argv, + /* Overview = */ "LLVM Compiler Driver (Work In Progress)", + /* ReadResponseFiles = */ false); - if (CheckGraph) { - int ret = graph.Check(); - if (!ret) - llvm::errs() << "check-graph: no errors found.\n"; + if (int ret = autogenerated::RunInitialization(langMap, graph)) + return ret; - return ret; - } + if (CheckGraph) { + ret = graph.Check(); + if (!ret) + llvm::errs() << "check-graph: no errors found.\n"; - if (ViewGraph) { - graph.viewGraph(); - if (!WriteGraph) - return 0; - } + return ret; + } - if (WriteGraph) { - graph.writeGraph(OutputFilename.empty() - ? std::string("compilation-graph.dot") - : OutputFilename); + if (ViewGraph) { + graph.viewGraph(); + if (!WriteGraph) return 0; - } + } - if (Time) { - GlobalTimeLog = new std::stringstream; - GlobalTimeLog->precision(2); - } + if (WriteGraph) { + const std::string& Out = (OutputFilename.empty() + ? std::string("compilation-graph.dot") + : OutputFilename); + return graph.writeGraph(Out); + } - int ret = BuildTargets(graph, langMap); + if (Time) { + GlobalTimeLog = new std::stringstream; + GlobalTimeLog->precision(2); + } - if (Time) { - llvm::errs() << GlobalTimeLog->str(); - delete GlobalTimeLog; - } + ret = BuildTargets(graph, langMap); - return ret; - } - catch(llvmc::error_code& ec) { - return ec.code(); + if (Time) { + llvm::errs() << GlobalTimeLog->str(); + delete GlobalTimeLog; } - catch(const std::exception& ex) { - llvm::errs() << argv[0] << ": " << ex.what() << '\n'; - } - catch(...) { - llvm::errs() << argv[0] << ": unknown error!\n"; - } - return 1; + + return ret; } } // end namespace llvmc |