[llvm-commits] CVS: llvm/tools/lli/ExecutionEngine.cpp ExecutionEngine.h lli.cpp

Brian Gaeke gaeke at cs.uiuc.edu
Fri Sep 5 13:43:02 PDT 2003


Changes in directory llvm/tools/lli:

ExecutionEngine.cpp updated: 1.26 -> 1.27
ExecutionEngine.h updated: 1.11 -> 1.12
lli.cpp updated: 1.25 -> 1.26

---
Log message:

Make CreateArgv part of lli rather than part of ExecutionEngine.
Switch Interpreter and JIT's "run" methods to take a Function and a vector of
 GenericValues.
Move (almost all of) the stuff that constructs a canonical call to main()
 into lli (new methods "callAsMain", "makeStringVector").
Nuke getCurrentExecutablePath(), enableTracing(), getCurrentFunction(),
 isStopped(), and many dead decls from interpreter.
Add linux strdup() support to interpreter.
Make interpreter's atexit handler runner and JIT's runAtExitHandlers() look
 more alike, in preparation for refactoring.
atexit() is spelled "atexit", not "at_exit".


---
Diffs of the changes:

Index: llvm/tools/lli/ExecutionEngine.cpp
diff -u llvm/tools/lli/ExecutionEngine.cpp:1.26 llvm/tools/lli/ExecutionEngine.cpp:1.27
--- llvm/tools/lli/ExecutionEngine.cpp:1.26	Thu Sep  4 17:57:27 2003
+++ llvm/tools/lli/ExecutionEngine.cpp	Fri Sep  5 13:41:58 2003
@@ -316,45 +316,6 @@
   }
 }
 
-void *ExecutionEngine::CreateArgv(const std::vector<std::string> &InputArgv) {
-  if (getTargetData().getPointerSize() == 8) {   // 64 bit target?
-    PointerTy *Result = new PointerTy[InputArgv.size()+1];
-    DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n");
-
-    for (unsigned i = 0; i < InputArgv.size(); ++i) {
-      unsigned Size = InputArgv[i].size()+1;
-      char *Dest = new char[Size];
-      DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n");
-      
-      copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
-      Dest[Size-1] = 0;
-      
-      // Endian safe: Result[i] = (PointerTy)Dest;
-      StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i), Type::LongTy);
-    }
-    Result[InputArgv.size()] = 0;
-    return Result;
-
-  } else {                                      // 32 bit target?
-    int *Result = new int[InputArgv.size()+1];
-    DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n");
-
-    for (unsigned i = 0; i < InputArgv.size(); ++i) {
-      unsigned Size = InputArgv[i].size()+1;
-      char *Dest = new char[Size];
-      DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n");
-      
-      copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
-      Dest[Size-1] = 0;
-      
-      // Endian safe: Result[i] = (PointerTy)Dest;
-      StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i), Type::IntTy);
-    }
-    Result[InputArgv.size()] = 0;  // null terminate it
-    return Result;
-  }
-}
-
 /// EmitGlobals - Emit all of the global variables to memory, storing their
 /// addresses into GlobalAddress.  This must make sure to copy the contents of
 /// their initializers into the memory.


Index: llvm/tools/lli/ExecutionEngine.h
diff -u llvm/tools/lli/ExecutionEngine.h:1.11 llvm/tools/lli/ExecutionEngine.h:1.12
--- llvm/tools/lli/ExecutionEngine.h:1.11	Fri Sep  5 01:10:50 2003
+++ llvm/tools/lli/ExecutionEngine.h	Fri Sep  5 13:41:58 2003
@@ -44,9 +44,8 @@
   /// run - Start execution with the specified function, arguments, and
   ///       environment.
   ///
-  virtual int run(const std::string &FnName,
-                  const std::vector<std::string> &Args,
-                  const char ** envp) = 0;
+  virtual GenericValue run(Function *F,
+                           const std::vector<GenericValue> &ArgValues) = 0;
 
   static ExecutionEngine *create (Module *M, bool ForceInterpreter,
 				  bool TraceMode);
@@ -83,7 +82,6 @@
   GenericValue getConstantValue(const Constant *C);
   void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
   GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty);
-  void *CreateArgv(const std::vector<std::string> &InputArgv);
   void InitializeMemory(const Constant *Init, void *Addr);
 };
 


Index: llvm/tools/lli/lli.cpp
diff -u llvm/tools/lli/lli.cpp:1.25 llvm/tools/lli/lli.cpp:1.26
--- llvm/tools/lli/lli.cpp:1.25	Thu Sep  4 17:57:27 2003
+++ llvm/tools/lli/lli.cpp	Fri Sep  5 13:41:58 2003
@@ -10,10 +10,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "ExecutionEngine.h"
+#include "GenericValue.h"
 #include "Support/CommandLine.h"
+#include "Support/Debug.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Module.h"
 #include "llvm/Target/TargetMachineImpls.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Target/TargetData.h"
 
 namespace {
   cl::opt<std::string>
@@ -33,10 +37,82 @@
 				 cl::init(false));
 }
 
+static std::vector<std::string> makeStringVector (const char **envp) {
+  std::vector<std::string> rv;
+  for (unsigned i = 0; envp[i]; ++i)
+    rv.push_back (envp[i]);
+  return rv;
+}
+
+static void *CreateArgv(ExecutionEngine *EE,
+			const std::vector<std::string> &InputArgv) {
+  if (EE->getTargetData().getPointerSize() == 8) {   // 64 bit target?
+    PointerTy *Result = new PointerTy[InputArgv.size()+1];
+    DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n");
+
+    for (unsigned i = 0; i < InputArgv.size(); ++i) {
+      unsigned Size = InputArgv[i].size()+1;
+      char *Dest = new char[Size];
+      DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n");
+      
+      std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
+      Dest[Size-1] = 0;
+      
+      // Endian safe: Result[i] = (PointerTy)Dest;
+      EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i),
+			     Type::LongTy);
+    }
+    Result[InputArgv.size()] = 0;
+    return Result;
+  } else {                                      // 32 bit target?
+    int *Result = new int[InputArgv.size()+1];
+    DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n");
+
+    for (unsigned i = 0; i < InputArgv.size(); ++i) {
+      unsigned Size = InputArgv[i].size()+1;
+      char *Dest = new char[Size];
+      DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n");
+      
+      std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
+      Dest[Size-1] = 0;
+      
+      // Endian safe: Result[i] = (PointerTy)Dest;
+      EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i),
+			     Type::IntTy);
+    }
+    Result[InputArgv.size()] = 0;  // null terminate it
+    return Result;
+  }
+}
+
+/// callAsMain - Call the function named FnName from M as if its
+/// signature were int main (int argc, char **argv, const char
+/// **envp), using the contents of Args to determine argc & argv, and
+/// the contents of EnvVars to determine envp.  Returns the result
+/// from calling FnName, or -1 and prints an error msg. if the named
+/// function cannot be found.
+///
+int callAsMain (ExecutionEngine *EE, Module *M, const std::string &FnName,
+                const std::vector<std::string> &Args,
+                const std::vector<std::string> &EnvVars) {
+  Function *Fn = M->getNamedFunction (FnName);
+  if (!Fn) {
+    std::cerr << "Function '" << FnName << "' not found in module.\n";
+    return -1;
+  }
+  std::vector<GenericValue> GVArgs;
+  GenericValue GVArgc;
+  GVArgc.IntVal = Args.size ();
+  GVArgs.push_back (GVArgc); // Arg #0 = argc.
+  GVArgs.push_back (PTOGV (CreateArgv (EE, Args))); // Arg #1 = argv.
+  GVArgs.push_back (PTOGV (CreateArgv (EE, EnvVars))); // Arg #2 = envp.
+  return EE->run (Fn, GVArgs).IntVal;
+}
+
 //===----------------------------------------------------------------------===//
 // main Driver function
 //
-int main(int argc, char** argv, const char ** envp) {
+int main(int argc, char **argv, const char **envp) {
   cl::ParseCommandLineOptions(argc, argv,
 			      " llvm interpreter & dynamic compiler\n");
 
@@ -64,7 +140,8 @@
   InputArgv.insert(InputArgv.begin(), InputFile);
 
   // Run the main function!
-  int ExitCode = EE->run(MainFunction, InputArgv, envp);
+  int ExitCode = callAsMain (EE, M, MainFunction, InputArgv,
+			     makeStringVector (envp)); 
 
   // Now that we are done executing the program, shut down the execution engine
   delete EE;





More information about the llvm-commits mailing list