mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86348 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===--- Main.cpp - The LLVM Compiler Driver --------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open
 | |
| // Source License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //  llvmc::Main function - driver entry point.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #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;
 | |
| namespace sys = llvm::sys;
 | |
| using namespace llvmc;
 | |
| 
 | |
| namespace {
 | |
| 
 | |
|   std::stringstream* GlobalTimeLog;
 | |
| 
 | |
|   sys::Path getTempDir() {
 | |
|     sys::Path tempDir;
 | |
| 
 | |
|     // The --temp-dir option.
 | |
|     if (!TempDirname.empty()) {
 | |
|       tempDir = TempDirname;
 | |
|     }
 | |
|     // GCC 4.5-style -save-temps handling.
 | |
|     else if (SaveTemps == SaveTempsEnum::Unset) {
 | |
|       tempDir = sys::Path::GetTemporaryDirectory();
 | |
|       return tempDir;
 | |
|     }
 | |
|     else if (SaveTemps == SaveTempsEnum::Obj && !OutputFilename.empty()) {
 | |
|       tempDir = OutputFilename;
 | |
|       tempDir = tempDir.getDirname();
 | |
|     }
 | |
|     else {
 | |
|       // SaveTemps == Cwd --> use current dir (leave tempDir empty).
 | |
|       return tempDir;
 | |
|     }
 | |
| 
 | |
|     if (!tempDir.exists()) {
 | |
|       std::string ErrMsg;
 | |
|       if (tempDir.createDirectoryOnDisk(true, &ErrMsg))
 | |
|         throw std::runtime_error(ErrMsg);
 | |
|     }
 | |
| 
 | |
|     return tempDir;
 | |
|   }
 | |
| 
 | |
|   /// BuildTargets - A small wrapper for CompilationGraph::Build.
 | |
|   int BuildTargets(CompilationGraph& graph, const LanguageMap& langMap) {
 | |
|     int ret;
 | |
|     const sys::Path& tempDir = getTempDir();
 | |
|     bool toDelete = (SaveTemps == SaveTempsEnum::Unset);
 | |
| 
 | |
|     try {
 | |
|       ret = graph.Build(tempDir, langMap);
 | |
|     }
 | |
|     catch(...) {
 | |
|       if (toDelete)
 | |
|         tempDir.eraseFromDisk(true);
 | |
|       throw;
 | |
|     }
 | |
| 
 | |
|     if (toDelete)
 | |
|       tempDir.eraseFromDisk(true);
 | |
|     return ret;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace llvmc {
 | |
| 
 | |
| // Used to implement -time option. External linkage is intentional.
 | |
| void AppendToGlobalTimeLog(const std::string& cmd, double time) {
 | |
|   *GlobalTimeLog << "# " << cmd << ' ' << time << '\n';
 | |
| }
 | |
| 
 | |
| // Sometimes plugins want to condition on the value in argv[0].
 | |
| const char* ProgramName;
 | |
| 
 | |
| int Main(int argc, char** argv) {
 | |
|   try {
 | |
|     LanguageMap langMap;
 | |
|     CompilationGraph graph;
 | |
| 
 | |
|     ProgramName = argv[0];
 | |
| 
 | |
|     cl::ParseCommandLineOptions
 | |
|       (argc, argv, "LLVM Compiler Driver (Work In Progress)", true);
 | |
| 
 | |
|     PluginLoader Plugins;
 | |
|     Plugins.RunInitialization(langMap, graph);
 | |
| 
 | |
|     if (CheckGraph) {
 | |
|       int ret = graph.Check();
 | |
|       if (!ret)
 | |
|         llvm::errs() << "check-graph: no errors found.\n";
 | |
| 
 | |
|       return ret;
 | |
|     }
 | |
| 
 | |
|     if (ViewGraph) {
 | |
|       graph.viewGraph();
 | |
|       if (!WriteGraph)
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     if (WriteGraph) {
 | |
|       graph.writeGraph(OutputFilename.empty()
 | |
|                        ? std::string("compilation-graph.dot")
 | |
|                        : OutputFilename);
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|     if (InputFilenames.empty()) {
 | |
|       throw std::runtime_error("no input files");
 | |
|     }
 | |
| 
 | |
|     if (Time) {
 | |
|       GlobalTimeLog = new std::stringstream;
 | |
|       GlobalTimeLog->precision(2);
 | |
|     }
 | |
| 
 | |
|     int ret = BuildTargets(graph, langMap);
 | |
| 
 | |
|     if (Time) {
 | |
|       llvm::errs() << GlobalTimeLog->str();
 | |
|       delete GlobalTimeLog;
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
|   }
 | |
|   catch(llvmc::error_code& ec) {
 | |
|     return ec.code();
 | |
|   }
 | |
|   catch(const std::exception& ex) {
 | |
|     llvm::errs() << argv[0] << ": " << ex.what() << '\n';
 | |
|   }
 | |
|   catch(...) {
 | |
|     llvm::errs() << argv[0] << ": unknown error!\n";
 | |
|   }
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| } // end namespace llvmc
 |