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 sys::Path
getTempDir() {
34 // The --temp-dir option.
35 if (!TempDirname
.empty()) {
36 tempDir
= TempDirname
;
38 // GCC 4.5-style -save-temps handling.
39 else if (SaveTemps
== SaveTempsEnum::Unset
) {
40 tempDir
= sys::Path::GetTemporaryDirectory();
43 else if (SaveTemps
== SaveTempsEnum::Obj
&& !OutputFilename
.empty()) {
44 tempDir
= OutputFilename
;
45 tempDir
= tempDir
.getDirname();
48 // SaveTemps == Cwd --> use current dir (leave tempDir empty).
52 if (!tempDir
.exists()) {
54 if (tempDir
.createDirectoryOnDisk(true, &ErrMsg
))
55 throw std::runtime_error(ErrMsg
);
61 /// BuildTargets - A small wrapper for CompilationGraph::Build.
62 int BuildTargets(CompilationGraph
& graph
, const LanguageMap
& langMap
) {
64 const sys::Path
& tempDir
= getTempDir();
65 bool toDelete
= (SaveTemps
== SaveTempsEnum::Unset
);
68 ret
= graph
.Build(tempDir
, langMap
);
72 tempDir
.eraseFromDisk(true);
77 tempDir
.eraseFromDisk(true);
84 // Sometimes plugins want to condition on the value in argv[0].
85 const char* ProgramName
;
87 int Main(int argc
, char** argv
) {
90 CompilationGraph graph
;
92 ProgramName
= argv
[0];
94 cl::ParseCommandLineOptions
95 (argc
, argv
, "LLVM Compiler Driver (Work In Progress)", true);
98 Plugins
.PopulateLanguageMap(langMap
);
99 Plugins
.PopulateCompilationGraph(graph
);
102 int ret
= graph
.Check();
104 llvm::errs() << "check-graph: no errors found.\n";
116 graph
.writeGraph(OutputFilename
.empty()
117 ? std::string("compilation-graph.dot")
122 if (InputFilenames
.empty()) {
123 throw std::runtime_error("no input files");
126 return BuildTargets(graph
, langMap
);
128 catch(llvmc::error_code
& ec
) {
131 catch(const std::exception
& ex
) {
132 llvm::errs() << argv
[0] << ": " << ex
.what() << '\n';
135 llvm::errs() << argv
[0] << ": unknown error!\n";
140 } // end namespace llvmc