X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvmc%2FCompilerDriver.cpp;h=6f2ec2ec10c9a9e84bcc0ee293acf3e3a565afd3;hb=3da94aec4d429b2ba0f65fa040c33650cade196b;hp=f7630a2aaee5fdb13336b2b495ea70b18f6ca984;hpb=11db4b8084270cb91446485b9534864ce52a95ef;p=oota-llvm.git diff --git a/tools/llvmc/CompilerDriver.cpp b/tools/llvmc/CompilerDriver.cpp index f7630a2aaee..6f2ec2ec10c 100644 --- a/tools/llvmc/CompilerDriver.cpp +++ b/tools/llvmc/CompilerDriver.cpp @@ -1,11 +1,11 @@ //===- CompilerDriver.cpp - The LLVM Compiler Driver ------------*- C++ -*-===// // -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the bulk of the LLVM Compiler Driver (llvmc). @@ -20,17 +20,17 @@ #include "llvm/System/Signals.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Config/alloca.h" #include - using namespace llvm; namespace { void WriteAction(CompilerDriver::Action* action ) { std::cerr << action->program.c_str(); - std::vector::iterator I = action->args.begin(); + std::vector::const_iterator I = action->args.begin(); while (I != action->args.end()) { - std::cerr << " " + *I; + std::cerr << " " << *I; ++I; } std::cerr << "\n"; @@ -38,9 +38,9 @@ void WriteAction(CompilerDriver::Action* action ) { void DumpAction(CompilerDriver::Action* action) { std::cerr << "command = " << action->program.c_str(); - std::vector::iterator I = action->args.begin(); + std::vector::const_iterator I = action->args.begin(); while (I != action->args.end()) { - std::cerr << " " + *I; + std::cerr << " " << *I; ++I; } std::cerr << "\n"; @@ -48,7 +48,7 @@ void DumpAction(CompilerDriver::Action* action) { } void DumpConfigData(CompilerDriver::ConfigData* cd, const std::string& type ){ - std::cerr << "Configuration Data For '" << cd->langName << "' (" << type + std::cerr << "Configuration Data For '" << cd->langName << "' (" << type << ")\n"; std::cerr << "PreProcessor: "; DumpAction(&cd->PreProcessor); @@ -64,7 +64,7 @@ void DumpConfigData(CompilerDriver::ConfigData* cd, const std::string& type ){ /// This specifies the passes to run for OPT_FAST_COMPILE (-O1) /// which should reduce the volume of code and make compilation -/// faster. This is also safe on any llvm module. +/// faster. This is also safe on any llvm module. static const char* DefaultFastCompileOptimizations[] = { "-simplifycfg", "-mem2reg", "-instcombine" }; @@ -76,7 +76,7 @@ public: CompilerDriverImpl(ConfigDataProvider& confDatProv ) : cdp(&confDatProv) , finalPhase(LINKING) - , optLevel(OPT_FAST_COMPILE) + , optLevel(OPT_FAST_COMPILE) , Flags(0) , machine() , LibraryPaths() @@ -108,16 +108,16 @@ public: /// @name Methods /// @{ public: - virtual void setFinalPhase( Phases phase ) { - finalPhase = phase; + virtual void setFinalPhase( Phases phase ) { + finalPhase = phase; } - virtual void setOptimization( OptimizationLevels level ) { - optLevel = level; + virtual void setOptimization( OptimizationLevels level ) { + optLevel = level; } virtual void setDriverFlags( unsigned flags ) { - Flags = flags & DRIVER_FLAGS_MASK; + Flags = flags & DRIVER_FLAGS_MASK; } virtual void setOutputMachine( const std::string& machineName ) { @@ -190,11 +190,11 @@ private: if (TempDir.isDirectory() && TempDir.writable()) TempDir.destroyDirectory(/*remove_contents=*/true); } else { - std::cout << "Temporary files are in " << TempDir.toString() << "\n"; + std::cout << "Temporary files are in " << TempDir << "\n"; } } - sys::Path MakeTempFile(const std::string& basename, + sys::Path MakeTempFile(const std::string& basename, const std::string& suffix ) { sys::Path result(TempDir); if (!result.appendFile(basename)) @@ -204,8 +204,8 @@ private: return result; } - Action* GetAction(ConfigData* cd, - const sys::Path& input, + Action* GetAction(ConfigData* cd, + const sys::Path& input, const sys::Path& output, Phases phase) { @@ -243,7 +243,7 @@ private: // Get specific options for each kind of action type StringVector& addargs = AdditionalArgs[phase]; // Add specific options for each kind of action type - action->args.insert(action->args.end(), addargs.begin(), + action->args.insert(action->args.end(), addargs.begin(), addargs.end()); } } else @@ -263,7 +263,7 @@ private: case 'f': if (*PI == "%fOpts%") { if (!fOptions.empty()) - action->args.insert(action->args.end(), fOptions.begin(), + action->args.insert(action->args.end(), fOptions.begin(), fOptions.end()); } else found = false; @@ -297,13 +297,13 @@ private: action->args.push_back(output.toString()); } else if (*PI == "%opt%") { if (!isSet(EMIT_RAW_FLAG)) { - if (cd->opts.size() > static_cast(optLevel) && + if (cd->opts.size() > static_cast(optLevel) && !cd->opts[optLevel].empty()) - action->args.insert(action->args.end(), + action->args.insert(action->args.end(), cd->opts[optLevel].begin(), cd->opts[optLevel].end()); else - throw std::string("Optimization options for level ") + + throw std::string("Optimization options for level ") + utostr(unsigned(optLevel)) + " were not specified"; } } else @@ -335,7 +335,7 @@ private: case 'M': if (*PI == "%Mopts%") { if (!MOptions.empty()) - action->args.insert(action->args.end(), MOptions.begin(), + action->args.insert(action->args.end(), MOptions.begin(), MOptions.end()); } else found = false; @@ -355,7 +355,7 @@ private: } if (!found) { // Did it even look like a substitution? - if (PI->length()>1 && (*PI)[0] == '%' && + if (PI->length()>1 && (*PI)[0] == '%' && (*PI)[PI->length()-1] == '%') { throw std::string("Invalid substitution token: '") + *PI + "' for command '" + pat->program.toString() + "'"; @@ -392,18 +392,22 @@ private: "' is not executable."); // Invoke the program + const char** Args = (const char**) + alloca(sizeof(const char*)*(action->args.size()+2)); + Args[0] = action->program.toString().c_str(); + for (unsigned i = 1; i != action->args.size(); ++i) + Args[i] = action->args[i].c_str(); + Args[action->args.size()] = 0; // null terminate list. if (isSet(TIME_ACTIONS_FLAG)) { Timer timer(action->program.toString()); timer.startTimer(); - int resultCode = - sys::Program::ExecuteAndWait(action->program,action->args); + int resultCode = sys::Program::ExecuteAndWait(action->program, Args); timer.stopTimer(); timer.print(timer,std::cerr); return resultCode == 0; } else - return 0 == - sys::Program::ExecuteAndWait(action->program, action->args); + return 0 == sys::Program::ExecuteAndWait(action->program, Args); } return true; } @@ -417,7 +421,7 @@ private: fullpath.setFile(link_item); if (fullpath.readable()) return fullpath; - for (PathVector::iterator PI = LibraryPaths.begin(), + for (PathVector::iterator PI = LibraryPaths.begin(), PE = LibraryPaths.end(); PI != PE; ++PI) { fullpath.setDirectory(PI->toString()); fullpath.appendFile(link_item); @@ -427,11 +431,11 @@ private: fullpath.appendSuffix("a"); } else { fullpath.appendSuffix("bc"); - if (fullpath.readable()) + if (fullpath.readable()) return fullpath; fullpath.elideSuffix(); fullpath.appendSuffix("o"); - if (fullpath.readable()) + if (fullpath.readable()) return fullpath; fullpath = *PI; fullpath.appendFile(std::string("lib") + link_item); @@ -468,7 +472,7 @@ private: // If we didn't find the file in any of the library search paths // we have to bail. No where else to look. if (fullpath.isEmpty()) { - err = + err = std::string("Can't find linkage item '") + link_item.toString() + "'"; return false; } @@ -490,7 +494,7 @@ private: while ( LI != LE ) { if (!ProcessLinkageItem(sys::Path(*LI),set,err)) { if (err.empty()) { - err = std::string("Library '") + *LI + + err = std::string("Library '") + *LI + "' is not valid for linking but is required by file '" + fullpath.toString() + "'"; } else { @@ -502,7 +506,7 @@ private: } } else if (err.empty()) { err = std::string( - "The dependent libraries could not be extracted from '") + + "The dependent libraries could not be extracted from '") + fullpath.toString(); return false; } @@ -530,11 +534,11 @@ public: std::cerr << "OutputMachine = " << machine << "\n"; InputList::const_iterator I = InpList.begin(); while ( I != InpList.end() ) { - std::cerr << "Input: " << I->first.toString() << "(" << I->second + std::cerr << "Input: " << I->first << "(" << I->second << ")\n"; ++I; } - std::cerr << "Output: " << Output.toString() << "\n"; + std::cerr << "Output: " << Output << "\n"; } // If there's no input, we're done. @@ -560,18 +564,18 @@ public: /// PRE-PROCESSING / TRANSLATION / OPTIMIZATION / ASSEMBLY phases // for each input item SetVector LinkageItems; - std::vector LibFiles; + StringVector LibFiles; InputList::const_iterator I = InpList.begin(); for (InputList::const_iterator I = InpList.begin(), E = InpList.end(); I != E; ++I ) { // Get the suffix of the file name const std::string& ftype = I->second; - // If its a library, bytecode file, or object file, save - // it for linking below and short circuit the + // If its a library, bytecode file, or object file, save + // it for linking below and short circuit the // pre-processing/translation/assembly phases if (ftype.empty() || ftype == "o" || ftype == "bc" || ftype=="a") { - // We shouldn't get any of these types of files unless we're + // We shouldn't get any of these types of files unless we're // later going to link. Enforce this limit now. if (finalPhase != LINKING) { throw std::string( @@ -589,8 +593,8 @@ public: // for this kind of file. ConfigData* cd = cdp->ProvideConfigData(I->second); if (cd == 0) - throw std::string("Files of type '") + I->second + - "' are not recognized."; + throw std::string("Files of type '") + I->second + + "' are not recognized."; if (isSet(DEBUG_FLAG)) DumpConfigData(cd,I->second); @@ -627,11 +631,11 @@ public: } else if (finalPhase == PREPROCESSING) { throw cd->langName + " does not support pre-processing"; } else if (action.isSet(REQUIRED_FLAG)) { - throw std::string("Don't know how to pre-process ") + + throw std::string("Don't know how to pre-process ") + cd->langName + " files"; } - // Short-circuit remaining actions if all they want is + // Short-circuit remaining actions if all they want is // pre-processing if (finalPhase == PREPROCESSING) { continue; }; @@ -649,7 +653,7 @@ public: actions.push_back(GetAction(cd,InFile,Output,TRANSLATION)); } } else { - sys::Path TempFile(MakeTempFile(I->first.getBasename(),"trans")); + sys::Path TempFile(MakeTempFile(I->first.getBasename(),"trans")); actions.push_back(GetAction(cd,InFile,TempFile,TRANSLATION)); InFile = TempFile; } @@ -670,7 +674,7 @@ public: } else if (finalPhase == TRANSLATION) { throw cd->langName + " does not support translation"; } else if (action.isSet(REQUIRED_FLAG)) { - throw std::string("Don't know how to translate ") + + throw std::string("Don't know how to translate ") + cd->langName + " files"; } @@ -713,7 +717,7 @@ public: } else if (finalPhase == OPTIMIZATION) { throw cd->langName + " does not support optimization"; } else if (action.isSet(REQUIRED_FLAG)) { - throw std::string("Don't know how to optimize ") + + throw std::string("Don't know how to optimize ") + cd->langName + " files"; } } @@ -758,7 +762,7 @@ public: // Put the action on the list actions.push_back(action); - // Short circuit the rest of the loop, we don't want to link + // Short circuit the rest of the loop, we don't want to link continue; } @@ -812,12 +816,12 @@ public: // Add in all the linkage items we generated. This includes the // output from the translation/optimization phases as well as any // -l arguments specified. - for (PathVector::const_iterator I=LinkageItems.begin(), + for (PathVector::const_iterator I=LinkageItems.begin(), E=LinkageItems.end(); I != E; ++I ) link->args.push_back(I->toString()); // Add in all the libraries we found. - for (std::vector::const_iterator I=LibFiles.begin(), + for (StringVector::const_iterator I=LibFiles.begin(), E=LibFiles.end(); I != E; ++I ) link->args.push_back(std::string("-l")+*I);