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) {
570621caefSChris Lattner     if (Function *F = Modules[i]->getModule()->getNamedFunction(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.
1970621caefSChris Lattner     if (!GV || GV->isExternal() || 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
29569e84901SJeff Cohen     assert("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));
3379de0d14dSChris Lattner       std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end());
3389de0d14dSChris Lattner       uint64_t Offset =
3399de0d14dSChris Lattner         TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes);
3409de0d14dSChris Lattner 
34120a631fdSOwen Anderson       if (getTargetData()->getPointerSize() == 4)
3420d54e78aSReid Spencer         Result.Int32Val += Offset;
343a551033eSChris Lattner       else
3440d54e78aSReid Spencer         Result.Int64Val += Offset;
3459de0d14dSChris Lattner       return Result;
3469de0d14dSChris Lattner     }
3476c38f0bbSReid Spencer     case Instruction::Trunc:
3486c38f0bbSReid Spencer     case Instruction::ZExt:
3496c38f0bbSReid Spencer     case Instruction::SExt:
3506c38f0bbSReid Spencer     case Instruction::FPTrunc:
3516c38f0bbSReid Spencer     case Instruction::FPExt:
3526c38f0bbSReid Spencer     case Instruction::UIToFP:
3536c38f0bbSReid Spencer     case Instruction::SIToFP:
3546c38f0bbSReid Spencer     case Instruction::FPToUI:
3556c38f0bbSReid Spencer     case Instruction::FPToSI:
3566c38f0bbSReid Spencer       break;
3576c38f0bbSReid Spencer     case Instruction::PtrToInt: {
35868cbcc3eSChris Lattner       Constant *Op = CE->getOperand(0);
3595def7a57SChris Lattner       GenericValue GV = getConstantValue(Op);
3606c38f0bbSReid Spencer       return GV;
3616c38f0bbSReid Spencer     }
3626c38f0bbSReid Spencer     case Instruction::BitCast: {
3636c38f0bbSReid Spencer       // Bit casts are no-ops but we can only return the GV of the operand if
3646c38f0bbSReid Spencer       // they are the same basic type (pointer->pointer, packed->packed, etc.)
3656c38f0bbSReid Spencer       Constant *Op = CE->getOperand(0);
3666c38f0bbSReid Spencer       GenericValue GV = getConstantValue(Op);
3676b727599SChris Lattner       if (Op->getType()->getTypeID() == C->getType()->getTypeID())
3685def7a57SChris Lattner         return GV;
3696c38f0bbSReid Spencer       break;
3706c38f0bbSReid Spencer     }
3716c38f0bbSReid Spencer     case Instruction::IntToPtr: {
3726c38f0bbSReid Spencer       // IntToPtr casts are just so special. Cast to intptr_t first.
3736c38f0bbSReid Spencer       Constant *Op = CE->getOperand(0);
3746c38f0bbSReid Spencer       GenericValue GV = getConstantValue(Op);
3757a9c62baSReid Spencer #define INT_TO_PTR_ACTION(FIELD) \
3767a9c62baSReid Spencer         return PTOGV((void*)(uintptr_t)GV.FIELD)
3777a9c62baSReid Spencer       DO_FOR_INTEGER(Op->getType(), INT_TO_PTR_ACTION)
3787a9c62baSReid Spencer #undef INT_TO_PTR_ACTION
37968cbcc3eSChris Lattner       break;
38068cbcc3eSChris Lattner     }
38168cbcc3eSChris Lattner     case Instruction::Add:
382c4e6bb5fSChris Lattner       switch (CE->getOperand(0)->getType()->getTypeID()) {
383c4e6bb5fSChris Lattner       default: assert(0 && "Bad add type!"); abort();
3847a9c62baSReid Spencer       case Type::IntegerTyID:
3857a9c62baSReid Spencer #define ADD_ACTION(FIELD) \
3867a9c62baSReid Spencer         Result.FIELD = getConstantValue(CE->getOperand(0)).FIELD + \
3877a9c62baSReid Spencer                        getConstantValue(CE->getOperand(1)).FIELD;
3887a9c62baSReid Spencer         DO_FOR_INTEGER(CE->getOperand(0)->getType(),ADD_ACTION);
3897a9c62baSReid Spencer #undef ADD_ACTION
390c4e6bb5fSChris Lattner         break;
391c4e6bb5fSChris Lattner       case Type::FloatTyID:
392c4e6bb5fSChris Lattner         Result.FloatVal = getConstantValue(CE->getOperand(0)).FloatVal +
393c4e6bb5fSChris Lattner                           getConstantValue(CE->getOperand(1)).FloatVal;
394c4e6bb5fSChris Lattner         break;
395c4e6bb5fSChris Lattner       case Type::DoubleTyID:
396c4e6bb5fSChris Lattner         Result.DoubleVal = getConstantValue(CE->getOperand(0)).DoubleVal +
397c4e6bb5fSChris Lattner                            getConstantValue(CE->getOperand(1)).DoubleVal;
398c4e6bb5fSChris Lattner         break;
399c4e6bb5fSChris Lattner       }
40068cbcc3eSChris Lattner       return Result;
4019de0d14dSChris Lattner     default:
40268cbcc3eSChris Lattner       break;
40368cbcc3eSChris Lattner     }
404f3baad3eSBill Wendling     cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
4059de0d14dSChris Lattner     abort();
4069de0d14dSChris Lattner   }
407996fe010SChris Lattner 
4086b727599SChris Lattner   switch (C->getType()->getTypeID()) {
409e0fc4dfcSReid Spencer #define GET_CONST_VAL(TY, CTY, CLASS, GETMETH) \
410e0fc4dfcSReid Spencer   case Type::TY##TyID: Result.TY##Val = (CTY)cast<CLASS>(C)->GETMETH(); break
411e0fc4dfcSReid Spencer     GET_CONST_VAL(Float , float         , ConstantFP, getValue);
412e0fc4dfcSReid Spencer     GET_CONST_VAL(Double, double        , ConstantFP, getValue);
413996fe010SChris Lattner #undef GET_CONST_VAL
4147a9c62baSReid Spencer   case Type::IntegerTyID: {
4157a9c62baSReid Spencer     unsigned BitWidth = cast<IntegerType>(C->getType())->getBitWidth();
4167a9c62baSReid Spencer     if (BitWidth == 1)
4177a9c62baSReid Spencer       Result.Int1Val = (bool)cast<ConstantInt>(C)->getZExtValue();
4187a9c62baSReid Spencer     else if (BitWidth <= 8)
4197a9c62baSReid Spencer       Result.Int8Val = (uint8_t )cast<ConstantInt>(C)->getZExtValue();
4207a9c62baSReid Spencer     else if (BitWidth <= 16)
4217a9c62baSReid Spencer       Result.Int16Val = (uint16_t )cast<ConstantInt>(C)->getZExtValue();
4227a9c62baSReid Spencer     else if (BitWidth <= 32)
4237a9c62baSReid Spencer       Result.Int32Val = (uint32_t )cast<ConstantInt>(C)->getZExtValue();
4247a9c62baSReid Spencer     else if (BitWidth <= 64)
4257a9c62baSReid Spencer       Result.Int64Val = (uint64_t )cast<ConstantInt>(C)->getZExtValue();
4267a9c62baSReid Spencer     else
4277a9c62baSReid Spencer       assert("Integers with > 64-bits not implemented");
4287a9c62baSReid Spencer     break;
4297a9c62baSReid Spencer   }
4307a9c62baSReid Spencer 
431996fe010SChris Lattner   case Type::PointerTyID:
4326a0fd73bSReid Spencer     if (isa<ConstantPointerNull>(C))
433996fe010SChris Lattner       Result.PointerVal = 0;
4346a0fd73bSReid Spencer     else if (const Function *F = dyn_cast<Function>(C))
4356a0fd73bSReid Spencer       Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F)));
4366a0fd73bSReid Spencer     else if (const GlobalVariable* GV = dyn_cast<GlobalVariable>(C))
4376a0fd73bSReid Spencer       Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV)));
438e6492f10SChris Lattner     else
439996fe010SChris Lattner       assert(0 && "Unknown constant pointer type!");
440996fe010SChris Lattner     break;
441996fe010SChris Lattner   default:
442f3baad3eSBill Wendling     cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n";
4439de0d14dSChris Lattner     abort();
444996fe010SChris Lattner   }
445996fe010SChris Lattner   return Result;
446996fe010SChris Lattner }
447996fe010SChris Lattner 
4484ca2ea5bSNate Begeman /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr.  Ptr
4494ca2ea5bSNate Begeman /// is the address of the memory at which to store Val, cast to GenericValue *.
4504ca2ea5bSNate Begeman /// It is not a pointer to a GenericValue containing the address at which to
4514ca2ea5bSNate Begeman /// store Val.
452857c21b4SMisha Brukman ///
453996fe010SChris Lattner void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
454996fe010SChris Lattner                                          const Type *Ty) {
45520a631fdSOwen Anderson   if (getTargetData()->isLittleEndian()) {
4566b727599SChris Lattner     switch (Ty->getTypeID()) {
4577a9c62baSReid Spencer     case Type::IntegerTyID: {
4587a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
459*01f7e06dSReid Spencer       uint64_t BitMask = (1ull << BitWidth) - 1;
460*01f7e06dSReid Spencer       GenericValue TmpVal = Val;
4617a9c62baSReid Spencer       if (BitWidth <= 8)
462*01f7e06dSReid Spencer         Ptr->Untyped[0] = Val.Int8Val & BitMask;
4637a9c62baSReid Spencer       else if (BitWidth <= 16) {
464*01f7e06dSReid Spencer         TmpVal.Int16Val &= BitMask;
465*01f7e06dSReid Spencer         Ptr->Untyped[0] = TmpVal.Int16Val        & 255;
466*01f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int16Val >> 8) & 255;
4677a9c62baSReid Spencer       } else if (BitWidth <= 32) {
468*01f7e06dSReid Spencer         TmpVal.Int32Val &= BitMask;
469*01f7e06dSReid Spencer         Ptr->Untyped[0] =  TmpVal.Int32Val        & 255;
470*01f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int32Val >>  8) & 255;
471*01f7e06dSReid Spencer         Ptr->Untyped[2] = (TmpVal.Int32Val >> 16) & 255;
472*01f7e06dSReid Spencer         Ptr->Untyped[3] = (TmpVal.Int32Val >> 24) & 255;
4737a9c62baSReid Spencer       } else if (BitWidth <= 64) {
474*01f7e06dSReid Spencer         TmpVal.Int64Val &= BitMask;
475*01f7e06dSReid Spencer         Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val      );
476*01f7e06dSReid Spencer         Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >>  8);
477*01f7e06dSReid Spencer         Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 16);
478*01f7e06dSReid Spencer         Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 24);
479*01f7e06dSReid Spencer         Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 32);
480*01f7e06dSReid Spencer         Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 40);
481*01f7e06dSReid Spencer         Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 48);
482*01f7e06dSReid Spencer         Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val >> 56);
4837a9c62baSReid Spencer       } else
4847a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
485996fe010SChris Lattner       break;
4867a9c62baSReid Spencer     }
487b348952dSChris Lattner Store4BytesLittleEndian:
488996fe010SChris Lattner     case Type::FloatTyID:
4897a9c62baSReid Spencer       Ptr->Untyped[0] =  Val.Int32Val        & 255;
4900d54e78aSReid Spencer       Ptr->Untyped[1] = (Val.Int32Val >>  8) & 255;
4910d54e78aSReid Spencer       Ptr->Untyped[2] = (Val.Int32Val >> 16) & 255;
4920d54e78aSReid Spencer       Ptr->Untyped[3] = (Val.Int32Val >> 24) & 255;
493996fe010SChris Lattner       break;
4947a9c62baSReid Spencer     case Type::PointerTyID:
4957a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
496b348952dSChris Lattner         goto Store4BytesLittleEndian;
4977a9c62baSReid Spencer       /* FALL THROUGH */
498996fe010SChris Lattner     case Type::DoubleTyID:
4990d54e78aSReid Spencer       Ptr->Untyped[0] = (unsigned char)(Val.Int64Val      );
5000d54e78aSReid Spencer       Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >>  8);
5010d54e78aSReid Spencer       Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 16);
5020d54e78aSReid Spencer       Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 24);
5030d54e78aSReid Spencer       Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 32);
5040d54e78aSReid Spencer       Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 40);
5050d54e78aSReid Spencer       Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 48);
5060d54e78aSReid Spencer       Ptr->Untyped[7] = (unsigned char)(Val.Int64Val >> 56);
507996fe010SChris Lattner       break;
508996fe010SChris Lattner     default:
509f3baad3eSBill Wendling       cerr << "Cannot store value of type " << *Ty << "!\n";
510996fe010SChris Lattner     }
511996fe010SChris Lattner   } else {
5126b727599SChris Lattner     switch (Ty->getTypeID()) {
5137a9c62baSReid Spencer     case Type::IntegerTyID: {
5147a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
515*01f7e06dSReid Spencer       uint64_t BitMask = (1ull << BitWidth) - 1;
516*01f7e06dSReid Spencer       GenericValue TmpVal = Val;
5177a9c62baSReid Spencer       if (BitWidth <= 8)
518*01f7e06dSReid Spencer         Ptr->Untyped[0] = Val.Int8Val & BitMask;
5197a9c62baSReid Spencer       else if (BitWidth <= 16) {
520*01f7e06dSReid Spencer         TmpVal.Int16Val &= BitMask;
521*01f7e06dSReid Spencer         Ptr->Untyped[1] =  TmpVal.Int16Val       & 255;
522*01f7e06dSReid Spencer         Ptr->Untyped[0] = (TmpVal.Int16Val >> 8) & 255;
5237a9c62baSReid Spencer       } else if (BitWidth <= 32) {
524*01f7e06dSReid Spencer         TmpVal.Int32Val &= BitMask;
525*01f7e06dSReid Spencer         Ptr->Untyped[3] =  TmpVal.Int32Val        & 255;
526*01f7e06dSReid Spencer         Ptr->Untyped[2] = (TmpVal.Int32Val >>  8) & 255;
527*01f7e06dSReid Spencer         Ptr->Untyped[1] = (TmpVal.Int32Val >> 16) & 255;
528*01f7e06dSReid Spencer         Ptr->Untyped[0] = (TmpVal.Int32Val >> 24) & 255;
5297a9c62baSReid Spencer       } else if (BitWidth <= 64) {
530*01f7e06dSReid Spencer         TmpVal.Int64Val &= BitMask;
531*01f7e06dSReid Spencer         Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val      );
532*01f7e06dSReid Spencer         Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >>  8);
533*01f7e06dSReid Spencer         Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 16);
534*01f7e06dSReid Spencer         Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 24);
535*01f7e06dSReid Spencer         Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 32);
536*01f7e06dSReid Spencer         Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 40);
537*01f7e06dSReid Spencer         Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 48);
538*01f7e06dSReid Spencer         Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val >> 56);
5397a9c62baSReid Spencer       } else
5407a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
541996fe010SChris Lattner       break;
5427a9c62baSReid Spencer     }
543b348952dSChris Lattner     Store4BytesBigEndian:
544996fe010SChris Lattner     case Type::FloatTyID:
5457a9c62baSReid Spencer       Ptr->Untyped[3] =  Val.Int32Val        & 255;
5460d54e78aSReid Spencer       Ptr->Untyped[2] = (Val.Int32Val >>  8) & 255;
5470d54e78aSReid Spencer       Ptr->Untyped[1] = (Val.Int32Val >> 16) & 255;
5480d54e78aSReid Spencer       Ptr->Untyped[0] = (Val.Int32Val >> 24) & 255;
549996fe010SChris Lattner       break;
5507a9c62baSReid Spencer     case Type::PointerTyID:
5517a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
552b348952dSChris Lattner         goto Store4BytesBigEndian;
5537a9c62baSReid Spencer       /* FALL THROUGH */
554996fe010SChris Lattner     case Type::DoubleTyID:
5550d54e78aSReid Spencer       Ptr->Untyped[7] = (unsigned char)(Val.Int64Val      );
5560d54e78aSReid Spencer       Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >>  8);
5570d54e78aSReid Spencer       Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 16);
5580d54e78aSReid Spencer       Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 24);
5590d54e78aSReid Spencer       Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 32);
5600d54e78aSReid Spencer       Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 40);
5610d54e78aSReid Spencer       Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 48);
5620d54e78aSReid Spencer       Ptr->Untyped[0] = (unsigned char)(Val.Int64Val >> 56);
563996fe010SChris Lattner       break;
564996fe010SChris Lattner     default:
565f3baad3eSBill Wendling       cerr << "Cannot store value of type " << *Ty << "!\n";
566996fe010SChris Lattner     }
567996fe010SChris Lattner   }
568996fe010SChris Lattner }
569996fe010SChris Lattner 
570857c21b4SMisha Brukman /// FIXME: document
571857c21b4SMisha Brukman ///
5727f389e8cSChris Lattner GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
5737f389e8cSChris Lattner                                                   const Type *Ty) {
5747f389e8cSChris Lattner   GenericValue Result;
57520a631fdSOwen Anderson   if (getTargetData()->isLittleEndian()) {
5766b727599SChris Lattner     switch (Ty->getTypeID()) {
5777a9c62baSReid Spencer     case Type::IntegerTyID: {
5787a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
5797a9c62baSReid Spencer       if (BitWidth <= 8)
5807a9c62baSReid Spencer         Result.Int8Val  = Ptr->Untyped[0];
5817a9c62baSReid Spencer       else if (BitWidth <= 16) {
5827a9c62baSReid Spencer         Result.Int16Val =  (unsigned)Ptr->Untyped[0] |
5837f389e8cSChris Lattner                           ((unsigned)Ptr->Untyped[1] << 8);
5847a9c62baSReid Spencer       } else if (BitWidth <= 32) {
5857a9c62baSReid Spencer         Result.Int32Val =  (unsigned)Ptr->Untyped[0] |
5867a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[1] <<  8) |
5877a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[2] << 16) |
5887a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[3] << 24);
5897a9c62baSReid Spencer       } else if (BitWidth <= 64) {
5907a9c62baSReid Spencer         Result.Int64Val =  (uint64_t)Ptr->Untyped[0] |
5917a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[1] <<  8) |
5927a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[2] << 16) |
5937a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[3] << 24) |
5947a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[4] << 32) |
5957a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[5] << 40) |
5967a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[6] << 48) |
5977a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[7] << 56);
5987a9c62baSReid Spencer       } else
5997a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
6007f389e8cSChris Lattner       break;
6017a9c62baSReid Spencer     }
6027f389e8cSChris Lattner     Load4BytesLittleEndian:
6037f389e8cSChris Lattner     case Type::FloatTyID:
6047a9c62baSReid Spencer       Result.Int32Val =  (unsigned)Ptr->Untyped[0] |
6057f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[1] <<  8) |
6067f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[2] << 16) |
6077f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[3] << 24);
6087f389e8cSChris Lattner       break;
6097a9c62baSReid Spencer     case Type::PointerTyID:
6107a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
6117f389e8cSChris Lattner         goto Load4BytesLittleEndian;
6127a9c62baSReid Spencer       /* FALL THROUGH */
6137f389e8cSChris Lattner     case Type::DoubleTyID:
6147a9c62baSReid Spencer       Result.Int64Val =  (uint64_t)Ptr->Untyped[0] |
6157f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[1] <<  8) |
6167f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[2] << 16) |
6177f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[3] << 24) |
6187f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[4] << 32) |
6197f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[5] << 40) |
6207f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[6] << 48) |
6217f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[7] << 56);
6227f389e8cSChris Lattner        break;
6237f389e8cSChris Lattner     default:
624f3baad3eSBill Wendling       cerr << "Cannot load value of type " << *Ty << "!\n";
6257f389e8cSChris Lattner       abort();
6267f389e8cSChris Lattner     }
6277f389e8cSChris Lattner   } else {
6286b727599SChris Lattner     switch (Ty->getTypeID()) {
6297a9c62baSReid Spencer     case Type::IntegerTyID: {
6307a9c62baSReid Spencer       unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
6317a9c62baSReid Spencer       if (BitWidth <= 8)
6327a9c62baSReid Spencer         Result.Int8Val  = Ptr->Untyped[0];
6337a9c62baSReid Spencer       else if (BitWidth <= 16) {
6347a9c62baSReid Spencer         Result.Int16Val =  (unsigned)Ptr->Untyped[1] |
6357f389e8cSChris Lattner                           ((unsigned)Ptr->Untyped[0] << 8);
6367a9c62baSReid Spencer       } else if (BitWidth <= 32) {
6377a9c62baSReid Spencer         Result.Int32Val =  (unsigned)Ptr->Untyped[3] |
6387a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[2] <<  8) |
6397a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[1] << 16) |
6407a9c62baSReid Spencer                           ((unsigned)Ptr->Untyped[0] << 24);
6417a9c62baSReid Spencer       } else if (BitWidth <= 64) {
6427a9c62baSReid Spencer         Result.Int64Val =  (uint64_t)Ptr->Untyped[7] |
6437a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[6] <<  8) |
6447a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[5] << 16) |
6457a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[4] << 24) |
6467a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[3] << 32) |
6477a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[2] << 40) |
6487a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[1] << 48) |
6497a9c62baSReid Spencer                           ((uint64_t)Ptr->Untyped[0] << 56);
6507a9c62baSReid Spencer       } else
6517a9c62baSReid Spencer         assert(0 && "Integer types > 64 bits not supported");
6527f389e8cSChris Lattner       break;
6537a9c62baSReid Spencer     }
6547f389e8cSChris Lattner     Load4BytesBigEndian:
6557f389e8cSChris Lattner     case Type::FloatTyID:
6567a9c62baSReid Spencer       Result.Int32Val =  (unsigned)Ptr->Untyped[3] |
6577f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[2] <<  8) |
6587f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[1] << 16) |
6597f389e8cSChris Lattner                         ((unsigned)Ptr->Untyped[0] << 24);
6607f389e8cSChris Lattner                             break;
6617a9c62baSReid Spencer     case Type::PointerTyID:
6627a9c62baSReid Spencer       if (getTargetData()->getPointerSize() == 4)
6637f389e8cSChris Lattner         goto Load4BytesBigEndian;
6647a9c62baSReid Spencer       /* FALL THROUGH */
6657f389e8cSChris Lattner     case Type::DoubleTyID:
6667a9c62baSReid Spencer       Result.Int64Val =  (uint64_t)Ptr->Untyped[7] |
6677f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[6] <<  8) |
6687f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[5] << 16) |
6697f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[4] << 24) |
6707f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[3] << 32) |
6717f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[2] << 40) |
6727f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[1] << 48) |
6737f389e8cSChris Lattner                         ((uint64_t)Ptr->Untyped[0] << 56);
6747f389e8cSChris Lattner       break;
6757f389e8cSChris Lattner     default:
676f3baad3eSBill Wendling       cerr << "Cannot load value of type " << *Ty << "!\n";
6777f389e8cSChris Lattner       abort();
6787f389e8cSChris Lattner     }
6797f389e8cSChris Lattner   }
6807f389e8cSChris Lattner   return Result;
6817f389e8cSChris Lattner }
6827f389e8cSChris Lattner 
683996fe010SChris Lattner // InitializeMemory - Recursive function to apply a Constant value into the
684996fe010SChris Lattner // specified memory location...
685996fe010SChris Lattner //
686996fe010SChris Lattner void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
68761753bf8SChris Lattner   if (isa<UndefValue>(Init)) {
68861753bf8SChris Lattner     return;
68969d62138SRobert Bocchino   } else if (const ConstantPacked *CP = dyn_cast<ConstantPacked>(Init)) {
69069d62138SRobert Bocchino     unsigned ElementSize =
69120a631fdSOwen Anderson       getTargetData()->getTypeSize(CP->getType()->getElementType());
69269d62138SRobert Bocchino     for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
69369d62138SRobert Bocchino       InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
69469d62138SRobert Bocchino     return;
69561753bf8SChris Lattner   } else if (Init->getType()->isFirstClassType()) {
696996fe010SChris Lattner     GenericValue Val = getConstantValue(Init);
697996fe010SChris Lattner     StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
698996fe010SChris Lattner     return;
699834b1272SChris Lattner   } else if (isa<ConstantAggregateZero>(Init)) {
70020a631fdSOwen Anderson     memset(Addr, 0, (size_t)getTargetData()->getTypeSize(Init->getType()));
701834b1272SChris Lattner     return;
702996fe010SChris Lattner   }
703996fe010SChris Lattner 
7046b727599SChris Lattner   switch (Init->getType()->getTypeID()) {
705996fe010SChris Lattner   case Type::ArrayTyID: {
706996fe010SChris Lattner     const ConstantArray *CPA = cast<ConstantArray>(Init);
707996fe010SChris Lattner     unsigned ElementSize =
70820a631fdSOwen Anderson       getTargetData()->getTypeSize(CPA->getType()->getElementType());
70983243725SAlkis Evlogimenos     for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
71083243725SAlkis Evlogimenos       InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
711996fe010SChris Lattner     return;
712996fe010SChris Lattner   }
713996fe010SChris Lattner 
714996fe010SChris Lattner   case Type::StructTyID: {
715996fe010SChris Lattner     const ConstantStruct *CPS = cast<ConstantStruct>(Init);
716996fe010SChris Lattner     const StructLayout *SL =
71720a631fdSOwen Anderson       getTargetData()->getStructLayout(cast<StructType>(CPS->getType()));
71883243725SAlkis Evlogimenos     for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
71983243725SAlkis Evlogimenos       InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->MemberOffsets[i]);
720996fe010SChris Lattner     return;
721996fe010SChris Lattner   }
722996fe010SChris Lattner 
723996fe010SChris Lattner   default:
724f3baad3eSBill Wendling     cerr << "Bad Type: " << *Init->getType() << "\n";
725996fe010SChris Lattner     assert(0 && "Unknown constant type to initialize memory with!");
726996fe010SChris Lattner   }
727996fe010SChris Lattner }
728996fe010SChris Lattner 
729996fe010SChris Lattner /// EmitGlobals - Emit all of the global variables to memory, storing their
730996fe010SChris Lattner /// addresses into GlobalAddress.  This must make sure to copy the contents of
731996fe010SChris Lattner /// their initializers into the memory.
732996fe010SChris Lattner ///
733996fe010SChris Lattner void ExecutionEngine::emitGlobals() {
73420a631fdSOwen Anderson   const TargetData *TD = getTargetData();
735996fe010SChris Lattner 
736996fe010SChris Lattner   // Loop over all of the global variables in the program, allocating the memory
7370621caefSChris Lattner   // to hold them.  If there is more than one module, do a prepass over globals
7380621caefSChris Lattner   // to figure out how the different modules should link together.
7390621caefSChris Lattner   //
7400621caefSChris Lattner   std::map<std::pair<std::string, const Type*>,
7410621caefSChris Lattner            const GlobalValue*> LinkedGlobalsMap;
7420621caefSChris Lattner 
7430621caefSChris Lattner   if (Modules.size() != 1) {
7440621caefSChris Lattner     for (unsigned m = 0, e = Modules.size(); m != e; ++m) {
7450621caefSChris Lattner       Module &M = *Modules[m]->getModule();
7460621caefSChris Lattner       for (Module::const_global_iterator I = M.global_begin(),
7470621caefSChris Lattner            E = M.global_end(); I != E; ++I) {
7480621caefSChris Lattner         const GlobalValue *GV = I;
7490621caefSChris Lattner         if (GV->hasInternalLinkage() || GV->isExternal() ||
7500621caefSChris Lattner             GV->hasAppendingLinkage() || !GV->hasName())
7510621caefSChris Lattner           continue;// Ignore external globals and globals with internal linkage.
7520621caefSChris Lattner 
7530621caefSChris Lattner         const GlobalValue *&GVEntry =
7540621caefSChris Lattner           LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())];
7550621caefSChris Lattner 
7560621caefSChris Lattner         // If this is the first time we've seen this global, it is the canonical
7570621caefSChris Lattner         // version.
7580621caefSChris Lattner         if (!GVEntry) {
7590621caefSChris Lattner           GVEntry = GV;
7600621caefSChris Lattner           continue;
7610621caefSChris Lattner         }
7620621caefSChris Lattner 
7630621caefSChris Lattner         // If the existing global is strong, never replace it.
764d61d39ecSAnton Korobeynikov         if (GVEntry->hasExternalLinkage() ||
765d61d39ecSAnton Korobeynikov             GVEntry->hasDLLImportLinkage() ||
766d61d39ecSAnton Korobeynikov             GVEntry->hasDLLExportLinkage())
7670621caefSChris Lattner           continue;
7680621caefSChris Lattner 
7690621caefSChris Lattner         // Otherwise, we know it's linkonce/weak, replace it if this is a strong
7700621caefSChris Lattner         // symbol.
77112c94949SAnton Korobeynikov         if (GV->hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
7720621caefSChris Lattner           GVEntry = GV;
7730621caefSChris Lattner       }
7740621caefSChris Lattner     }
7750621caefSChris Lattner   }
7760621caefSChris Lattner 
7770621caefSChris Lattner   std::vector<const GlobalValue*> NonCanonicalGlobals;
7780621caefSChris Lattner   for (unsigned m = 0, e = Modules.size(); m != e; ++m) {
7790621caefSChris Lattner     Module &M = *Modules[m]->getModule();
7808ffb6611SChris Lattner     for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
7810621caefSChris Lattner          I != E; ++I) {
7820621caefSChris Lattner       // In the multi-module case, see what this global maps to.
7830621caefSChris Lattner       if (!LinkedGlobalsMap.empty()) {
7840621caefSChris Lattner         if (const GlobalValue *GVEntry =
7850621caefSChris Lattner               LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) {
7860621caefSChris Lattner           // If something else is the canonical global, ignore this one.
7870621caefSChris Lattner           if (GVEntry != &*I) {
7880621caefSChris Lattner             NonCanonicalGlobals.push_back(I);
7890621caefSChris Lattner             continue;
7900621caefSChris Lattner           }
7910621caefSChris Lattner         }
7920621caefSChris Lattner       }
7930621caefSChris Lattner 
794996fe010SChris Lattner       if (!I->isExternal()) {
7950621caefSChris Lattner         // Get the type of the global.
796996fe010SChris Lattner         const Type *Ty = I->getType()->getElementType();
797996fe010SChris Lattner 
798996fe010SChris Lattner         // Allocate some memory for it!
79920a631fdSOwen Anderson         unsigned Size = TD->getTypeSize(Ty);
8006bbe3eceSChris Lattner         addGlobalMapping(I, new char[Size]);
801996fe010SChris Lattner       } else {
802e8bbcfc2SBrian Gaeke         // External variable reference. Try to use the dynamic loader to
803e8bbcfc2SBrian Gaeke         // get a pointer to it.
8040621caefSChris Lattner         if (void *SymAddr =
8050621caefSChris Lattner             sys::DynamicLibrary::SearchForAddressOfSymbol(I->getName().c_str()))
806748e8579SChris Lattner           addGlobalMapping(I, SymAddr);
8079de0d14dSChris Lattner         else {
808f3baad3eSBill Wendling           cerr << "Could not resolve external global address: "
8099de0d14dSChris Lattner                << I->getName() << "\n";
8109de0d14dSChris Lattner           abort();
8119de0d14dSChris Lattner         }
812996fe010SChris Lattner       }
8130621caefSChris Lattner     }
8140621caefSChris Lattner 
8150621caefSChris Lattner     // If there are multiple modules, map the non-canonical globals to their
8160621caefSChris Lattner     // canonical location.
8170621caefSChris Lattner     if (!NonCanonicalGlobals.empty()) {
8180621caefSChris Lattner       for (unsigned i = 0, e = NonCanonicalGlobals.size(); i != e; ++i) {
8190621caefSChris Lattner         const GlobalValue *GV = NonCanonicalGlobals[i];
8200621caefSChris Lattner         const GlobalValue *CGV =
8210621caefSChris Lattner           LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())];
8220621caefSChris Lattner         void *Ptr = getPointerToGlobalIfAvailable(CGV);
8230621caefSChris Lattner         assert(Ptr && "Canonical global wasn't codegen'd!");
8240621caefSChris Lattner         addGlobalMapping(GV, getPointerToGlobalIfAvailable(CGV));
8250621caefSChris Lattner       }
8260621caefSChris Lattner     }
827996fe010SChris Lattner 
8287a9c62baSReid Spencer     // Now that all of the globals are set up in memory, loop through them all
8297a9c62baSReid Spencer     // and initialize their contents.
8308ffb6611SChris Lattner     for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
8310621caefSChris Lattner          I != E; ++I) {
8320621caefSChris Lattner       if (!I->isExternal()) {
8330621caefSChris Lattner         if (!LinkedGlobalsMap.empty()) {
8340621caefSChris Lattner           if (const GlobalValue *GVEntry =
8350621caefSChris Lattner                 LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())])
8360621caefSChris Lattner             if (GVEntry != &*I)  // Not the canonical variable.
8370621caefSChris Lattner               continue;
8380621caefSChris Lattner         }
8396bbe3eceSChris Lattner         EmitGlobalVariable(I);
8406bbe3eceSChris Lattner       }
8410621caefSChris Lattner     }
8420621caefSChris Lattner   }
8430621caefSChris Lattner }
8446bbe3eceSChris Lattner 
8456bbe3eceSChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the
8466bbe3eceSChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not
8476bbe3eceSChris Lattner // already in the map.
848fbcc0aa1SChris Lattner void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
849748e8579SChris Lattner   void *GA = getPointerToGlobalIfAvailable(GV);
8505834fdb3SBill Wendling   DOUT << "Global '" << GV->getName() << "' -> " << GA << "\n";
851dc631735SChris Lattner 
852fbcc0aa1SChris Lattner   const Type *ElTy = GV->getType()->getElementType();
85320a631fdSOwen Anderson   size_t GVSize = (size_t)getTargetData()->getTypeSize(ElTy);
8546bbe3eceSChris Lattner   if (GA == 0) {
8556bbe3eceSChris Lattner     // If it's not already specified, allocate memory for the global.
856d215992bSChris Lattner     GA = new char[GVSize];
857748e8579SChris Lattner     addGlobalMapping(GV, GA);
8586bbe3eceSChris Lattner   }
859fbcc0aa1SChris Lattner 
8606bbe3eceSChris Lattner   InitializeMemory(GV->getInitializer(), GA);
861df1f1524SChris Lattner   NumInitBytes += (unsigned)GVSize;
8626bbe3eceSChris Lattner   ++NumGlobals;
863996fe010SChris Lattner }
864