1 //===--- Main.cpp - The LLVM Compiler Driver --------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open
6 // Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // llvmc::Main function - driver entry point.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CompilerDriver/BuiltinOptions.h"
15 #include "llvm/CompilerDriver/CompilationGraph.h"
16 #include "llvm/CompilerDriver/Error.h"
17 #include "llvm/CompilerDriver/Plugin.h"
19 #include "llvm/Support/raw_ostream.h"
20 #include "llvm/System/Path.h"
25 namespace cl = llvm::cl;
26 namespace sys = llvm::sys;
27 using namespace llvmc;
31 std::stringstream* GlobalTimeLog;
33 /// GetTempDir - Get the temporary directory location. Returns non-zero value
35 int GetTempDir(sys::Path& tempDir) {
36 // The --temp-dir option.
37 if (!TempDirname.empty()) {
38 tempDir = TempDirname;
40 // GCC 4.5-style -save-temps handling.
41 else if (SaveTemps == SaveTempsEnum::Unset) {
42 tempDir = sys::Path::GetTemporaryDirectory();
45 else if (SaveTemps == SaveTempsEnum::Obj && !OutputFilename.empty()) {
46 tempDir = OutputFilename;
47 tempDir = tempDir.getDirname();
50 // SaveTemps == Cwd --> use current dir (leave tempDir empty).
54 if (!tempDir.exists()) {
56 if (tempDir.createDirectoryOnDisk(true, &ErrMsg)) {
65 /// BuildTargets - A small wrapper for CompilationGraph::Build. Returns non-zero value
66 int BuildTargets(CompilationGraph& graph, const LanguageMap& langMap) {
69 bool toDelete = (SaveTemps == SaveTempsEnum::Unset);
71 if (int ret = GetTempDir(tempDir))
74 ret = graph.Build(tempDir, langMap);
77 tempDir.eraseFromDisk(true);
85 // Used to implement -time option. External linkage is intentional.
86 void AppendToGlobalTimeLog(const std::string& cmd, double time) {
87 *GlobalTimeLog << "# " << cmd << ' ' << time << '\n';
90 // Sometimes plugins want to condition on the value in argv[0].
91 const char* ProgramName;
93 int Main(int argc, char** argv) {
96 CompilationGraph graph;
98 ProgramName = argv[0];
100 cl::ParseCommandLineOptions
101 (argc, argv, "LLVM Compiler Driver (Work In Progress)",
102 /* ReadResponseFiles = */ false);
104 PluginLoader Plugins;
105 if (int ret = Plugins.RunInitialization(langMap, graph))
111 llvm::errs() << "check-graph: no errors found.\n";
123 const std::string& Out = (OutputFilename.empty()
124 ? std::string("compilation-graph.dot")
126 return graph.writeGraph(Out);
130 GlobalTimeLog = new std::stringstream;
131 GlobalTimeLog->precision(2);
134 ret = BuildTargets(graph, langMap);
137 llvm::errs() << GlobalTimeLog->str();
138 delete GlobalTimeLog;
144 } // end namespace llvmc