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

Chris Lattner lattner at cs.uiuc.edu
Wed Apr 23 14:02:01 PDT 2003


Changes in directory llvm/tools/lli:

ExecutionEngine.cpp updated: 1.5 -> 1.6

---
Log message:

* Implement access to external variables in LLI
* Implement GetElementPtr constant expressions when initializing global variables


---
Diffs of the changes:

Index: llvm/tools/lli/ExecutionEngine.cpp
diff -u llvm/tools/lli/ExecutionEngine.cpp:1.5 llvm/tools/lli/ExecutionEngine.cpp:1.6
--- llvm/tools/lli/ExecutionEngine.cpp:1.5	Mon Apr 21 17:44:36 2003
+++ llvm/tools/lli/ExecutionEngine.cpp	Wed Apr 23 14:01:49 2003
@@ -12,6 +12,7 @@
 #include "llvm/Module.h"
 #include "llvm/Target/TargetData.h"
 #include "Support/Statistic.h"
+#include <dlfcn.h>
 
 Statistic<> NumInitBytes("lli", "Number of bytes of global vars initialized");
 
@@ -29,10 +30,28 @@
 
 GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
   GenericValue Result;
-#define GET_CONST_VAL(TY, CLASS) \
-  case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break
+
+  if (ConstantExpr *CE = (ConstantExpr*)dyn_cast<ConstantExpr>(C))
+    switch (CE->getOpcode()) {
+    case Instruction::GetElementPtr: {
+      Result = getConstantValue(cast<Constant>(CE->getOperand(0)));
+      std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end());
+      uint64_t Offset =
+        TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes);
+                             
+      Result.LongVal += Offset;
+      return Result;
+    }
+
+    default:
+      std::cerr << "ConstantExpr not handled as global var init: " << *CE
+                << "\n";
+      abort();
+    }
 
   switch (C->getType()->getPrimitiveID()) {
+#define GET_CONST_VAL(TY, CLASS) \
+  case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break
     GET_CONST_VAL(Bool   , ConstantBool);
     GET_CONST_VAL(UByte  , ConstantUInt);
     GET_CONST_VAL(SByte  , ConstantSInt);
@@ -57,6 +76,7 @@
     break;
   default:
     std::cout << "ERROR: Constant unimp for type: " << C->getType() << "\n";
+    abort();
   }
   return Result;
 }
@@ -213,15 +233,16 @@
 
       DEBUG(std::cerr << "Global '" << I->getName() << "' -> "
 	              << (void*)GlobalAddress[I] << "\n");
-    } else if (I->getName() == "stdout") {
-      GlobalAddress[I] = &stdout;
-    } else if (I->getName() == "stderr") {
-      GlobalAddress[I] = &stderr;
-    } else if (I->getName() == "stdin") {
-      GlobalAddress[I] = &stdin;
     } else {
-      std::cerr << "Global: " << I->getName() << "\n";
-      assert(0 && "References to external globals not handled yet!");
+      // External variable reference, try to use dlsym to get a pointer to it in
+      // the LLI image.
+      if (void *SymAddr = dlsym(0, I->getName().c_str()))
+        GlobalAddress[I] = SymAddr;
+      else {
+        std::cerr << "Could not resolve external global address: "
+                  << I->getName() << "\n";
+        abort();
+      }
     }
   
   // Now that all of the globals are set up in memory, loop through them all and





More information about the llvm-commits mailing list