[llvm-commits] CVS: llvm/tools/llvmc/CompilerDriver.cpp

Reid Spencer reid at x10sys.com
Tue Aug 24 06:55:27 PDT 2004



Changes in directory llvm/tools/llvmc:

CompilerDriver.cpp updated: 1.8 -> 1.9
---
Log message:

- Remove unused GetSuffix function
- Renamed FileReadable -> FileIsReadable
- Remove support for GROKS_DASH_O; deferr it to %opts% substitution
- Require a -o option except in case of linking where it defaults to a.out
- Fix problem processing *.o and *.bc files.
- Ignore optimization phase if -emit-raw-code
- Correct the assembly generation phase to support -emit-native-code
- Implement dependent library lookup


---
Diffs of the changes:  (+118 -78)

Index: llvm/tools/llvmc/CompilerDriver.cpp
diff -u llvm/tools/llvmc/CompilerDriver.cpp:1.8 llvm/tools/llvmc/CompilerDriver.cpp:1.9
--- llvm/tools/llvmc/CompilerDriver.cpp:1.8	Fri Aug 20 17:53:11 2004
+++ llvm/tools/llvmc/CompilerDriver.cpp	Tue Aug 24 08:55:17 2004
@@ -14,7 +14,11 @@
 
 #include "CompilerDriver.h"
 #include "ConfigLexer.h"
+#include "llvm/Bytecode/Reader.h"
+#include "llvm/Module.h"
+#include "Support/FileUtilities.h"
 #include "Support/SystemUtils.h"
+#include "Support/StringExtras.h"
 #include <iostream>
 
 using namespace llvm;
@@ -26,12 +30,6 @@
     return fullName.substr(0, dotpos);
   }
 
-  inline std::string GetSuffix(const std::string& fullName) {
-    size_t dotpos = fullName.rfind('.',fullName.size());
-    if ( dotpos = std::string::npos ) return "";
-    return fullName.substr(dotpos+1);
-  }
-
   const char OutputSuffix[] = ".o";
 
   void WriteAction(CompilerDriver::Action* action ) {
@@ -82,12 +80,12 @@
 // to be portable but we're avoiding that for now.
 namespace sys {
 
-  bool FileReadable(const std::string& fname) {
+  bool FileIsReadable(const std::string& fname) {
     return 0 == access(fname.c_str(), F_OK | R_OK);
   }
 
   void CleanupTempFile(const std::string& fname) {
-    if (FileReadable(fname))
+    if (FileIsReadable(fname))
       unlink(fname.c_str());
   }
 
@@ -227,31 +225,24 @@
         // FIXME: Ignore for now
       } else if (*PI == "%opt%") {
         if (!emitRawCode) {
-          if (pat->isSet(GROKS_DASH_O)) {
-            if (optLevel != OPT_NONE) {
-              std::string optArg("-O");
-              switch (optLevel) {
-                case OPT_FAST_COMPILE : optArg.append("1"); break;
-                case OPT_SIMPLE:        optArg.append("2"); break;
-                case OPT_AGGRESSIVE:    optArg.append("3"); break;
-                case OPT_LINK_TIME:     optArg.append("4"); break;
-                case OPT_AGGRESSIVE_LINK_TIME: optArg.append("5"); break;
-                default : 
-                  assert(!"Invalid optimization argument!");
-                  optArg.append("0"); 
-                  break;
-              }
-              action->args.push_back(optArg);
-            }
-          } else {
-            if (cd->opts.size() > static_cast<unsigned>(optLevel) && 
-                !cd->opts[optLevel].empty())
-              action->args.insert(action->args.end(), cd->opts[optLevel].begin(),
+          if (cd->opts.size() > static_cast<unsigned>(optLevel) && 
+              !cd->opts[optLevel].empty())
+            action->args.insert(action->args.end(), cd->opts[optLevel].begin(),
                 cd->opts[optLevel].end());
-          }
+          else
+            error("Optimization options for level " + utostr(unsigned(optLevel)) + 
+                  " were not specified");
         }
+      } else if (*PI == "%args%") {
+        if (AdditionalArgs.size() > unsigned(phase))
+          if (!AdditionalArgs[phase].empty()) {
+            // 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(), addargs.end());
+          }
       } else {
-        error("Invalid substitution name");
+        error("Invalid substitution name" + *PI);
       }
     } else {
       // Its not a substitution, just put it in the action
@@ -260,11 +251,6 @@
     PI++;
   }
 
-  // Get specific options for each kind of action type
-  StringVector& args = AdditionalArgs[phase];
-
-  // Add specific options for each kind of action type
-  action->args.insert(action->args.end(), args.begin(), args.end());
 
   // Finally, we're done
   return action;
@@ -336,22 +322,23 @@
   /// PRE-PROCESSING / TRANSLATION / OPTIMIZATION / ASSEMBLY phases
   // for each input item
   std::vector<std::string> LinkageItems;
+  std::string OutFile(Output);
   InputList::const_iterator I = InpList.begin();
   while ( I != InpList.end() ) {
     // Get the suffix of the file name
-    std::string suffix = GetSuffix(I->first);
+    const std::string& ftype = I->second;
 
     // If its a library, bytecode file, or object file, save 
     // it for linking below and short circuit the 
     // pre-processing/translation/assembly phases
-    if (I->second.empty() || suffix == "o" || suffix == "bc") {
+    if (ftype.empty() ||  ftype == "o" || ftype == "bc") {
       // We shouldn't get any of these types of files unless we're 
       // later going to link. Enforce this limit now.
       if (finalPhase != LINKING) {
         error("Pre-compiled objects found but linking not requested");
       }
       LinkageItems.push_back(I->first);
-      continue; // short circuit remainder of loop
+      ++I; continue; // short circuit remainder of loop
     }
 
     // At this point, we know its something we need to translate
@@ -364,18 +351,6 @@
     if (isDebug)
       DumpConfigData(cd,I->second);
 
-    // We have valid configuration data, now figure out where the output
-    // of compilation should end up.
-    std::string OutFile;
-    if (finalPhase != LINKING) {
-      if (InpList.size() == 1 && !Output.empty()) 
-        OutFile = Output;
-      else
-        OutFile = RemoveSuffix(I->first) + OutputSuffix;
-    } else {
-      OutFile = Output;
-    }
-
     // Initialize the input file
     std::string InFile(I->first);
 
@@ -443,33 +418,35 @@
     action = cd->Optimizer;
 
     // Get the optimization action, if needed, or error if appropriate
-    if (!action.program.empty() && !emitRawCode) {
-      if (action.isSet(REQUIRED_FLAG) || finalPhase == OPTIMIZATION) {
-        if (finalPhase == OPTIMIZATION)
-          actions.push_back(GetAction(cd,InFile,OutFile,OPTIMIZATION));
-        else {
-          actions.push_back(GetAction(cd,InFile,TempOptimizerOut,OPTIMIZATION));
-          InFile = TempOptimizerOut;
-        }
-        // ll -> bc Helper
-        if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
-          /// The output of the translator is an LLVM Assembly program
-          /// We need to translate it to bytecode
-          Action* action = new Action();
-          action->program = "llvm-as";
-          action->args.push_back(InFile);
-          action->args.push_back("-f");
-          action->args.push_back("-o");
-          InFile += ".bc";
-          action->args.push_back(InFile);
-          actions.push_back(action);
+    if (!emitRawCode) {
+      if (!action.program.empty()) {
+        if (action.isSet(REQUIRED_FLAG) || finalPhase == OPTIMIZATION) {
+          if (finalPhase == OPTIMIZATION)
+            actions.push_back(GetAction(cd,InFile,OutFile,OPTIMIZATION));
+          else {
+            actions.push_back(GetAction(cd,InFile,TempOptimizerOut,OPTIMIZATION));
+            InFile = TempOptimizerOut;
+          }
+          // ll -> bc Helper
+          if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
+            /// The output of the translator is an LLVM Assembly program
+            /// We need to translate it to bytecode
+            Action* action = new Action();
+            action->program = "llvm-as";
+            action->args.push_back(InFile);
+            action->args.push_back("-f");
+            action->args.push_back("-o");
+            InFile += ".bc";
+            action->args.push_back(InFile);
+            actions.push_back(action);
+          }
         }
-      }
-    } else if (finalPhase == OPTIMIZATION) {
-      error(cd->langName + " does not support optimization");
-    } else if (action.isSet(REQUIRED_FLAG)) {
-      error(std::string("Don't know how to optimize ") + 
+      } else if (finalPhase == OPTIMIZATION) {
+        error(cd->langName + " does not support optimization");
+      } else if (action.isSet(REQUIRED_FLAG)) {
+        error(std::string("Don't know how to optimize ") + 
             cd->langName + " files");
+      }
     }
 
     // Short-circuit remaining actions if all they want is optimization
@@ -478,13 +455,16 @@
     /// ASSEMBLY PHASE
     action = cd->Assembler;
 
-    if (finalPhase == ASSEMBLY) {
+    if (finalPhase == ASSEMBLY || emitNativeCode) {
       if (emitNativeCode) {
         if (action.program.empty()) {
           error(std::string("Native Assembler not specified for ") +
                 cd->langName + " files");
-        } else {
+        } else if (finalPhase == ASSEMBLY) {
           actions.push_back(GetAction(cd,InFile,OutFile,ASSEMBLY));
+        } else {
+          actions.push_back(GetAction(cd,InFile,TempAssemblerOut,ASSEMBLY));
+          InFile = TempAssemblerOut;
         }
       } else {
         // Just convert back to llvm assembly with llvm-dis
@@ -497,7 +477,13 @@
         actions.push_back(action);
       }
     }
+
+    // Short-circuit remaining actions if all they want is assembly output
+    if (finalPhase == ASSEMBLY) { ++I; continue; }
       
+    // Register the OutFile as a link candidate
+    LinkageItems.push_back(InFile);
+
     // Go to next file to be processed
     ++I;
   }
@@ -505,7 +491,61 @@
   /// LINKING PHASE
   if (finalPhase == LINKING) {
     if (emitNativeCode) {
+      error("llvmc doesn't know how to link native code yet");
     } else {
+      // First, we need to examine the files to ensure that they all contain
+      // bytecode files. Since the final output is bytecode, we can only
+      // link bytecode.
+      StringVector::const_iterator I = LinkageItems.begin();
+      StringVector::const_iterator E = LinkageItems.end();
+      StringVector lib_list;
+      while (I != E ) {
+        if (sys::FileIsReadable(*I)) {
+          if (CheckMagic(*I, "llvm")) {
+            // Examine the bytecode file for additional bytecode libraries to
+            // link in.
+            ModuleProvider* mp = getBytecodeModuleProvider(*I);
+            assert(mp!=0 && "Couldn't get module provider from bytecode file");
+            Module* M = mp->releaseModule();
+            assert(M!=0 && "Couldn't get module from module provider");
+            Module::lib_iterator LI = M->lib_begin();
+            Module::lib_iterator LE = M->lib_end();
+            while ( LI != LE ) {
+              if (sys::FileIsReadable(*LI)) {
+                if (CheckMagic(*I,"llvm")) {
+                  lib_list.push_back(*LI);
+                } else {
+                  error(std::string("Library '") + *LI + "' required by file '"
+                        + *I + "' is not an LLVM bytecode file");
+                }
+              } else {
+                error(std::string("Library '") + *LI + "' required by file '"
+                      + *I + "' is not readable");
+              }
+              ++I;
+            }
+          } else {
+            error(std::string("File '") + *I + " is not an LLVM byte code file");
+          } 
+        } else {
+          error(std::string("File '") + *I + " is not readable");
+        }
+        ++I;
+      }
+
+      // We're emitting bytecode so let's build an llvm-link Action
+      Action* link = new Action();
+      link->program = "llvm-link";
+      link->args = LinkageItems;
+      link->args.insert(link->args.end(), lib_list.begin(), lib_list.end());
+      link->args.push_back("-f");
+      link->args.push_back("-o");
+      link->args.push_back(OutFile);
+      if (timePasses)
+        link->args.push_back("-time-passes");
+      if (showStats)
+        link->args.push_back("-stats");
+      actions.push_back(link);
     }
   }
 
@@ -524,7 +564,7 @@
     ::sys::CleanupTempFile(TempOptimizerOut);
 
     // Cleanup temporary directory we created
-    if (::sys::FileReadable(TempDir))
+    if (::sys::FileIsReadable(TempDir))
       rmdir(TempDir.c_str());
   }
 






More information about the llvm-commits mailing list