1 //===- CompilerDriver.cpp - The LLVM Compiler Driver ------------*- C++ -*-===//
4 // The LLVM Compiler Infrastructure
6 // This file was developed by Reid Spencer and is distributed under the
7 // University of Illinois Open Source License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 // This file implements the bulk of the LLVM Compiler Driver (llvmc).
13 //===------------------------------------------------------------------------===
15 #include "CompilerDriver.h"
16 #include "ConfigLexer.h"
17 #include "llvm/Bytecode/Reader.h"
18 #include "llvm/Module.h"
19 #include "Support/FileUtilities.h"
20 #include "Support/SystemUtils.h"
21 #include "Support/StringExtras.h"
27 inline std::string RemoveSuffix(const std::string& fullName) {
28 size_t dotpos = fullName.rfind('.',fullName.size());
29 if ( dotpos == std::string::npos ) return fullName;
30 return fullName.substr(0, dotpos);
33 const char OutputSuffix[] = ".o";
35 void WriteAction(CompilerDriver::Action* action ) {
36 std::cerr << action->program;
37 std::vector<std::string>::iterator I = action->args.begin();
38 while (I != action->args.end()) {
39 std::cerr << " " + *I;
45 void DumpAction(CompilerDriver::Action* action) {
46 std::cerr << "command = " << action->program;
47 std::vector<std::string>::iterator I = action->args.begin();
48 while (I != action->args.end()) {
49 std::cerr << " " + *I;
53 std::cerr << "flags = " << action->flags << "\n";
56 void DumpConfigData(CompilerDriver::ConfigData* cd, const std::string& type ){
57 std::cerr << "Configuration Data For '" << cd->langName << "' (" << type
59 std::cerr << "PreProcessor: ";
60 DumpAction(&cd->PreProcessor);
61 std::cerr << "Translator: ";
62 DumpAction(&cd->Translator);
63 std::cerr << "Optimizer: ";
64 DumpAction(&cd->Optimizer);
65 std::cerr << "Assembler: ";
66 DumpAction(&cd->Assembler);
67 std::cerr << "Linker: ";
68 DumpAction(&cd->Linker);
71 /// This specifies the passes to run for OPT_FAST_COMPILE (-O1)
72 /// which should reduce the volume of code and make compilation
73 /// faster. This is also safe on any llvm module.
74 static const char* DefaultFastCompileOptimizations[] = {
75 "-simplifycfg", "-mem2reg", "-instcombine"
79 // Stuff in this namespace properly belongs in lib/System and needs
80 // to be portable but we're avoiding that for now.
83 bool FileIsReadable(const std::string& fname) {
84 return 0 == access(fname.c_str(), F_OK | R_OK);
87 void CleanupTempFile(const std::string& fname) {
88 if (FileIsReadable(fname))
89 unlink(fname.c_str());
92 std::string MakeTemporaryDirectory() {
94 strcpy(temp_name,"/tmp/llvm_XXXXXX");
95 if (0 == mkdtemp(temp_name))
96 throw std::string("Can't create temporary directory");
100 std::string FindExecutableInPath(const std::string& program) {
101 // First, just see if the program is already executable
102 if (isExecutableFile(program)) return program;
104 // Get the path. If its empty, we can't do anything
105 const char *PathStr = getenv("PATH");
106 if (PathStr == 0) return "";
108 // Now we have a colon separated list of directories to search; try them.
109 unsigned PathLen = strlen(PathStr);
111 // Find the first colon...
112 const char *Colon = std::find(PathStr, PathStr+PathLen, ':');
114 // Check to see if this first directory contains the executable...
115 std::string FilePath = std::string(PathStr, Colon) + '/' + program;
116 if (isExecutableFile(FilePath))
117 return FilePath; // Found the executable!
119 // Nope it wasn't in this directory, check the next range!
120 PathLen -= Colon-PathStr;
123 // Advance past duplicate coons
124 while (*PathStr == ':') {
130 // If we fell out, we ran out of directories in PATH to search, return failure
135 CompilerDriver::CompilerDriver(ConfigDataProvider& confDatProv )
137 , finalPhase(LINKING)
138 , optLevel(OPT_FAST_COMPILE)
144 , emitNativeCode(false)
151 // FIXME: These libraries are platform specific
152 LibraryPaths.push_back("/lib");
153 LibraryPaths.push_back("/usr/lib");
154 AdditionalArgs.reserve(NUM_PHASES);
155 StringVector emptyVec;
156 for (unsigned i = 0; i < NUM_PHASES; ++i)
157 AdditionalArgs.push_back(emptyVec);
160 CompilerDriver::~CompilerDriver() {
162 LibraryPaths.clear();
163 AdditionalArgs.clear();
166 CompilerDriver::ConfigData::ConfigData()
174 StringVector emptyVec;
175 for (unsigned i = 0; i < NUM_PHASES; ++i)
176 opts.push_back(emptyVec);
179 void CompilerDriver::error( const std::string& errmsg ) {
180 std::cerr << "llvmc: Error: " << errmsg << ".\n";
184 CompilerDriver::Action* CompilerDriver::GetAction(ConfigData* cd,
185 const std::string& input,
186 const std::string& output,
189 Action* pat = 0; ///< The pattern/template for the action
190 Action* action = new Action; ///< The actual action to execute
192 // Get the action pattern
194 case PREPROCESSING: pat = &cd->PreProcessor; break;
195 case TRANSLATION: pat = &cd->Translator; break;
196 case OPTIMIZATION: pat = &cd->Optimizer; break;
197 case ASSEMBLY: pat = &cd->Assembler; break;
198 case LINKING: pat = &cd->Linker; break;
200 assert(!"Invalid driver phase!");
203 assert(pat != 0 && "Invalid command pattern");
205 // Copy over some pattern things that don't need to change
206 action->program = pat->program;
207 action->flags = pat->flags;
209 // Do the substitutions from the pattern to the actual
210 StringVector::iterator PI = pat->args.begin();
211 StringVector::iterator PE = pat->args.end();
213 if ((*PI)[0] == '%') {
215 action->args.push_back(input);
216 } else if (*PI == "%out%") {
217 action->args.push_back(output);
218 } else if (*PI == "%time%") {
220 action->args.push_back("-time-passes");
221 } else if (*PI == "%stats%") {
223 action->args.push_back("-stats");
224 } else if (*PI == "%target%") {
225 // FIXME: Ignore for now
226 } else if (*PI == "%opt%") {
228 if (cd->opts.size() > static_cast<unsigned>(optLevel) &&
229 !cd->opts[optLevel].empty())
230 action->args.insert(action->args.end(), cd->opts[optLevel].begin(),
231 cd->opts[optLevel].end());
233 error("Optimization options for level " + utostr(unsigned(optLevel)) +
234 " were not specified");
236 } else if (*PI == "%args%") {
237 if (AdditionalArgs.size() > unsigned(phase))
238 if (!AdditionalArgs[phase].empty()) {
239 // Get specific options for each kind of action type
240 StringVector& addargs = AdditionalArgs[phase];
241 // Add specific options for each kind of action type
242 action->args.insert(action->args.end(), addargs.begin(), addargs.end());
245 error("Invalid substitution name" + *PI);
248 // Its not a substitution, just put it in the action
249 action->args.push_back(*PI);
255 // Finally, we're done
259 bool CompilerDriver::DoAction(Action*action) {
260 assert(action != 0 && "Invalid Action!");
264 std::string prog(sys::FindExecutableInPath(action->program));
266 error("Can't find program '" + action->program + "'");
268 // Get the program's arguments
269 const char* argv[action->args.size() + 1];
270 argv[0] = prog.c_str();
272 for (; i <= action->args.size(); ++i)
273 argv[i] = action->args[i-1].c_str();
276 // Invoke the program
277 return !ExecWait(argv, environ);
282 /// This method tries various variants of a linkage item's file
283 /// name to see if it can find an appropriate file to link with
284 /// in the directory specified.
285 std::string CompilerDriver::GetPathForLinkageItem(const std::string& link_item,
286 const std::string& dir) {
287 std::string fullpath(dir + "/" + link_item + ".o");
288 if (::sys::FileIsReadable(fullpath))
290 fullpath = dir + "/" + link_item + ".bc";
291 if (::sys::FileIsReadable(fullpath))
293 fullpath = dir + "/lib" + link_item + ".a";
294 if (::sys::FileIsReadable(fullpath))
296 fullpath = dir + "/lib" + link_item + ".so";
297 if (::sys::FileIsReadable(fullpath))
302 /// This method processes a linkage item. The item could be a
303 /// Bytecode file needing translation to native code and that is
304 /// dependent on other bytecode libraries, or a native code
305 /// library that should just be linked into the program.
306 bool CompilerDriver::ProcessLinkageItem(const std::string& link_item,
307 SetVector<std::string>& set,
309 // First, see if the unadorned file name is not readable. If so,
310 // we must track down the file in the lib search path.
311 std::string fullpath;
312 if (!sys::FileIsReadable(link_item)) {
313 // First, look for the library using the -L arguments specified
314 // on the command line.
315 StringVector::iterator PI = LibraryPaths.begin();
316 StringVector::iterator PE = LibraryPaths.end();
317 while (PI != PE && fullpath.empty()) {
318 fullpath = GetPathForLinkageItem(link_item,*PI);
322 // If we didn't find the file in any of the library search paths
323 // so we have to bail. No where else to look.
324 if (fullpath.empty()) {
325 err = std::string("Can't find linkage item '") + link_item + "'";
329 fullpath = link_item;
332 // If we got here fullpath is the path to the file, and its readable.
333 set.insert(fullpath);
335 // If its an LLVM bytecode file ...
336 if (CheckMagic(fullpath, "llvm")) {
337 // Process the dependent libraries recursively
338 Module::LibraryListType modlibs;
339 if (GetBytecodeDependentLibraries(fullpath,modlibs)) {
340 // Traverse the dependent libraries list
341 Module::lib_iterator LI = modlibs.begin();
342 Module::lib_iterator LE = modlibs.end();
344 if (!ProcessLinkageItem(*LI,set,err)) {
346 err = std::string("Library '") + *LI +
347 "' is not valid for linking but is required by file '" +
350 err += " which is required by file '" + fullpath + "'";
356 } else if (err.empty()) {
357 err = std::string("The dependent libraries could not be extracted from '")
366 int CompilerDriver::execute(const InputList& InpList,
367 const std::string& Output ) {
368 // Echo the configuration of options if we're running verbose
371 std::cerr << "Compiler Driver Options:\n";
372 std::cerr << "DryRun = " << isDryRun << "\n";
373 std::cerr << "Verbose = " << isVerbose << " \n";
374 std::cerr << "TimeActions = " << timeActions << "\n";
375 std::cerr << "EmitRawCode = " << emitRawCode << "\n";
376 std::cerr << "OutputMachine = " << machine << "\n";
377 std::cerr << "EmitNativeCode = " << emitNativeCode << "\n";
378 InputList::const_iterator I = InpList.begin();
379 while ( I != InpList.end() ) {
380 std::cerr << "Input: " << I->first << "(" << I->second << ")\n";
383 std::cerr << "Output: " << Output << "\n";
386 // If there's no input, we're done.
388 error("Nothing to compile.");
390 // If they are asking for linking and didn't provide an output
391 // file then its an error (no way for us to "make up" a meaningful
392 // file name based on the various linker input files).
393 if (finalPhase == LINKING && Output.empty())
394 error("An output file name must be specified for linker output");
396 // This vector holds all the resulting actions of the following loop.
397 std::vector<Action*> actions;
399 // Create a temporary directory for our temporary files
400 std::string TempDir(sys::MakeTemporaryDirectory());
401 std::string TempPreprocessorOut(TempDir + "/preproc.o");
402 std::string TempTranslatorOut(TempDir + "/trans.o");
403 std::string TempOptimizerOut(TempDir + "/opt.o");
404 std::string TempAssemblerOut(TempDir + "/asm.o");
406 /// PRE-PROCESSING / TRANSLATION / OPTIMIZATION / ASSEMBLY phases
407 // for each input item
408 std::vector<std::string> LinkageItems;
409 std::string OutFile(Output);
410 InputList::const_iterator I = InpList.begin();
411 while ( I != InpList.end() ) {
412 // Get the suffix of the file name
413 const std::string& ftype = I->second;
415 // If its a library, bytecode file, or object file, save
416 // it for linking below and short circuit the
417 // pre-processing/translation/assembly phases
418 if (ftype.empty() || ftype == "o" || ftype == "bc") {
419 // We shouldn't get any of these types of files unless we're
420 // later going to link. Enforce this limit now.
421 if (finalPhase != LINKING) {
422 error("Pre-compiled objects found but linking not requested");
424 LinkageItems.push_back(I->first);
425 ++I; continue; // short circuit remainder of loop
428 // At this point, we know its something we need to translate
429 // and/or optimize. See if we can get the configuration data
430 // for this kind of file.
431 ConfigData* cd = cdp->ProvideConfigData(I->second);
433 error(std::string("Files of type '") + I->second +
434 "' are not recognized." );
436 DumpConfigData(cd,I->second);
438 // Initialize the input file
439 std::string InFile(I->first);
441 // PRE-PROCESSING PHASE
442 Action& action = cd->PreProcessor;
444 // Get the preprocessing action, if needed, or error if appropriate
445 if (!action.program.empty()) {
446 if (action.isSet(REQUIRED_FLAG) || finalPhase == PREPROCESSING) {
447 if (finalPhase == PREPROCESSING)
448 actions.push_back(GetAction(cd,InFile,OutFile,PREPROCESSING));
450 actions.push_back(GetAction(cd,InFile,TempPreprocessorOut,
452 InFile = TempPreprocessorOut;
455 } else if (finalPhase == PREPROCESSING) {
456 error(cd->langName + " does not support pre-processing");
457 } else if (action.isSet(REQUIRED_FLAG)) {
458 error(std::string("Don't know how to pre-process ") +
459 cd->langName + " files");
462 // Short-circuit remaining actions if all they want is pre-processing
463 if (finalPhase == PREPROCESSING) { ++I; continue; };
465 /// TRANSLATION PHASE
466 action = cd->Translator;
468 // Get the translation action, if needed, or error if appropriate
469 if (!action.program.empty()) {
470 if (action.isSet(REQUIRED_FLAG) || finalPhase == TRANSLATION) {
471 if (finalPhase == TRANSLATION)
472 actions.push_back(GetAction(cd,InFile,OutFile,TRANSLATION));
474 actions.push_back(GetAction(cd,InFile,TempTranslatorOut,TRANSLATION));
475 InFile = TempTranslatorOut;
479 if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
480 /// The output of the translator is an LLVM Assembly program
481 /// We need to translate it to bytecode
482 Action* action = new Action();
483 action->program = "llvm-as";
484 action->args.push_back(InFile);
485 action->args.push_back("-o");
487 action->args.push_back(InFile);
488 actions.push_back(action);
491 } else if (finalPhase == TRANSLATION) {
492 error(cd->langName + " does not support translation");
493 } else if (action.isSet(REQUIRED_FLAG)) {
494 error(std::string("Don't know how to translate ") +
495 cd->langName + " files");
498 // Short-circuit remaining actions if all they want is translation
499 if (finalPhase == TRANSLATION) { ++I; continue; }
501 /// OPTIMIZATION PHASE
502 action = cd->Optimizer;
504 // Get the optimization action, if needed, or error if appropriate
506 if (!action.program.empty()) {
507 if (action.isSet(REQUIRED_FLAG) || finalPhase == OPTIMIZATION) {
508 if (finalPhase == OPTIMIZATION)
509 actions.push_back(GetAction(cd,InFile,OutFile,OPTIMIZATION));
511 actions.push_back(GetAction(cd,InFile,TempOptimizerOut,OPTIMIZATION));
512 InFile = TempOptimizerOut;
515 if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
516 /// The output of the translator is an LLVM Assembly program
517 /// We need to translate it to bytecode
518 Action* action = new Action();
519 action->program = "llvm-as";
520 action->args.push_back(InFile);
521 action->args.push_back("-f");
522 action->args.push_back("-o");
524 action->args.push_back(InFile);
525 actions.push_back(action);
528 } else if (finalPhase == OPTIMIZATION) {
529 error(cd->langName + " does not support optimization");
530 } else if (action.isSet(REQUIRED_FLAG)) {
531 error(std::string("Don't know how to optimize ") +
532 cd->langName + " files");
536 // Short-circuit remaining actions if all they want is optimization
537 if (finalPhase == OPTIMIZATION) { ++I; continue; }
540 action = cd->Assembler;
542 if (finalPhase == ASSEMBLY || emitNativeCode) {
543 if (emitNativeCode) {
544 if (action.program.empty()) {
545 error(std::string("Native Assembler not specified for ") +
546 cd->langName + " files");
547 } else if (finalPhase == ASSEMBLY) {
548 actions.push_back(GetAction(cd,InFile,OutFile,ASSEMBLY));
550 actions.push_back(GetAction(cd,InFile,TempAssemblerOut,ASSEMBLY));
551 InFile = TempAssemblerOut;
554 // Just convert back to llvm assembly with llvm-dis
555 Action* action = new Action();
556 action->program = "llvm-dis";
557 action->args.push_back(InFile);
558 action->args.push_back("-f");
559 action->args.push_back("-o");
560 action->args.push_back(OutFile);
561 actions.push_back(action);
565 // Short-circuit remaining actions if all they want is assembly output
566 if (finalPhase == ASSEMBLY) { ++I; continue; }
568 // Register the OutFile as a link candidate
569 LinkageItems.push_back(InFile);
571 // Go to next file to be processed
575 /// RUN THE COMPILATION ACTIONS
576 std::vector<Action*>::iterator aIter = actions.begin();
577 while (aIter != actions.end()) {
578 if (!DoAction(*aIter))
579 error("Action failed");
584 if (finalPhase == LINKING) {
585 if (emitNativeCode) {
586 error("llvmc doesn't know how to link native code yet");
588 // First, we need to examine the files to ensure that they all contain
589 // bytecode files. Since the final output is bytecode, we can only
591 StringVector::const_iterator I = LinkageItems.begin();
592 StringVector::const_iterator E = LinkageItems.end();
593 SetVector<std::string> link_items;
595 while (I != E && ProcessLinkageItem(*I,link_items,errmsg))
601 // We're emitting bytecode so let's build an llvm-link Action
602 Action* link = new Action();
603 link->program = "llvm-link";
604 link->args = LinkageItems;
605 link->args.insert(link->args.end(), link_items.begin(), link_items.end());
606 link->args.push_back("-f");
607 link->args.push_back("-o");
608 link->args.push_back(OutFile);
610 link->args.push_back("-time-passes");
612 link->args.push_back("-stats");
613 actions.push_back(link);
619 ::sys::CleanupTempFile(TempPreprocessorOut);
620 ::sys::CleanupTempFile(TempTranslatorOut);
621 ::sys::CleanupTempFile(TempOptimizerOut);
623 // Cleanup temporary directory we created
624 if (::sys::FileIsReadable(TempDir))
625 rmdir(TempDir.c_str());
631 // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab