1857c21b4SMisha Brukman //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===//
2996fe010SChris Lattner //
3482202a6SJohn Criswell //                     The LLVM Compiler Infrastructure
4482202a6SJohn Criswell //
5482202a6SJohn Criswell // This file was developed by the LLVM research group and is distributed under
6482202a6SJohn Criswell // the University of Illinois Open Source License. See LICENSE.TXT for details.
7482202a6SJohn Criswell //
8482202a6SJohn Criswell //===----------------------------------------------------------------------===//
9482202a6SJohn Criswell //
10996fe010SChris Lattner // This file defines the common interface used by the various execution engine
11996fe010SChris Lattner // subclasses.
12996fe010SChris Lattner //
13996fe010SChris Lattner //===----------------------------------------------------------------------===//
14996fe010SChris Lattner 
15ee937c80SChris Lattner #define DEBUG_TYPE "jit"
16996fe010SChris Lattner #include "llvm/Constants.h"
17260b0c88SMisha Brukman #include "llvm/DerivedTypes.h"
18996fe010SChris Lattner #include "llvm/Module.h"
19260b0c88SMisha Brukman #include "llvm/ModuleProvider.h"
2070e37278SReid Spencer #include "llvm/ADT/Statistic.h"
21260b0c88SMisha Brukman #include "llvm/ExecutionEngine/ExecutionEngine.h"
22ad481312SChris Lattner #include "llvm/ExecutionEngine/GenericValue.h"
237c16caa3SReid Spencer #include "llvm/Support/Debug.h"
246d8dd189SChris Lattner #include "llvm/Support/MutexGuard.h"
2570e37278SReid Spencer #include "llvm/System/DynamicLibrary.h"
2670e37278SReid Spencer #include "llvm/Target/TargetData.h"
2729681deeSChris Lattner using namespace llvm;
28996fe010SChris Lattner 
29c346ecd7SChris Lattner STATISTIC(NumInitBytes, "Number of bytes of global vars initialized");
30c346ecd7SChris Lattner STATISTIC(NumGlobals  , "Number of global vars initialized");
31996fe010SChris Lattner 
322d52c1b8SChris Lattner ExecutionEngine::EECtorFn ExecutionEngine::JITCtor = 0;
332d52c1b8SChris Lattner ExecutionEngine::EECtorFn ExecutionEngine::InterpCtor = 0;
342d52c1b8SChris Lattner 
350621caefSChris Lattner ExecutionEngine::ExecutionEngine(ModuleProvider *P) {
3687aee74cSChris Lattner   LazyCompilationDisabled = false;
370621caefSChris Lattner   Modules.push_back(P);
38260b0c88SMisha Brukman   assert(P && "ModuleProvider is null?");
39260b0c88SMisha Brukman }
40260b0c88SMisha Brukman 
410621caefSChris Lattner ExecutionEngine::ExecutionEngine(Module *M) {
4287aee74cSChris Lattner   LazyCompilationDisabled = false;
43260b0c88SMisha Brukman   assert(M && "Module is null?");
440621caefSChris Lattner   Modules.push_back(new ExistingModuleProvider(M));
45260b0c88SMisha Brukman }
46260b0c88SMisha Brukman 
4792f8b30dSBrian Gaeke ExecutionEngine::~ExecutionEngine() {
480621caefSChris Lattner   for (unsigned i = 0, e = Modules.size(); i != e; ++i)
490621caefSChris Lattner     delete Modules[i];
5092f8b30dSBrian Gaeke }
5192f8b30dSBrian Gaeke 
520621caefSChris Lattner /// FindFunctionNamed - Search all of the active modules to find the one that
530621caefSChris Lattner /// defines FnName.  This is very slow operation and shouldn't be used for
540621caefSChris Lattner /// general code.
550621caefSChris Lattner Function *ExecutionEngine::FindFunctionNamed(const char *FnName) {
560621caefSChris Lattner   for (unsigned i = 0, e = Modules.size(); i != e; ++i) {
571241d6d5SReid Spencer     if (Function *F = Modules[i]->getModule()->getFunction(FnName))
580621caefSChris Lattner       return F;
590621caefSChris Lattner   }
600621caefSChris Lattner   return 0;
610621caefSChris Lattner }
620621caefSChris Lattner 
630621caefSChris Lattner 
646d8dd189SChris Lattner /// addGlobalMapping - Tell the execution engine that the specified global is
656d8dd189SChris Lattner /// at the specified location.  This is used internally as functions are JIT'd
666d8dd189SChris Lattner /// and as global variables are laid out in memory.  It can and should also be
676d8dd189SChris Lattner /// used by clients of the EE that want to have an LLVM global overlay
686d8dd189SChris Lattner /// existing data in memory.
696d8dd189SChris Lattner void ExecutionEngine::addGlobalMapping(const GlobalValue *GV, void *Addr) {
706d8dd189SChris Lattner   MutexGuard locked(lock);
716d8dd189SChris Lattner 
726d8dd189SChris Lattner   void *&CurVal = state.getGlobalAddressMap(locked)[GV];
736d8dd189SChris Lattner   assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!");
746d8dd189SChris Lattner   CurVal = Addr;
756d8dd189SChris Lattner 
766d8dd189SChris Lattner   // If we are using the reverse mapping, add it too
776d8dd189SChris Lattner   if (!state.getGlobalAddressReverseMap(locked).empty()) {
786d8dd189SChris Lattner     const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr];
796d8dd189SChris Lattner     assert((V == 0 || GV == 0) && "GlobalMapping already established!");
806d8dd189SChris Lattner     V = GV;
816d8dd189SChris Lattner   }
826d8dd189SChris Lattner }
836d8dd189SChris Lattner 
846d8dd189SChris Lattner /// clearAllGlobalMappings - Clear all global mappings and start over again
856d8dd189SChris Lattner /// use in dynamic compilation scenarios when you want to move globals
866d8dd189SChris Lattner void ExecutionEngine::clearAllGlobalMappings() {
876d8dd189SChris Lattner   MutexGuard locked(lock);
886d8dd189SChris Lattner 
896d8dd189SChris Lattner   state.getGlobalAddressMap(locked).clear();
906d8dd189SChris Lattner   state.getGlobalAddressReverseMap(locked).clear();
916d8dd189SChris Lattner }
926d8dd189SChris Lattner 
936d8dd189SChris Lattner /// updateGlobalMapping - Replace an existing mapping for GV with a new
946d8dd189SChris Lattner /// address.  This updates both maps as required.  If "Addr" is null, the
956d8dd189SChris Lattner /// entry for the global is removed from the mappings.
966d8dd189SChris Lattner void ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) {
976d8dd189SChris Lattner   MutexGuard locked(lock);
986d8dd189SChris Lattner 
996d8dd189SChris Lattner   // Deleting from the mapping?
1006d8dd189SChris Lattner   if (Addr == 0) {
1016d8dd189SChris Lattner     state.getGlobalAddressMap(locked).erase(GV);
1026d8dd189SChris Lattner     if (!state.getGlobalAddressReverseMap(locked).empty())
1036d8dd189SChris Lattner       state.getGlobalAddressReverseMap(locked).erase(Addr);
1046d8dd189SChris Lattner     return;
1056d8dd189SChris Lattner   }
1066d8dd189SChris Lattner 
1076d8dd189SChris Lattner   void *&CurVal = state.getGlobalAddressMap(locked)[GV];
1086d8dd189SChris Lattner   if (CurVal && !state.getGlobalAddressReverseMap(locked).empty())
1096d8dd189SChris Lattner     state.getGlobalAddressReverseMap(locked).erase(CurVal);
1106d8dd189SChris Lattner   CurVal = Addr;
1116d8dd189SChris Lattner 
1126d8dd189SChris Lattner   // If we are using the reverse mapping, add it too
1136d8dd189SChris Lattner   if (!state.getGlobalAddressReverseMap(locked).empty()) {
1146d8dd189SChris Lattner     const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr];
1156d8dd189SChris Lattner     assert((V == 0 || GV == 0) && "GlobalMapping already established!");
1166d8dd189SChris Lattner     V = GV;
1176d8dd189SChris Lattner   }
1186d8dd189SChris Lattner }
1196d8dd189SChris Lattner 
1206d8dd189SChris Lattner /// getPointerToGlobalIfAvailable - This returns the address of the specified
1216d8dd189SChris Lattner /// global value if it is has already been codegen'd, otherwise it returns null.
1226d8dd189SChris Lattner ///
1236d8dd189SChris Lattner void *ExecutionEngine::getPointerToGlobalIfAvailable(const GlobalValue *GV) {
1246d8dd189SChris Lattner   MutexGuard locked(lock);
1256d8dd189SChris Lattner 
1266d8dd189SChris Lattner   std::map<const GlobalValue*, void*>::iterator I =
1276d8dd189SChris Lattner   state.getGlobalAddressMap(locked).find(GV);
1286d8dd189SChris Lattner   return I != state.getGlobalAddressMap(locked).end() ? I->second : 0;
1296d8dd189SChris Lattner }
1306d8dd189SChris Lattner 
131748e8579SChris Lattner /// getGlobalValueAtAddress - Return the LLVM global value object that starts
132748e8579SChris Lattner /// at the specified address.
133748e8579SChris Lattner ///
134748e8579SChris Lattner const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) {
13579876f52SReid Spencer   MutexGuard locked(lock);
13679876f52SReid Spencer 
137748e8579SChris Lattner   // If we haven't computed the reverse mapping yet, do so first.
13879876f52SReid Spencer   if (state.getGlobalAddressReverseMap(locked).empty()) {
1396d8dd189SChris Lattner     for (std::map<const GlobalValue*, void *>::iterator
1406d8dd189SChris Lattner          I = state.getGlobalAddressMap(locked).begin(),
1416d8dd189SChris Lattner          E = state.getGlobalAddressMap(locked).end(); I != E; ++I)
1426d8dd189SChris Lattner       state.getGlobalAddressReverseMap(locked).insert(std::make_pair(I->second,
1436d8dd189SChris Lattner                                                                      I->first));
144748e8579SChris Lattner   }
145748e8579SChris Lattner 
146748e8579SChris Lattner   std::map<void *, const GlobalValue*>::iterator I =
14779876f52SReid Spencer     state.getGlobalAddressReverseMap(locked).find(Addr);
14879876f52SReid Spencer   return I != state.getGlobalAddressReverseMap(locked).end() ? I->second : 0;
149748e8579SChris Lattner }
1505a0d4829SChris Lattner 
1515a0d4829SChris Lattner // CreateArgv - Turn a vector of strings into a nice argv style array of
1525a0d4829SChris Lattner // pointers to null terminated strings.
1535a0d4829SChris Lattner //
1545a0d4829SChris Lattner static void *CreateArgv(ExecutionEngine *EE,
1555a0d4829SChris Lattner                         const std::vector<std::string> &InputArgv) {
15620a631fdSOwen Anderson   unsigned PtrSize = EE->getTargetData()->getPointerSize();
1575a0d4829SChris Lattner   char *Result = new char[(InputArgv.size()+1)*PtrSize];
1585a0d4829SChris Lattner 
1595834fdb3SBill Wendling   DOUT << "ARGV = " << (void*)Result << "\n";
1600d54e78aSReid Spencer   const Type *SBytePtr = PointerType::get(Type::Int8Ty);
1615a0d4829SChris Lattner 
1625a0d4829SChris Lattner   for (unsigned i = 0; i != InputArgv.size(); ++i) {
1635a0d4829SChris Lattner     unsigned Size = InputArgv[i].size()+1;
1645a0d4829SChris Lattner     char *Dest = new char[Size];
1655834fdb3SBill Wendling     DOUT << "ARGV[" << i << "] = " << (void*)Dest << "\n";
1665a0d4829SChris Lattner 
1675a0d4829SChris Lattner     std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
1685a0d4829SChris Lattner     Dest[Size-1] = 0;
1695a0d4829SChris Lattner 
1705a0d4829SChris Lattner     // Endian safe: Result[i] = (PointerTy)Dest;
1715a0d4829SChris Lattner     EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i*PtrSize),
1725a0d4829SChris Lattner                            SBytePtr);
1735a0d4829SChris Lattner   }
1745a0d4829SChris Lattner 
1755a0d4829SChris Lattner   // Null terminate it
1765a0d4829SChris Lattner   EE->StoreValueToMemory(PTOGV(0),
1775a0d4829SChris Lattner                          (GenericValue*)(Result+InputArgv.size()*PtrSize),
1785a0d4829SChris Lattner                          SBytePtr);
1795a0d4829SChris Lattner   return Result;
1805a0d4829SChris Lattner }
1815a0d4829SChris Lattner 
182faae50b6SChris Lattner 
183faae50b6SChris Lattner /// runStaticConstructorsDestructors - This method is used to execute all of
1840621caefSChris Lattner /// the static constructors or destructors for a program, depending on the
185faae50b6SChris Lattner /// value of isDtors.
186faae50b6SChris Lattner void ExecutionEngine::runStaticConstructorsDestructors(bool isDtors) {
187faae50b6SChris Lattner   const char *Name = isDtors ? "llvm.global_dtors" : "llvm.global_ctors";
1880621caefSChris Lattner 
1890621caefSChris Lattner   // Execute global ctors/dtors for each module in the program.
1900621caefSChris Lattner   for (unsigned m = 0, e = Modules.size(); m != e; ++m) {
1910621caefSChris Lattner     GlobalVariable *GV = Modules[m]->getModule()->getNamedGlobal(Name);
192fe36eaebSChris Lattner 
193fe36eaebSChris Lattner     // If this global has internal linkage, or if it has a use, then it must be
194fe36eaebSChris Lattner     // an old-style (llvmgcc3) static ctor with __main linked in and in use.  If
1950621caefSChris Lattner     // this is the case, don't execute any of the global ctors, __main will do
1960621caefSChris Lattner     // it.
1975301e7c6SReid Spencer     if (!GV || GV->isDeclaration() || GV->hasInternalLinkage()) continue;
198faae50b6SChris Lattner 
1990621caefSChris Lattner     // Should be an array of '{ int, void ()* }' structs.  The first value is
2000621caefSChris Lattner     // the init priority, which we ignore.
201faae50b6SChris Lattner     ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer());
2020621caefSChris Lattner     if (!InitList) continue;
203faae50b6SChris Lattner     for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i)
2040621caefSChris Lattner       if (ConstantStruct *CS =
2050621caefSChris Lattner           dyn_cast<ConstantStruct>(InitList->getOperand(i))) {
2060621caefSChris Lattner         if (CS->getNumOperands() != 2) break; // Not array of 2-element structs.
207faae50b6SChris Lattner 
208faae50b6SChris Lattner         Constant *FP = CS->getOperand(1);
209faae50b6SChris Lattner         if (FP->isNullValue())
2100621caefSChris Lattner           break;  // Found a null terminator, exit.
211faae50b6SChris Lattner 
212faae50b6SChris Lattner         if (ConstantExpr *CE = dyn_cast<ConstantExpr>(FP))
2136c38f0bbSReid Spencer           if (CE->isCast())
214faae50b6SChris Lattner             FP = CE->getOperand(0);
215faae50b6SChris Lattner         if (Function *F = dyn_cast<Function>(FP)) {
216faae50b6SChris Lattner           // Execute the ctor/dtor function!
217faae50b6SChris Lattner           runFunction(F, std::vector<GenericValue>());
218faae50b6SChris Lattner         }
219faae50b6SChris Lattner       }
220faae50b6SChris Lattner   }
2210621caefSChris Lattner }
222faae50b6SChris Lattner 
2235a0d4829SChris Lattner /// runFunctionAsMain - This is a helper function which wraps runFunction to
2245a0d4829SChris Lattner /// handle the common task of starting up main with the specified argc, argv,
2255a0d4829SChris Lattner /// and envp parameters.
2265a0d4829SChris Lattner int ExecutionEngine::runFunctionAsMain(Function *Fn,
2275a0d4829SChris Lattner                                        const std::vector<std::string> &argv,
2285a0d4829SChris Lattner                                        const char * const * envp) {
2295a0d4829SChris Lattner   std::vector<GenericValue> GVArgs;
2305a0d4829SChris Lattner   GenericValue GVArgc;
2310d54e78aSReid Spencer   GVArgc.Int32Val = argv.size();
232b1cad0b3SChris Lattner   unsigned NumArgs = Fn->getFunctionType()->getNumParams();
233b1cad0b3SChris Lattner   if (NumArgs) {
2345a0d4829SChris Lattner     GVArgs.push_back(GVArgc); // Arg #0 = argc.
235b1cad0b3SChris Lattner     if (NumArgs > 1) {
2365a0d4829SChris Lattner       GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv.
237b1cad0b3SChris Lattner       assert(((char **)GVTOP(GVArgs[1]))[0] &&
238b1cad0b3SChris Lattner              "argv[0] was null after CreateArgv");
239b1cad0b3SChris Lattner       if (NumArgs > 2) {
2405a0d4829SChris Lattner         std::vector<std::string> EnvVars;
2415a0d4829SChris Lattner         for (unsigned i = 0; envp[i]; ++i)
2425a0d4829SChris Lattner           EnvVars.push_back(envp[i]);
2435a0d4829SChris Lattner         GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp.
244b1cad0b3SChris Lattner       }
245b1cad0b3SChris Lattner     }
246b1cad0b3SChris Lattner   }
2470d54e78aSReid Spencer   return runFunction(Fn, GVArgs).Int32Val;
2485a0d4829SChris Lattner }
2495a0d4829SChris Lattner 
250260b0c88SMisha Brukman /// If possible, create a JIT, unless the caller specifically requests an
251260b0c88SMisha Brukman /// Interpreter or there's an error. If even an Interpreter cannot be created,
252260b0c88SMisha Brukman /// NULL is returned.
253857c21b4SMisha Brukman ///
2542f1e2002SMisha Brukman ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
2550b2de9f2SChris Lattner                                          bool ForceInterpreter) {
2564bd3bd5bSBrian Gaeke   ExecutionEngine *EE = 0;
2574bd3bd5bSBrian Gaeke 
258c8c6c03dSChris Lattner   // Unless the interpreter was explicitly selected, try making a JIT.
2592d52c1b8SChris Lattner   if (!ForceInterpreter && JITCtor)
2600b2de9f2SChris Lattner     EE = JITCtor(MP);
2614bd3bd5bSBrian Gaeke 
2624bd3bd5bSBrian Gaeke   // If we can't make a JIT, make an interpreter instead.
2632d52c1b8SChris Lattner   if (EE == 0 && InterpCtor)
2640b2de9f2SChris Lattner     EE = InterpCtor(MP);
265c8c6c03dSChris Lattner 
2660b2de9f2SChris Lattner   if (EE) {
26770e37278SReid Spencer     // Make sure we can resolve symbols in the program as well. The zero arg
26870e37278SReid Spencer     // to the function tells DynamicLibrary to load the program, not a library.
26963539389SChris Lattner     try {
27070e37278SReid Spencer       sys::DynamicLibrary::LoadLibraryPermanently(0);
27163539389SChris Lattner     } catch (...) {
27263539389SChris Lattner     }
2730b2de9f2SChris Lattner   }
27470e37278SReid Spencer 
2754bd3bd5bSBrian Gaeke   return EE;
2764bd3bd5bSBrian Gaeke }
2774bd3bd5bSBrian Gaeke 
278857c21b4SMisha Brukman /// getPointerToGlobal - This returns the address of the specified global
279857c21b4SMisha Brukman /// value.  This may involve code generation if it's a function.
280857c21b4SMisha Brukman ///
281996fe010SChris Lattner void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) {
2821678e859SBrian Gaeke   if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV)))
283996fe010SChris Lattner     return getPointerToFunction(F);
284996fe010SChris Lattner 
28579876f52SReid Spencer   MutexGuard locked(lock);
28669e84901SJeff Cohen   void *p = state.getGlobalAddressMap(locked)[GV];
28769e84901SJeff Cohen   if (p)
28869e84901SJeff Cohen     return p;
28969e84901SJeff Cohen 
29069e84901SJeff Cohen   // Global variable might have been added since interpreter started.
29169e84901SJeff Cohen   if (GlobalVariable *GVar =
29269e84901SJeff Cohen           const_cast<GlobalVariable *>(dyn_cast<GlobalVariable>(GV)))
29369e84901SJeff Cohen     EmitGlobalVariable(GVar);
29469e84901SJeff Cohen   else
295*4da5e17cSChris Lattner     assert(0 && "Global hasn't had an address allocated yet!");
29679876f52SReid Spencer   return state.getGlobalAddressMap(locked)[GV];
297996fe010SChris Lattner }
298996fe010SChris Lattner 
2997a9c62baSReid Spencer /// This macro is used to handle a variety of situations involing integer
3007a9c62baSReid Spencer /// values where the action should be done to one of the GenericValue members.
3017a9c62baSReid Spencer /// THEINTTY is a const Type * for the integer type. ACTION1 comes before
3027a9c62baSReid Spencer /// the GenericValue, ACTION2 comes after.
3037a9c62baSReid Spencer #define DO_FOR_INTEGER(THEINTTY, ACTION) \
3047a9c62baSReid Spencer    { \
3057a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(THEINTTY)->getBitWidth(); \
3067a9c62baSReid Spencer       if (BitWidth == 1) {\
3077a9c62baSReid Spencer         ACTION(Int1Val); \
3087a9c62baSReid Spencer       } else if (BitWidth <= 8) {\
3097a9c62baSReid Spencer         ACTION(Int8Val); \
3107a9c62baSReid Spencer       } else if (BitWidth <= 16) {\
3117a9c62baSReid Spencer         ACTION(Int16Val); \
3127a9c62baSReid Spencer       } else if (BitWidth <= 32) { \
3137a9c62baSReid Spencer         ACTION(Int32Val); \
3147a9c62baSReid Spencer       } else if (BitWidth <= 64) { \
3157a9c62baSReid Spencer         ACTION(Int64Val); \
3167a9c62baSReid Spencer       } else   {\
3177a9c62baSReid Spencer         assert(0 && "Not implemented: integer types > 64 bits"); \
3187a9c62baSReid Spencer       } \
3197a9c62baSReid Spencer    }
3207a9c62baSReid Spencer 
3216c38f0bbSReid Spencer /// This function converts a Constant* into a GenericValue. The interesting
3226c38f0bbSReid Spencer /// part is if C is a ConstantExpr.
3236c38f0bbSReid Spencer /// @brief Get a GenericValue for a Constnat*
324996fe010SChris Lattner GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
3256c38f0bbSReid Spencer   // Declare the result as garbage.
326996fe010SChris Lattner   GenericValue Result;
3276c38f0bbSReid Spencer 
3286c38f0bbSReid Spencer   // If its undefined, return the garbage.
329d7a7a3f4SChris Lattner   if (isa<UndefValue>(C)) return Result;
3309de0d14dSChris Lattner 
3316c38f0bbSReid Spencer   // If the value is a ConstantExpr
3326c38f0bbSReid Spencer   if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
3339de0d14dSChris Lattner     switch (CE->getOpcode()) {
3349de0d14dSChris Lattner     case Instruction::GetElementPtr: {
3356c38f0bbSReid Spencer       // Compute the index
33668cbcc3eSChris Lattner       Result = getConstantValue(CE->getOperand(0));
337c44bd78aSChris Lattner       SmallVector<Value*, 8> Indices(CE->op_begin()+1, CE->op_end());
3389de0d14dSChris Lattner       uint64_t Offset =
339c44bd78aSChris Lattner         TD->getIndexedOffset(CE->getOperand(0)->getType(),
340c44bd78aSChris Lattner                              &Indices[0], Indices.size());
3419de0d14dSChris Lattner 
34220a631fdSOwen Anderson       if (getTargetData()->getPointerSize() == 4)
3430d54e78aSReid Spencer         Result.Int32Val += Offset;
344a551033eSChris Lattner       else
3450d54e78aSReid Spencer         Result.Int64Val += Offset;
3469de0d14dSChris Lattner       return Result;
3479de0d14dSChris Lattner     }
3486c38f0bbSReid Spencer     case Instruction::Trunc:
3496c38f0bbSReid Spencer     case Instruction::ZExt:
3506c38f0bbSReid Spencer     case Instruction::SExt:
3516c38f0bbSReid Spencer     case Instruction::FPTrunc:
3526c38f0bbSReid Spencer     case Instruction::FPExt:
3536c38f0bbSReid Spencer     case Instruction::UIToFP:
3546c38f0bbSReid Spencer     case Instruction::SIToFP:
3556c38f0bbSReid Spencer     case Instruction::FPToUI:
3566c38f0bbSReid Spencer     case Instruction::FPToSI:
3576c38f0bbSReid Spencer       break;
3586c38f0bbSReid Spencer     case Instruction::PtrToInt: {
35968cbcc3eSChris Lattner       Constant *Op = CE->getOperand(0);
3605def7a57SChris Lattner       GenericValue GV = getConstantValue(Op);
3616c38f0bbSReid Spencer       return GV;
3626c38f0bbSReid Spencer     }
3636c38f0bbSReid Spencer     case Instruction::BitCast: {
3646c38f0bbSReid Spencer       // Bit casts are no-ops but we can only return the GV of the operand if
3656c38f0bbSReid Spencer       // they are the same basic type (pointer->pointer, packed->packed, etc.)
3666c38f0bbSReid Spencer       Constant *Op = CE->getOperand(0);
3676c38f0bbSReid Spencer       GenericValue GV = getConstantValue(Op);
3686b727599SChris Lattner       if (Op->getType()->getTypeID() == C->getType()->getTypeID())
3695def7a57SChris Lattner         return GV;
3706c38f0bbSReid Spencer       break;
3716c38f0bbSReid Spencer     }
3726c38f0bbSReid Spencer     case Instruction::IntToPtr: {
3736c38f0bbSReid Spencer       // IntToPtr casts are just so special. Cast to intptr_t first.
3746c38f0bbSReid Spencer       Constant *Op = CE->getOperand(0);
3756c38f0bbSReid Spencer       GenericValue GV = getConstantValue(Op);
3767a9c62baSReid Spencer #define INT_TO_PTR_ACTION(FIELD) \
3777a9c62baSReid Spencer         return PTOGV((void*)(uintptr_t)GV.FIELD)
3787a9c62baSReid Spencer       DO_FOR_INTEGER(Op->getType(), INT_TO_PTR_ACTION)
3797a9c62baSReid Spencer #undef INT_TO_PTR_ACTION
38068cbcc3eSChris Lattner       break;
38168cbcc3eSChris Lattner     }
38268cbcc3eSChris Lattner     case Instruction::Add:
383c4e6bb5fSChris Lattner       switch (CE->getOperand(0)->getType()->getTypeID()) {
384c4e6bb5fSChris Lattner       default: assert(0 && "Bad add type!"); abort();
3857a9c62baSReid Spencer       case Type::IntegerTyID:
3867a9c62baSReid Spencer #define ADD_ACTION(FIELD) \
3877a9c62baSReid Spencer         Result.FIELD = getConstantValue(CE->getOperand(0)).FIELD + \
3887a9c62baSReid Spencer                        getConstantValue(CE->getOperand(1)).FIELD;
3897a9c62baSReid Spencer         DO_FOR_INTEGER(CE->getOperand(0)->getType(),ADD_ACTION);
3907a9c62baSReid Spencer #undef ADD_ACTION
391c4e6bb5fSChris Lattner         break;
392c4e6bb5fSChris Lattner       case Type::FloatTyID:
393c4e6bb5fSChris Lattner         Result.FloatVal = getConstantValue(CE->getOperand(0)).FloatVal +
394c4e6bb5fSChris Lattner                           getConstantValue(CE->getOperand(1)).FloatVal;
395c4e6bb5fSChris Lattner         break;
396c4e6bb5fSChris Lattner       case Type::DoubleTyID:
397c4e6bb5fSChris Lattner         Result.DoubleVal = getConstantValue(CE->getOperand(0)).DoubleVal +
398c4e6bb5fSChris Lattner                            getConstantValue(CE->getOperand(1)).DoubleVal;
399c4e6bb5fSChris Lattner         break;
400c4e6bb5fSChris Lattner       }
40168cbcc3eSChris Lattner       return Result;
4029de0d14dSChris Lattner     default:
40368cbcc3eSChris Lattner       break;
40468cbcc3eSChris Lattner     }
405f3baad3eSBill Wendling     cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
4069de0d14dSChris Lattner     abort();
4079de0d14dSChris Lattner   }
408996fe010SChris Lattner 
4096b727599SChris Lattner   switch (C->getType()->getTypeID()) {
410e0fc4dfcSReid Spencer #define GET_CONST_VAL(TY, CTY, CLASS, GETMETH) \
411e0fc4dfcSReid Spencer   case Type::TY##TyID: Result.TY##Val = (CTY)cast<CLASS>(C)->GETMETH(); break
412e0fc4dfcSReid Spencer     GET_CONST_VAL(Float , float         , ConstantFP, getValue);
413e0fc4dfcSReid Spencer     GET_CONST_VAL(Double, double        , ConstantFP, getValue);
414996fe010SChris Lattner #undef GET_CONST_VAL
4157a9c62baSReid Spencer   case Type::IntegerTyID: {
4167a9c62baSReid Spencer     unsigned BitWidth = cast<IntegerType>(C->getType())->getBitWidth();
4177a9c62baSReid Spencer     if (BitWidth == 1)
4187a9c62baSReid Spencer       Result.Int1Val = (bool)cast<ConstantInt>(C)->getZExtValue();
4197a9c62baSReid Spencer     else if (BitWidth <= 8)
4207a9c62baSReid Spencer       Result.Int8Val = (uint8_t )cast<ConstantInt>(C)->getZExtValue();
4217a9c62baSReid Spencer     else if (BitWidth <= 16)
4227a9c62baSReid Spencer       Result.Int16Val = (uint16_t )cast<ConstantInt>(C)->getZExtValue();
4237a9c62baSReid Spencer     else if (BitWidth <= 32)
4247a9c62baSReid Spencer       Result.Int32Val = (uint32_t )cast<ConstantInt>(C)->getZExtValue();
4257a9c62baSReid Spencer     else if (BitWidth <= 64)
4267a9c62baSReid Spencer       Result.Int64Val = (uint64_t )cast<ConstantInt>(C)->getZExtValue();
4277a9c62baSReid Spencer     else
428*4da5e17cSChris Lattner       assert(0 && "Integers with > 64-bits not implemented");
4297a9c62baSReid Spencer     break;
4307a9c62baSReid Spencer   }
4317a9c62baSReid Spencer 
432996fe010SChris Lattner   case Type::PointerTyID:
4336a0fd73bSReid Spencer     if (isa<ConstantPointerNull>(C))
434996fe010SChris Lattner       Result.PointerVal = 0;
4356a0fd73bSReid Spencer     else if (const Function *F = dyn_cast<Function>(C))
4366a0fd73bSReid Spencer       Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F)));
4376a0fd73bSReid Spencer     else if (const GlobalVariable* GV = dyn_cast<GlobalVariable>(C))
4386a0fd73bSReid Spencer       Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV)));
439e6492f10SChris Lattner     else
440996fe010SChris Lattner       assert(0 && "Unknown constant pointer type!");
441996fe010SChris Lattner     break;
442996fe010SChris Lattner   default:
443f3baad3eSBill Wendling     cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n";
4449de0d14dSChris Lattner     abort();
445996fe010SChris Lattner   }
446996fe010SChris Lattner   return Result;
447996fe010SChris Lattner }
448996fe010SChris Lattner 
4494ca2ea5bSNate Begeman /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr.  Ptr
4504ca2ea5bSNate Begeman /// is the address of the memory at which to store Val, cast to GenericValue *.
4514ca2ea5bSNate Begeman /// It is not a pointer to a GenericValue containing the address at which to
4524ca2ea5bSNate Begeman /// store Val.
453857c21b4SMisha Brukman ///
454996fe010SChris Lattner void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
455996fe010SChris Lattner                                          const Type *Ty) {
45620a631fdSOwen Anderson   if (getTargetData()->isLittleEndian()) {
4576b727599SChris Lattner     switch (Ty->getTypeID()) {
4587a9c62baSReid Spencer     case Type::IntegerTyID: {
4597a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
460a94d394aSReid Spencer       uint64_t BitMask = cast<IntegerType>(Ty)->getBitMask();
46101f7e06dSReid Spencer       GenericValue TmpVal = Val;
4627a9c62baSReid Spencer       if (BitWidth <= 8)
46301f7e06dSReid Spencer         Ptr->Untyped[0] = Val.Int8Val & BitMask;
4647a9c62baSReid Spencer       else if (BitWidth <= 16) {
46501f7e06dSReid Spencer         TmpVal.Int16Val &= BitMask;
46601f7e06dSReid Spencer         Ptr->Untyped[0] = TmpVal.Int16Val        & 255;
46701f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int16Val >> 8) & 255;
4687a9c62baSReid Spencer       } else if (BitWidth <= 32) {
46901f7e06dSReid Spencer         TmpVal.Int32Val &= BitMask;
47001f7e06dSReid Spencer         Ptr->Untyped[0] =  TmpVal.Int32Val        & 255;
47101f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int32Val >>  8) & 255;
47201f7e06dSReid Spencer         Ptr->Untyped[2] = (TmpVal.Int32Val >> 16) & 255;
47301f7e06dSReid Spencer         Ptr->Untyped[3] = (TmpVal.Int32Val >> 24) & 255;
4747a9c62baSReid Spencer       } else if (BitWidth <= 64) {
47501f7e06dSReid Spencer         TmpVal.Int64Val &= BitMask;
47601f7e06dSReid Spencer         Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val      );
47701f7e06dSReid Spencer         Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >>  8);
47801f7e06dSReid Spencer         Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 16);
47901f7e06dSReid Spencer         Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 24);
48001f7e06dSReid Spencer         Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 32);
48101f7e06dSReid Spencer         Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 40);
48201f7e06dSReid Spencer         Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 48);
48301f7e06dSReid Spencer         Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val >> 56);
4847a9c62baSReid Spencer       } else
4857a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
486996fe010SChris Lattner       break;
4877a9c62baSReid Spencer     }
488b348952dSChris Lattner Store4BytesLittleEndian:
489996fe010SChris Lattner     case Type::FloatTyID:
4907a9c62baSReid Spencer       Ptr->Untyped[0] =  Val.Int32Val        & 255;
4910d54e78aSReid Spencer       Ptr->Untyped[1] = (Val.Int32Val >>  8) & 255;
4920d54e78aSReid Spencer       Ptr->Untyped[2] = (Val.Int32Val >> 16) & 255;
4930d54e78aSReid Spencer       Ptr->Untyped[3] = (Val.Int32Val >> 24) & 255;
494996fe010SChris Lattner       break;
4957a9c62baSReid Spencer     case Type::PointerTyID:
4967a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
497b348952dSChris Lattner         goto Store4BytesLittleEndian;
4987a9c62baSReid Spencer       /* FALL THROUGH */
499996fe010SChris Lattner     case Type::DoubleTyID:
5000d54e78aSReid Spencer       Ptr->Untyped[0] = (unsigned char)(Val.Int64Val      );
5010d54e78aSReid Spencer       Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >>  8);
5020d54e78aSReid Spencer       Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 16);
5030d54e78aSReid Spencer       Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 24);
5040d54e78aSReid Spencer       Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 32);
5050d54e78aSReid Spencer       Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 40);
5060d54e78aSReid Spencer       Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 48);
5070d54e78aSReid Spencer       Ptr->Untyped[7] = (unsigned char)(Val.Int64Val >> 56);
508996fe010SChris Lattner       break;
509996fe010SChris Lattner     default:
510f3baad3eSBill Wendling       cerr << "Cannot store value of type " << *Ty << "!\n";
511996fe010SChris Lattner     }
512996fe010SChris Lattner   } else {
5136b727599SChris Lattner     switch (Ty->getTypeID()) {
5147a9c62baSReid Spencer     case Type::IntegerTyID: {
5157a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
516a94d394aSReid Spencer       uint64_t BitMask = cast<IntegerType>(Ty)->getBitMask();
51701f7e06dSReid Spencer       GenericValue TmpVal = Val;
5187a9c62baSReid Spencer       if (BitWidth <= 8)
51901f7e06dSReid Spencer         Ptr->Untyped[0] = Val.Int8Val & BitMask;
5207a9c62baSReid Spencer       else if (BitWidth <= 16) {
52101f7e06dSReid Spencer         TmpVal.Int16Val &= BitMask;
52201f7e06dSReid Spencer         Ptr->Untyped[1] =  TmpVal.Int16Val       & 255;
52301f7e06dSReid Spencer         Ptr->Untyped[0] = (TmpVal.Int16Val >> 8) & 255;
5247a9c62baSReid Spencer       } else if (BitWidth <= 32) {
52501f7e06dSReid Spencer         TmpVal.Int32Val &= BitMask;
52601f7e06dSReid Spencer         Ptr->Untyped[3] =  TmpVal.Int32Val        & 255;
52701f7e06dSReid Spencer         Ptr->Untyped[2] = (TmpVal.Int32Val >>  8) & 255;
52801f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int32Val >> 16) & 255;
52901f7e06dSReid Spencer         Ptr->Untyped[0] = (TmpVal.Int32Val >> 24) & 255;
5307a9c62baSReid Spencer       } else if (BitWidth <= 64) {
53101f7e06dSReid Spencer         TmpVal.Int64Val &= BitMask;
53201f7e06dSReid Spencer         Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val      );
53301f7e06dSReid Spencer         Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >>  8);
53401f7e06dSReid Spencer         Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 16);
53501f7e06dSReid Spencer         Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 24);
53601f7e06dSReid Spencer         Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 32);
53701f7e06dSReid Spencer         Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 40);
53801f7e06dSReid Spencer         Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 48);
53901f7e06dSReid Spencer         Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val >> 56);
5407a9c62baSReid Spencer       } else
5417a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
542996fe010SChris Lattner       break;
5437a9c62baSReid Spencer     }
544b348952dSChris Lattner     Store4BytesBigEndian:
545996fe010SChris Lattner     case Type::FloatTyID:
5467a9c62baSReid Spencer       Ptr->Untyped[3] =  Val.Int32Val        & 255;
5470d54e78aSReid Spencer       Ptr->Untyped[2] = (Val.Int32Val >>  8) & 255;
5480d54e78aSReid Spencer       Ptr->Untyped[1] = (Val.Int32Val >> 16) & 255;
5490d54e78aSReid Spencer       Ptr->Untyped[0] = (Val.Int32Val >> 24) & 255;
550996fe010SChris Lattner       break;
5517a9c62baSReid Spencer     case Type::PointerTyID:
5527a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
553b348952dSChris Lattner         goto Store4BytesBigEndian;
5547a9c62baSReid Spencer       /* FALL THROUGH */
555996fe010SChris Lattner     case Type::DoubleTyID:
5560d54e78aSReid Spencer       Ptr->Untyped[7] = (unsigned char)(Val.Int64Val      );
5570d54e78aSReid Spencer       Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >>  8);
5580d54e78aSReid Spencer       Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 16);
5590d54e78aSReid Spencer       Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 24);
5600d54e78aSReid Spencer       Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 32);
5610d54e78aSReid Spencer       Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 40);
5620d54e78aSReid Spencer       Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 48);
5630d54e78aSReid Spencer       Ptr->Untyped[0] = (unsigned char)(Val.Int64Val >> 56);
564996fe010SChris Lattner       break;
565996fe010SChris Lattner     default:
566f3baad3eSBill Wendling       cerr << "Cannot store value of type " << *Ty << "!\n";
567996fe010SChris Lattner     }
568996fe010SChris Lattner   }
569996fe010SChris Lattner }
570996fe010SChris Lattner 
571857c21b4SMisha Brukman /// FIXME: document
572857c21b4SMisha Brukman ///
5737f389e8cSChris Lattner GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
5747f389e8cSChris Lattner                                                   const Type *Ty) {
5757f389e8cSChris Lattner   GenericValue Result;
57620a631fdSOwen Anderson   if (getTargetData()->isLittleEndian()) {
5776b727599SChris Lattner     switch (Ty->getTypeID()) {
5787a9c62baSReid Spencer     case Type::IntegerTyID: {
5797a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
5807a9c62baSReid Spencer       if (BitWidth <= 8)
5817a9c62baSReid Spencer         Result.Int8Val  = Ptr->Untyped[0];
5827a9c62baSReid Spencer       else if (BitWidth <= 16) {
5837a9c62baSReid Spencer         Result.Int16Val =  (unsigned)Ptr->Untyped[0] |
5847f389e8cSChris Lattner                           ((unsigned)Ptr->Untyped[1] << 8);
5857a9c62baSReid Spencer       } else if (BitWidth <= 32) {
5867a9c62baSReid Spencer         Result.Int32Val =  (unsigned)Ptr->Untyped[0] |
5877a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[1] <<  8) |
5887a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[2] << 16) |
5897a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[3] << 24);
5907a9c62baSReid Spencer       } else if (BitWidth <= 64) {
5917a9c62baSReid Spencer         Result.Int64Val =  (uint64_t)Ptr->Untyped[0] |
5927a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[1] <<  8) |
5937a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[2] << 16) |
5947a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[3] << 24) |
5957a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[4] << 32) |
5967a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[5] << 40) |
5977a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[6] << 48) |
5987a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[7] << 56);
5997a9c62baSReid Spencer       } else
6007a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
6017f389e8cSChris Lattner       break;
6027a9c62baSReid Spencer     }
6037f389e8cSChris Lattner     Load4BytesLittleEndian:
6047f389e8cSChris Lattner     case Type::FloatTyID:
6057a9c62baSReid Spencer       Result.Int32Val =  (unsigned)Ptr->Untyped[0] |
6067f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[1] <<  8) |
6077f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[2] << 16) |
6087f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[3] << 24);
6097f389e8cSChris Lattner       break;
6107a9c62baSReid Spencer     case Type::PointerTyID:
6117a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
6127f389e8cSChris Lattner         goto Load4BytesLittleEndian;
6137a9c62baSReid Spencer       /* FALL THROUGH */
6147f389e8cSChris Lattner     case Type::DoubleTyID:
6157a9c62baSReid Spencer       Result.Int64Val =  (uint64_t)Ptr->Untyped[0] |
6167f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[1] <<  8) |
6177f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[2] << 16) |
6187f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[3] << 24) |
6197f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[4] << 32) |
6207f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[5] << 40) |
6217f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[6] << 48) |
6227f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[7] << 56);
6237f389e8cSChris Lattner        break;
6247f389e8cSChris Lattner     default:
625f3baad3eSBill Wendling       cerr << "Cannot load value of type " << *Ty << "!\n";
6267f389e8cSChris Lattner       abort();
6277f389e8cSChris Lattner     }
6287f389e8cSChris Lattner   } else {
6296b727599SChris Lattner     switch (Ty->getTypeID()) {
6307a9c62baSReid Spencer     case Type::IntegerTyID: {
6317a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
6327a9c62baSReid Spencer       if (BitWidth <= 8)
6337a9c62baSReid Spencer         Result.Int8Val  = Ptr->Untyped[0];
6347a9c62baSReid Spencer       else if (BitWidth <= 16) {
6357a9c62baSReid Spencer         Result.Int16Val =  (unsigned)Ptr->Untyped[1] |
6367f389e8cSChris Lattner                           ((unsigned)Ptr->Untyped[0] << 8);
6377a9c62baSReid Spencer       } else if (BitWidth <= 32) {
6387a9c62baSReid Spencer         Result.Int32Val =  (unsigned)Ptr->Untyped[3] |
6397a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[2] <<  8) |
6407a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[1] << 16) |
6417a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[0] << 24);
6427a9c62baSReid Spencer       } else if (BitWidth <= 64) {
6437a9c62baSReid Spencer         Result.Int64Val =  (uint64_t)Ptr->Untyped[7] |
6447a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[6] <<  8) |
6457a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[5] << 16) |
6467a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[4] << 24) |
6477a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[3] << 32) |
6487a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[2] << 40) |
6497a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[1] << 48) |
6507a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[0] << 56);
6517a9c62baSReid Spencer       } else
6527a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
6537f389e8cSChris Lattner       break;
6547a9c62baSReid Spencer     }
6557f389e8cSChris Lattner     Load4BytesBigEndian:
6567f389e8cSChris Lattner     case Type::FloatTyID:
6577a9c62baSReid Spencer       Result.Int32Val =  (unsigned)Ptr->Untyped[3] |
6587f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[2] <<  8) |
6597f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[1] << 16) |
6607f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[0] << 24);
6617f389e8cSChris Lattner                             break;
6627a9c62baSReid Spencer     case Type::PointerTyID:
6637a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
6647f389e8cSChris Lattner         goto Load4BytesBigEndian;
6657a9c62baSReid Spencer       /* FALL THROUGH */
6667f389e8cSChris Lattner     case Type::DoubleTyID:
6677a9c62baSReid Spencer       Result.Int64Val =  (uint64_t)Ptr->Untyped[7] |
6687f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[6] <<  8) |
6697f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[5] << 16) |
6707f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[4] << 24) |
6717f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[3] << 32) |
6727f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[2] << 40) |
6737f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[1] << 48) |
6747f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[0] << 56);
6757f389e8cSChris Lattner       break;
6767f389e8cSChris Lattner     default:
677f3baad3eSBill Wendling       cerr << "Cannot load value of type " << *Ty << "!\n";
6787f389e8cSChris Lattner       abort();
6797f389e8cSChris Lattner     }
6807f389e8cSChris Lattner   }
6817f389e8cSChris Lattner   return Result;
6827f389e8cSChris Lattner }
6837f389e8cSChris Lattner 
684996fe010SChris Lattner // InitializeMemory - Recursive function to apply a Constant value into the
685996fe010SChris Lattner // specified memory location...
686996fe010SChris Lattner //
687996fe010SChris Lattner void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
68861753bf8SChris Lattner   if (isa<UndefValue>(Init)) {
68961753bf8SChris Lattner     return;
69069d62138SRobert Bocchino   } else if (const ConstantPacked *CP = dyn_cast<ConstantPacked>(Init)) {
69169d62138SRobert Bocchino     unsigned ElementSize =
69220a631fdSOwen Anderson       getTargetData()->getTypeSize(CP->getType()->getElementType());
69369d62138SRobert Bocchino     for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
69469d62138SRobert Bocchino       InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
69569d62138SRobert Bocchino     return;
69661753bf8SChris Lattner   } else if (Init->getType()->isFirstClassType()) {
697996fe010SChris Lattner     GenericValue Val = getConstantValue(Init);
698996fe010SChris Lattner     StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
699996fe010SChris Lattner     return;
700834b1272SChris Lattner   } else if (isa<ConstantAggregateZero>(Init)) {
70120a631fdSOwen Anderson     memset(Addr, 0, (size_t)getTargetData()->getTypeSize(Init->getType()));
702834b1272SChris Lattner     return;
703996fe010SChris Lattner   }
704996fe010SChris Lattner 
7056b727599SChris Lattner   switch (Init->getType()->getTypeID()) {
706996fe010SChris Lattner   case Type::ArrayTyID: {
707996fe010SChris Lattner     const ConstantArray *CPA = cast<ConstantArray>(Init);
708996fe010SChris Lattner     unsigned ElementSize =
70920a631fdSOwen Anderson       getTargetData()->getTypeSize(CPA->getType()->getElementType());
71083243725SAlkis Evlogimenos     for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
71183243725SAlkis Evlogimenos       InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
712996fe010SChris Lattner     return;
713996fe010SChris Lattner   }
714996fe010SChris Lattner 
715996fe010SChris Lattner   case Type::StructTyID: {
716996fe010SChris Lattner     const ConstantStruct *CPS = cast<ConstantStruct>(Init);
717996fe010SChris Lattner     const StructLayout *SL =
71820a631fdSOwen Anderson       getTargetData()->getStructLayout(cast<StructType>(CPS->getType()));
71983243725SAlkis Evlogimenos     for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
720c473d8e4SChris Lattner       InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
721996fe010SChris Lattner     return;
722996fe010SChris Lattner   }
723996fe010SChris Lattner 
724996fe010SChris Lattner   default:
725f3baad3eSBill Wendling     cerr << "Bad Type: " << *Init->getType() << "\n";
726996fe010SChris Lattner     assert(0 && "Unknown constant type to initialize memory with!");
727996fe010SChris Lattner   }
728996fe010SChris Lattner }
729996fe010SChris Lattner 
730996fe010SChris Lattner /// EmitGlobals - Emit all of the global variables to memory, storing their
731996fe010SChris Lattner /// addresses into GlobalAddress.  This must make sure to copy the contents of
732996fe010SChris Lattner /// their initializers into the memory.
733996fe010SChris Lattner ///
734996fe010SChris Lattner void ExecutionEngine::emitGlobals() {
73520a631fdSOwen Anderson   const TargetData *TD = getTargetData();
736996fe010SChris Lattner 
737996fe010SChris Lattner   // Loop over all of the global variables in the program, allocating the memory
7380621caefSChris Lattner   // to hold them.  If there is more than one module, do a prepass over globals
7390621caefSChris Lattner   // to figure out how the different modules should link together.
7400621caefSChris Lattner   //
7410621caefSChris Lattner   std::map<std::pair<std::string, const Type*>,
7420621caefSChris Lattner            const GlobalValue*> LinkedGlobalsMap;
7430621caefSChris Lattner 
7440621caefSChris Lattner   if (Modules.size() != 1) {
7450621caefSChris Lattner     for (unsigned m = 0, e = Modules.size(); m != e; ++m) {
7460621caefSChris Lattner       Module &M = *Modules[m]->getModule();
7470621caefSChris Lattner       for (Module::const_global_iterator I = M.global_begin(),
7480621caefSChris Lattner            E = M.global_end(); I != E; ++I) {
7490621caefSChris Lattner         const GlobalValue *GV = I;
7505301e7c6SReid Spencer         if (GV->hasInternalLinkage() || GV->isDeclaration() ||
7510621caefSChris Lattner             GV->hasAppendingLinkage() || !GV->hasName())
7520621caefSChris Lattner           continue;// Ignore external globals and globals with internal linkage.
7530621caefSChris Lattner 
7540621caefSChris Lattner         const GlobalValue *&GVEntry =
7550621caefSChris Lattner           LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())];
7560621caefSChris Lattner 
7570621caefSChris Lattner         // If this is the first time we've seen this global, it is the canonical
7580621caefSChris Lattner         // version.
7590621caefSChris Lattner         if (!GVEntry) {
7600621caefSChris Lattner           GVEntry = GV;
7610621caefSChris Lattner           continue;
7620621caefSChris Lattner         }
7630621caefSChris Lattner 
7640621caefSChris Lattner         // If the existing global is strong, never replace it.
765d61d39ecSAnton Korobeynikov         if (GVEntry->hasExternalLinkage() ||
766d61d39ecSAnton Korobeynikov             GVEntry->hasDLLImportLinkage() ||
767d61d39ecSAnton Korobeynikov             GVEntry->hasDLLExportLinkage())
7680621caefSChris Lattner           continue;
7690621caefSChris Lattner 
7700621caefSChris Lattner         // Otherwise, we know it's linkonce/weak, replace it if this is a strong
7710621caefSChris Lattner         // symbol.
77212c94949SAnton Korobeynikov         if (GV->hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
7730621caefSChris Lattner           GVEntry = GV;
7740621caefSChris Lattner       }
7750621caefSChris Lattner     }
7760621caefSChris Lattner   }
7770621caefSChris Lattner 
7780621caefSChris Lattner   std::vector<const GlobalValue*> NonCanonicalGlobals;
7790621caefSChris Lattner   for (unsigned m = 0, e = Modules.size(); m != e; ++m) {
7800621caefSChris Lattner     Module &M = *Modules[m]->getModule();
7818ffb6611SChris Lattner     for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
7820621caefSChris Lattner          I != E; ++I) {
7830621caefSChris Lattner       // In the multi-module case, see what this global maps to.
7840621caefSChris Lattner       if (!LinkedGlobalsMap.empty()) {
7850621caefSChris Lattner         if (const GlobalValue *GVEntry =
7860621caefSChris Lattner               LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) {
7870621caefSChris Lattner           // If something else is the canonical global, ignore this one.
7880621caefSChris Lattner           if (GVEntry != &*I) {
7890621caefSChris Lattner             NonCanonicalGlobals.push_back(I);
7900621caefSChris Lattner             continue;
7910621caefSChris Lattner           }
7920621caefSChris Lattner         }
7930621caefSChris Lattner       }
7940621caefSChris Lattner 
7955301e7c6SReid Spencer       if (!I->isDeclaration()) {
7960621caefSChris Lattner         // Get the type of the global.
797996fe010SChris Lattner         const Type *Ty = I->getType()->getElementType();
798996fe010SChris Lattner 
799996fe010SChris Lattner         // Allocate some memory for it!
80020a631fdSOwen Anderson         unsigned Size = TD->getTypeSize(Ty);
8016bbe3eceSChris Lattner         addGlobalMapping(I, new char[Size]);
802996fe010SChris Lattner       } else {
803e8bbcfc2SBrian Gaeke         // External variable reference. Try to use the dynamic loader to
804e8bbcfc2SBrian Gaeke         // get a pointer to it.
8050621caefSChris Lattner         if (void *SymAddr =
8060621caefSChris Lattner             sys::DynamicLibrary::SearchForAddressOfSymbol(I->getName().c_str()))
807748e8579SChris Lattner           addGlobalMapping(I, SymAddr);
8089de0d14dSChris Lattner         else {
809f3baad3eSBill Wendling           cerr << "Could not resolve external global address: "
8109de0d14dSChris Lattner                << I->getName() << "\n";
8119de0d14dSChris Lattner           abort();
8129de0d14dSChris Lattner         }
813996fe010SChris Lattner       }
8140621caefSChris Lattner     }
8150621caefSChris Lattner 
8160621caefSChris Lattner     // If there are multiple modules, map the non-canonical globals to their
8170621caefSChris Lattner     // canonical location.
8180621caefSChris Lattner     if (!NonCanonicalGlobals.empty()) {
8190621caefSChris Lattner       for (unsigned i = 0, e = NonCanonicalGlobals.size(); i != e; ++i) {
8200621caefSChris Lattner         const GlobalValue *GV = NonCanonicalGlobals[i];
8210621caefSChris Lattner         const GlobalValue *CGV =
8220621caefSChris Lattner           LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())];
8230621caefSChris Lattner         void *Ptr = getPointerToGlobalIfAvailable(CGV);
8240621caefSChris Lattner         assert(Ptr && "Canonical global wasn't codegen'd!");
8250621caefSChris Lattner         addGlobalMapping(GV, getPointerToGlobalIfAvailable(CGV));
8260621caefSChris Lattner       }
8270621caefSChris Lattner     }
828996fe010SChris Lattner 
8297a9c62baSReid Spencer     // Now that all of the globals are set up in memory, loop through them all
8307a9c62baSReid Spencer     // and initialize their contents.
8318ffb6611SChris Lattner     for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
8320621caefSChris Lattner          I != E; ++I) {
8335301e7c6SReid Spencer       if (!I->isDeclaration()) {
8340621caefSChris Lattner         if (!LinkedGlobalsMap.empty()) {
8350621caefSChris Lattner           if (const GlobalValue *GVEntry =
8360621caefSChris Lattner                 LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())])
8370621caefSChris Lattner             if (GVEntry != &*I)  // Not the canonical variable.
8380621caefSChris Lattner               continue;
8390621caefSChris Lattner         }
8406bbe3eceSChris Lattner         EmitGlobalVariable(I);
8416bbe3eceSChris Lattner       }
8420621caefSChris Lattner     }
8430621caefSChris Lattner   }
8440621caefSChris Lattner }
8456bbe3eceSChris Lattner 
8466bbe3eceSChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the
8476bbe3eceSChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not
8486bbe3eceSChris Lattner // already in the map.
849fbcc0aa1SChris Lattner void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
850748e8579SChris Lattner   void *GA = getPointerToGlobalIfAvailable(GV);
8515834fdb3SBill Wendling   DOUT << "Global '" << GV->getName() << "' -> " << GA << "\n";
852dc631735SChris Lattner 
853fbcc0aa1SChris Lattner   const Type *ElTy = GV->getType()->getElementType();
85420a631fdSOwen Anderson   size_t GVSize = (size_t)getTargetData()->getTypeSize(ElTy);
8556bbe3eceSChris Lattner   if (GA == 0) {
8566bbe3eceSChris Lattner     // If it's not already specified, allocate memory for the global.
857d215992bSChris Lattner     GA = new char[GVSize];
858748e8579SChris Lattner     addGlobalMapping(GV, GA);
8596bbe3eceSChris Lattner   }
860fbcc0aa1SChris Lattner 
8616bbe3eceSChris Lattner   InitializeMemory(GV->getInitializer(), GA);
862df1f1524SChris Lattner   NumInitBytes += (unsigned)GVSize;
8636bbe3eceSChris Lattner   ++NumGlobals;
864996fe010SChris Lattner }
865