ExecutionEngine.cpp revision f70c22b019494723d0e706f93d6542dfaa6e73a5
14afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman//===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===//
2bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
9b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the common interface used by the various execution engine
11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// subclasses.
12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===//
14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
153785fad56eb90284d4e930d40e9306391630deb1Chris Lattner#define DEBUG_TYPE "jit"
16fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Interpreter/Interpreter.h"
1761612df9cb596448b8310e479d568d6b2a8e8a4cChris Lattner#include "JIT/JIT.h"
18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Constants.h"
1919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/DerivedTypes.h"
207301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner#include "llvm/IntrinsicLowering.h"
21bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Module.h"
2219684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/ModuleProvider.h"
2319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/ExecutionEngine/ExecutionEngine.h"
24fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "llvm/ExecutionEngine/GenericValue.h"
25bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetData.h"
26fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Support/Debug.h"
27fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Support/Statistic.h"
28322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke#include "Support/DynamicLinker.h"
29c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattnerusing namespace llvm;
30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
31c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattnernamespace {
32c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattner  Statistic<> NumInitBytes("lli", "Number of bytes of global vars initialized");
3324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner  Statistic<> NumGlobals  ("lli", "Number of global vars initialized");
34c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattner}
35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
3619684164a7b695b9dc22d879675e8d2b286ef7e5Misha BrukmanExecutionEngine::ExecutionEngine(ModuleProvider *P) :
3719684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman  CurMod(*P->getModule()), MP(P) {
3819684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman  assert(P && "ModuleProvider is null?");
3919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman}
4019684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman
4119684164a7b695b9dc22d879675e8d2b286ef7e5Misha BrukmanExecutionEngine::ExecutionEngine(Module *M) : CurMod(*M), MP(0) {
4205701573aac26e87a33e8aa58817e4dc5a40050aMisha Brukman  assert(M && "Module is null?");
4319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman}
4419684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman
458e539488816c9e52bde0af475f72cd3e6407d558Brian GaekeExecutionEngine::~ExecutionEngine() {
467b2b40f9ac21e7349735dd7a5096f29a35d8cd02Misha Brukman  delete MP;
478e539488816c9e52bde0af475f72cd3e6407d558Brian Gaeke}
488e539488816c9e52bde0af475f72cd3e6407d558Brian Gaeke
4955d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner/// getGlobalValueAtAddress - Return the LLVM global value object that starts
5055d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner/// at the specified address.
5155d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner///
5255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattnerconst GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) {
5355d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  // If we haven't computed the reverse mapping yet, do so first.
5455d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  if (GlobalAddressReverseMap.empty()) {
5555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner    for (std::map<const GlobalValue*, void *>::iterator I =
5655d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner           GlobalAddressMap.begin(), E = GlobalAddressMap.end(); I != E; ++I)
5755d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner      GlobalAddressReverseMap.insert(std::make_pair(I->second, I->first));
5855d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  }
5955d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner
6055d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  std::map<void *, const GlobalValue*>::iterator I =
6155d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner    GlobalAddressReverseMap.find(Addr);
6255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  return I != GlobalAddressReverseMap.end() ? I->second : 0;
6355d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner}
6487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
6587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner// CreateArgv - Turn a vector of strings into a nice argv style array of
6687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner// pointers to null terminated strings.
6787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner//
6887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattnerstatic void *CreateArgv(ExecutionEngine *EE,
6987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                        const std::vector<std::string> &InputArgv) {
7087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  unsigned PtrSize = EE->getTargetData().getPointerSize();
7187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  char *Result = new char[(InputArgv.size()+1)*PtrSize];
7287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
7387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n");
7487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  const Type *SBytePtr = PointerType::get(Type::SByteTy);
7587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
7687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  for (unsigned i = 0; i != InputArgv.size(); ++i) {
7787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    unsigned Size = InputArgv[i].size()+1;
7887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    char *Dest = new char[Size];
7987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n");
8087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
8187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest);
8287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    Dest[Size-1] = 0;
8387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
8487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    // Endian safe: Result[i] = (PointerTy)Dest;
8587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i*PtrSize),
8687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                           SBytePtr);
8787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  }
8887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
8987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  // Null terminate it
9087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  EE->StoreValueToMemory(PTOGV(0),
9187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                         (GenericValue*)(Result+InputArgv.size()*PtrSize),
9287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                         SBytePtr);
9387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  return Result;
9487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner}
9587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
9687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// runFunctionAsMain - This is a helper function which wraps runFunction to
9787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// handle the common task of starting up main with the specified argc, argv,
9887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// and envp parameters.
9987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattnerint ExecutionEngine::runFunctionAsMain(Function *Fn,
10087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                                       const std::vector<std::string> &argv,
10187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner                                       const char * const * envp) {
10287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  std::vector<GenericValue> GVArgs;
10387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  GenericValue GVArgc;
10487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  GVArgc.IntVal = argv.size();
10587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  GVArgs.push_back(GVArgc); // Arg #0 = argc.
10687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv.
10787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  assert(((char **)GVTOP(GVArgs[1]))[0] && "argv[0] was null after CreateArgv");
10887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
10987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  std::vector<std::string> EnvVars;
11087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  for (unsigned i = 0; envp[i]; ++i)
11187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner    EnvVars.push_back(envp[i]);
11287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp.
11387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner  return runFunction(Fn, GVArgs).IntVal;
11487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner}
11587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
11687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
11787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner
11819684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// If possible, create a JIT, unless the caller specifically requests an
11919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// Interpreter or there's an error. If even an Interpreter cannot be created,
12019684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// NULL is returned.
1214afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman///
1227b2b40f9ac21e7349735dd7a5096f29a35d8cd02Misha BrukmanExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
1237301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner                                         bool ForceInterpreter,
1247301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner                                         IntrinsicLowering *IL) {
12582d8277ad5862b54341808812bb4016e52347060Brian Gaeke  ExecutionEngine *EE = 0;
12682d8277ad5862b54341808812bb4016e52347060Brian Gaeke
1277301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  // Unless the interpreter was explicitly selected, try making a JIT.
12820a277e162f971ec1b9c6f2c90a214c177d54f99Brian Gaeke  if (!ForceInterpreter)
1297301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner    EE = JIT::create(MP, IL);
13082d8277ad5862b54341808812bb4016e52347060Brian Gaeke
13182d8277ad5862b54341808812bb4016e52347060Brian Gaeke  // If we can't make a JIT, make an interpreter instead.
132338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner  if (EE == 0) {
133338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner    try {
134338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner      Module *M = MP->materializeModule();
135338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner      try {
136338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner        EE = Interpreter::create(M, IL);
137338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner      } catch (...) {
138338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner        std::cerr << "Error creating the interpreter!\n";
139338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner      }
140338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner    } catch (...) {
141338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner      std::cerr << "Error reading the bytecode file!\n";
142338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner    }
14319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman  }
1447301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner
1457301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner  if (EE == 0) delete IL;
14682d8277ad5862b54341808812bb4016e52347060Brian Gaeke  return EE;
14782d8277ad5862b54341808812bb4016e52347060Brian Gaeke}
14882d8277ad5862b54341808812bb4016e52347060Brian Gaeke
1494afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// getPointerToGlobal - This returns the address of the specified global
1504afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// value.  This may involve code generation if it's a function.
1514afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman///
152bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) {
15337df460874e8d9d28e6833e5fb66a9aa8e1ef50aBrian Gaeke  if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV)))
154bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return getPointerToFunction(F);
155bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
15655d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  assert(GlobalAddressMap[GV] && "Global hasn't had an address allocated yet?");
15755d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  return GlobalAddressMap[GV];
158bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
159bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
1604afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document
1614afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman///
162bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris LattnerGenericValue ExecutionEngine::getConstantValue(const Constant *C) {
163bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  GenericValue Result;
164d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner
1659a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner  if (ConstantExpr *CE = const_cast<ConstantExpr*>(dyn_cast<ConstantExpr>(C))) {
166d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner    switch (CE->getOpcode()) {
167d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner    case Instruction::GetElementPtr: {
1689a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      Result = getConstantValue(CE->getOperand(0));
169d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end());
170d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      uint64_t Offset =
171d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner        TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes);
172d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner
173d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      Result.LongVal += Offset;
174d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      return Result;
175d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner    }
1769a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    case Instruction::Cast: {
1779a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      // We only need to handle a few cases here.  Almost all casts will
1789a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      // automatically fold, just the ones involving pointers won't.
1799a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      //
1809a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      Constant *Op = CE->getOperand(0);
1817d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner      GenericValue GV = getConstantValue(Op);
182d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner
1839a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      // Handle cast of pointer to pointer...
184f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner      if (Op->getType()->getTypeID() == C->getType()->getTypeID())
1857d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        return GV;
1869a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner
18774cf81919d3a44457bec1cbf01b655c80f4673b1Chris Lattner      // Handle a cast of pointer to any integral type...
188c88a4ea0d6ba705a81401eda50796b15c994f6f9Chris Lattner      if (isa<PointerType>(Op->getType()) && C->getType()->isIntegral())
1897d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        return GV;
19074cf81919d3a44457bec1cbf01b655c80f4673b1Chris Lattner
1917d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner      // Handle cast of integer to a pointer...
1927d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner      if (isa<PointerType>(C->getType()) && Op->getType()->isIntegral())
193f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner        switch (Op->getType()->getTypeID()) {
1947d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::BoolTyID:    return PTOGV((void*)(uintptr_t)GV.BoolVal);
1957d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::SByteTyID:   return PTOGV((void*)( intptr_t)GV.SByteVal);
1967d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::UByteTyID:   return PTOGV((void*)(uintptr_t)GV.UByteVal);
1977d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::ShortTyID:   return PTOGV((void*)( intptr_t)GV.ShortVal);
1987d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::UShortTyID:  return PTOGV((void*)(uintptr_t)GV.UShortVal);
1997d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::IntTyID:     return PTOGV((void*)( intptr_t)GV.IntVal);
2007d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::UIntTyID:    return PTOGV((void*)(uintptr_t)GV.UIntVal);
2017d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::LongTyID:    return PTOGV((void*)( intptr_t)GV.LongVal);
2027d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        case Type::ULongTyID:   return PTOGV((void*)(uintptr_t)GV.ULongVal);
2037d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        default: assert(0 && "Unknown integral type!");
2047d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner        }
2059a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      break;
206d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner    }
207bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
2089a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    case Instruction::Add:
2096b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner      if (CE->getOperand(0)->getType() == Type::LongTy ||
2106b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner          CE->getOperand(0)->getType() == Type::ULongTy)
2116b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner        Result.LongVal = getConstantValue(CE->getOperand(0)).LongVal +
2126b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner                         getConstantValue(CE->getOperand(1)).LongVal;
2139a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      else
2149a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner        break;
2159a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      return Result;
2169a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner
2179a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    default:
2189a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner      break;
2199a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    }
2209a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    std::cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
2219a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner    abort();
2229a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner  }
2239a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner
224f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner  switch (C->getType()->getTypeID()) {
225d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner#define GET_CONST_VAL(TY, CLASS) \
226d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner  case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break
227bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Bool   , ConstantBool);
228bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(UByte  , ConstantUInt);
229bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(SByte  , ConstantSInt);
230bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(UShort , ConstantUInt);
231bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Short  , ConstantSInt);
232bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(UInt   , ConstantUInt);
233bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Int    , ConstantSInt);
234bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(ULong  , ConstantUInt);
235bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Long   , ConstantSInt);
236bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Float  , ConstantFP);
237bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GET_CONST_VAL(Double , ConstantFP);
238bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#undef GET_CONST_VAL
239bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  case Type::PointerTyID:
240bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    if (isa<ConstantPointerNull>(C)) {
241bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      Result.PointerVal = 0;
242bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    } else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)){
24338f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner      if (Function *F =
24438f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner          const_cast<Function*>(dyn_cast<Function>(CPR->getValue())))
24538f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner        Result = PTOGV(getPointerToFunctionOrStub(F));
24638f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner      else
247c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner        Result = PTOGV(getOrEmitGlobalVariable(
248c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner                           cast<GlobalVariable>(CPR->getValue())));
249bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
250bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    } else {
251bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      assert(0 && "Unknown constant pointer type!");
252bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    }
253bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    break;
254bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  default:
255d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner    std::cout << "ERROR: Constant unimp for type: " << C->getType() << "\n";
256d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner    abort();
257bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
258bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  return Result;
259bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
260bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
2614afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document
2624afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman///
263bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
2644afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman                                         const Type *Ty) {
265bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  if (getTargetData().isLittleEndian()) {
266f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner    switch (Ty->getTypeID()) {
267bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::BoolTyID:
268bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UByteTyID:
269bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::SByteTyID:   Ptr->Untyped[0] = Val.UByteVal; break;
270bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UShortTyID:
271bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::ShortTyID:   Ptr->Untyped[0] = Val.UShortVal & 255;
272bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[1] = (Val.UShortVal >> 8) & 255;
273bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
2742be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner    Store4BytesLittleEndian:
275bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::FloatTyID:
276bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UIntTyID:
277bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::IntTyID:     Ptr->Untyped[0] =  Val.UIntVal        & 255;
278bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[1] = (Val.UIntVal >>  8) & 255;
279bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[2] = (Val.UIntVal >> 16) & 255;
280bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[3] = (Val.UIntVal >> 24) & 255;
281bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
282c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner    case Type::PointerTyID: if (getTargetData().getPointerSize() == 4)
2832be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner                              goto Store4BytesLittleEndian;
284bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::DoubleTyID:
285bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::ULongTyID:
2862be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner    case Type::LongTyID:    Ptr->Untyped[0] =  Val.ULongVal        & 255;
287bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[1] = (Val.ULongVal >>  8) & 255;
288bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[2] = (Val.ULongVal >> 16) & 255;
289bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[3] = (Val.ULongVal >> 24) & 255;
290bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[4] = (Val.ULongVal >> 32) & 255;
291bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[5] = (Val.ULongVal >> 40) & 255;
292bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[6] = (Val.ULongVal >> 48) & 255;
293bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[7] = (Val.ULongVal >> 56) & 255;
294bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
295bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    default:
296d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner      std::cout << "Cannot store value of type " << Ty << "!\n";
297bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    }
298bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  } else {
299f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner    switch (Ty->getTypeID()) {
300bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::BoolTyID:
301bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UByteTyID:
302bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::SByteTyID:   Ptr->Untyped[0] = Val.UByteVal; break;
303bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UShortTyID:
304bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::ShortTyID:   Ptr->Untyped[1] = Val.UShortVal & 255;
305bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[0] = (Val.UShortVal >> 8) & 255;
306bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
3072be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner    Store4BytesBigEndian:
308bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::FloatTyID:
309bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::UIntTyID:
310bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::IntTyID:     Ptr->Untyped[3] =  Val.UIntVal        & 255;
311bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[2] = (Val.UIntVal >>  8) & 255;
312bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[1] = (Val.UIntVal >> 16) & 255;
313bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[0] = (Val.UIntVal >> 24) & 255;
314bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
315c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner    case Type::PointerTyID: if (getTargetData().getPointerSize() == 4)
3162be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner                              goto Store4BytesBigEndian;
317bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::DoubleTyID:
318bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    case Type::ULongTyID:
3192be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner    case Type::LongTyID:    Ptr->Untyped[7] =  Val.ULongVal        & 255;
320bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[6] = (Val.ULongVal >>  8) & 255;
321bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[5] = (Val.ULongVal >> 16) & 255;
322bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[4] = (Val.ULongVal >> 24) & 255;
323bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[3] = (Val.ULongVal >> 32) & 255;
324bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[2] = (Val.ULongVal >> 40) & 255;
325bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[1] = (Val.ULongVal >> 48) & 255;
326bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            Ptr->Untyped[0] = (Val.ULongVal >> 56) & 255;
327bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                            break;
328bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    default:
329d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner      std::cout << "Cannot store value of type " << Ty << "!\n";
330bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    }
331bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
332bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
333bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
3344afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document
3354afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman///
336f88b9a639770327196b2a00f365155b954dd1d30Chris LattnerGenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
337f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                                  const Type *Ty) {
338f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  GenericValue Result;
339f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  if (getTargetData().isLittleEndian()) {
340f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner    switch (Ty->getTypeID()) {
341f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::BoolTyID:
342f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UByteTyID:
343f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::SByteTyID:   Result.UByteVal = Ptr->Untyped[0]; break;
344f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UShortTyID:
345f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::ShortTyID:   Result.UShortVal = (unsigned)Ptr->Untyped[0] |
346f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                              ((unsigned)Ptr->Untyped[1] << 8);
347f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
348f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    Load4BytesLittleEndian:
349f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::FloatTyID:
350f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UIntTyID:
351f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::IntTyID:     Result.UIntVal = (unsigned)Ptr->Untyped[0] |
352f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[1] <<  8) |
353f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[2] << 16) |
354f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[3] << 24);
355f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
356c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner    case Type::PointerTyID: if (getTargetData().getPointerSize() == 4)
357f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                              goto Load4BytesLittleEndian;
358f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::DoubleTyID:
359f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::ULongTyID:
360f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::LongTyID:    Result.ULongVal = (uint64_t)Ptr->Untyped[0] |
361f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[1] <<  8) |
362f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[2] << 16) |
363f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[3] << 24) |
364f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[4] << 32) |
365f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[5] << 40) |
366f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[6] << 48) |
367f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[7] << 56);
368f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
369f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    default:
370f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner      std::cout << "Cannot load value of type " << *Ty << "!\n";
371f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner      abort();
372f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    }
373f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  } else {
374f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner    switch (Ty->getTypeID()) {
375f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::BoolTyID:
376f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UByteTyID:
377f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::SByteTyID:   Result.UByteVal = Ptr->Untyped[0]; break;
378f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UShortTyID:
379f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::ShortTyID:   Result.UShortVal = (unsigned)Ptr->Untyped[1] |
380f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                              ((unsigned)Ptr->Untyped[0] << 8);
381f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
382f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    Load4BytesBigEndian:
383f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::FloatTyID:
384f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::UIntTyID:
385f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::IntTyID:     Result.UIntVal = (unsigned)Ptr->Untyped[3] |
386f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[2] <<  8) |
387f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[1] << 16) |
388f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                            ((unsigned)Ptr->Untyped[0] << 24);
389f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
390c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner    case Type::PointerTyID: if (getTargetData().getPointerSize() == 4)
391f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                              goto Load4BytesBigEndian;
392f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::DoubleTyID:
393f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::ULongTyID:
394f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    case Type::LongTyID:    Result.ULongVal = (uint64_t)Ptr->Untyped[7] |
395f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[6] <<  8) |
396f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[5] << 16) |
397f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[4] << 24) |
398f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[3] << 32) |
399f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[2] << 40) |
400f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[1] << 48) |
401f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                                             ((uint64_t)Ptr->Untyped[0] << 56);
402f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner                            break;
403f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    default:
404f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner      std::cout << "Cannot load value of type " << *Ty << "!\n";
405f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner      abort();
406f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner    }
407f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  }
408f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner  return Result;
409f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner}
410f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner
411bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// InitializeMemory - Recursive function to apply a Constant value into the
412bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// specified memory location...
413bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
414bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
415bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  if (Init->getType()->isFirstClassType()) {
416bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    GenericValue Val = getConstantValue(Init);
417bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
418bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return;
419dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner  } else if (isa<ConstantAggregateZero>(Init)) {
420dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner    unsigned Size = getTargetData().getTypeSize(Init->getType());
421dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner    memset(Addr, 0, Size);
422dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner    return;
423bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
424bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
425f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner  switch (Init->getType()->getTypeID()) {
426bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  case Type::ArrayTyID: {
427bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    const ConstantArray *CPA = cast<ConstantArray>(Init);
428d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner    const std::vector<Use> &Val = CPA->getValues();
429bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    unsigned ElementSize =
430bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      getTargetData().getTypeSize(cast<ArrayType>(CPA->getType())->getElementType());
431bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    for (unsigned i = 0; i < Val.size(); ++i)
432bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      InitializeMemory(cast<Constant>(Val[i].get()), (char*)Addr+i*ElementSize);
433bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return;
434bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
435bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
436bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  case Type::StructTyID: {
437bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    const ConstantStruct *CPS = cast<ConstantStruct>(Init);
438bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    const StructLayout *SL =
439bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      getTargetData().getStructLayout(cast<StructType>(CPS->getType()));
440d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner    const std::vector<Use> &Val = CPS->getValues();
441bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    for (unsigned i = 0; i < Val.size(); ++i)
442bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      InitializeMemory(cast<Constant>(Val[i].get()),
443bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner                       (char*)Addr+SL->MemberOffsets[i]);
444bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return;
445bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
446bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
447bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  default:
448bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    std::cerr << "Bad Type: " << Init->getType() << "\n";
449bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    assert(0 && "Unknown constant type to initialize memory with!");
450bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
451bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
452bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
453bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// EmitGlobals - Emit all of the global variables to memory, storing their
454bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// addresses into GlobalAddress.  This must make sure to copy the contents of
455bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// their initializers into the memory.
456bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner///
457bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::emitGlobals() {
458bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  const TargetData &TD = getTargetData();
459bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
460bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Loop over all of the global variables in the program, allocating the memory
461bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // to hold them.
462bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  for (Module::giterator I = getModule().gbegin(), E = getModule().gend();
463bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner       I != E; ++I)
464bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    if (!I->isExternal()) {
465bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      // Get the type of the global...
466bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      const Type *Ty = I->getType()->getElementType();
467bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
468bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      // Allocate some memory for it!
469bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner      unsigned Size = TD.getTypeSize(Ty);
47024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner      addGlobalMapping(I, new char[Size]);
471bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    } else {
472322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke      // External variable reference. Try to use the dynamic loader to
473322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke      // get a pointer to it.
474322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke      if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str()))
47555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner        addGlobalMapping(I, SymAddr);
476d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      else {
477d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner        std::cerr << "Could not resolve external global address: "
478d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner                  << I->getName() << "\n";
479d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner        abort();
480d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner      }
481bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    }
482bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
483bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Now that all of the globals are set up in memory, loop through them all and
484bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // initialize their contents.
485bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  for (Module::giterator I = getModule().gbegin(), E = getModule().gend();
486bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner       I != E; ++I)
487bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    if (!I->isExternal())
48824b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner      EmitGlobalVariable(I);
48924b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner}
49024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner
49124b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// EmitGlobalVariable - This method emits the specified global variable to the
49224b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// address specified in GlobalAddresses, or allocates new memory if it's not
49324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// already in the map.
494c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattnervoid ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
49555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner  void *GA = getPointerToGlobalIfAvailable(GV);
49623c472436940aa7fc82ff99e8cca6788d08a8105Chris Lattner  DEBUG(std::cerr << "Global '" << GV->getName() << "' -> " << GA << "\n");
49723c472436940aa7fc82ff99e8cca6788d08a8105Chris Lattner
498c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner  const Type *ElTy = GV->getType()->getElementType();
49924b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner  if (GA == 0) {
50024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner    // If it's not already specified, allocate memory for the global.
501c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner    GA = new char[getTargetData().getTypeSize(ElTy)];
50255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner    addGlobalMapping(GV, GA);
50324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner  }
504c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner
50524b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner  InitializeMemory(GV->getInitializer(), GA);
506c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner  NumInitBytes += getTargetData().getTypeSize(ElTy);
50724b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner  ++NumGlobals;
508bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
509