1 //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the common interface used by the various execution engine
13 //===----------------------------------------------------------------------===//
15 #define DEBUG_TYPE "jit"
16 #include "llvm/Constants.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Module.h"
19 #include "llvm/ModuleProvider.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/ExecutionEngine/ExecutionEngine.h"
22 #include "llvm/ExecutionEngine/GenericValue.h"
23 #include "llvm/Support/Debug.h"
24 #include "llvm/Support/MutexGuard.h"
25 #include "llvm/System/DynamicLibrary.h"
26 #include "llvm/Target/TargetData.h"
31 Statistic
<> NumInitBytes("lli", "Number of bytes of global vars initialized");
32 Statistic
<> NumGlobals ("lli", "Number of global vars initialized");
35 ExecutionEngine::EECtorFn
ExecutionEngine::JITCtor
= 0;
36 ExecutionEngine::EECtorFn
ExecutionEngine::InterpCtor
= 0;
38 ExecutionEngine::ExecutionEngine(ModuleProvider
*P
) :
39 CurMod(*P
->getModule()), MP(P
) {
40 assert(P
&& "ModuleProvider is null?");
43 ExecutionEngine::ExecutionEngine(Module
*M
) : CurMod(*M
), MP(0) {
44 assert(M
&& "Module is null?");
47 ExecutionEngine::~ExecutionEngine() {
51 /// addGlobalMapping - Tell the execution engine that the specified global is
52 /// at the specified location. This is used internally as functions are JIT'd
53 /// and as global variables are laid out in memory. It can and should also be
54 /// used by clients of the EE that want to have an LLVM global overlay
55 /// existing data in memory.
56 void ExecutionEngine::addGlobalMapping(const GlobalValue
*GV
, void *Addr
) {
57 MutexGuard
locked(lock
);
59 void *&CurVal
= state
.getGlobalAddressMap(locked
)[GV
];
60 assert((CurVal
== 0 || Addr
== 0) && "GlobalMapping already established!");
63 // If we are using the reverse mapping, add it too
64 if (!state
.getGlobalAddressReverseMap(locked
).empty()) {
65 const GlobalValue
*&V
= state
.getGlobalAddressReverseMap(locked
)[Addr
];
66 assert((V
== 0 || GV
== 0) && "GlobalMapping already established!");
71 /// clearAllGlobalMappings - Clear all global mappings and start over again
72 /// use in dynamic compilation scenarios when you want to move globals
73 void ExecutionEngine::clearAllGlobalMappings() {
74 MutexGuard
locked(lock
);
76 state
.getGlobalAddressMap(locked
).clear();
77 state
.getGlobalAddressReverseMap(locked
).clear();
80 /// updateGlobalMapping - Replace an existing mapping for GV with a new
81 /// address. This updates both maps as required. If "Addr" is null, the
82 /// entry for the global is removed from the mappings.
83 void ExecutionEngine::updateGlobalMapping(const GlobalValue
*GV
, void *Addr
) {
84 MutexGuard
locked(lock
);
86 // Deleting from the mapping?
88 state
.getGlobalAddressMap(locked
).erase(GV
);
89 if (!state
.getGlobalAddressReverseMap(locked
).empty())
90 state
.getGlobalAddressReverseMap(locked
).erase(Addr
);
94 void *&CurVal
= state
.getGlobalAddressMap(locked
)[GV
];
95 if (CurVal
&& !state
.getGlobalAddressReverseMap(locked
).empty())
96 state
.getGlobalAddressReverseMap(locked
).erase(CurVal
);
99 // If we are using the reverse mapping, add it too
100 if (!state
.getGlobalAddressReverseMap(locked
).empty()) {
101 const GlobalValue
*&V
= state
.getGlobalAddressReverseMap(locked
)[Addr
];
102 assert((V
== 0 || GV
== 0) && "GlobalMapping already established!");
107 /// getPointerToGlobalIfAvailable - This returns the address of the specified
108 /// global value if it is has already been codegen'd, otherwise it returns null.
110 void *ExecutionEngine::getPointerToGlobalIfAvailable(const GlobalValue
*GV
) {
111 MutexGuard
locked(lock
);
113 std::map
<const GlobalValue
*, void*>::iterator I
=
114 state
.getGlobalAddressMap(locked
).find(GV
);
115 return I
!= state
.getGlobalAddressMap(locked
).end() ? I
->second
: 0;
118 /// getGlobalValueAtAddress - Return the LLVM global value object that starts
119 /// at the specified address.
121 const GlobalValue
*ExecutionEngine::getGlobalValueAtAddress(void *Addr
) {
122 MutexGuard
locked(lock
);
124 // If we haven't computed the reverse mapping yet, do so first.
125 if (state
.getGlobalAddressReverseMap(locked
).empty()) {
126 for (std::map
<const GlobalValue
*, void *>::iterator
127 I
= state
.getGlobalAddressMap(locked
).begin(),
128 E
= state
.getGlobalAddressMap(locked
).end(); I
!= E
; ++I
)
129 state
.getGlobalAddressReverseMap(locked
).insert(std::make_pair(I
->second
,
133 std::map
<void *, const GlobalValue
*>::iterator I
=
134 state
.getGlobalAddressReverseMap(locked
).find(Addr
);
135 return I
!= state
.getGlobalAddressReverseMap(locked
).end() ? I
->second
: 0;
138 // CreateArgv - Turn a vector of strings into a nice argv style array of
139 // pointers to null terminated strings.
141 static void *CreateArgv(ExecutionEngine
*EE
,
142 const std::vector
<std::string
> &InputArgv
) {
143 unsigned PtrSize
= EE
->getTargetData()->getPointerSize();
144 char *Result
= new char[(InputArgv
.size()+1)*PtrSize
];
146 DEBUG(std::cerr
<< "ARGV = " << (void*)Result
<< "\n");
147 const Type
*SBytePtr
= PointerType::get(Type::SByteTy
);
149 for (unsigned i
= 0; i
!= InputArgv
.size(); ++i
) {
150 unsigned Size
= InputArgv
[i
].size()+1;
151 char *Dest
= new char[Size
];
152 DEBUG(std::cerr
<< "ARGV[" << i
<< "] = " << (void*)Dest
<< "\n");
154 std::copy(InputArgv
[i
].begin(), InputArgv
[i
].end(), Dest
);
157 // Endian safe: Result[i] = (PointerTy)Dest;
158 EE
->StoreValueToMemory(PTOGV(Dest
), (GenericValue
*)(Result
+i
*PtrSize
),
163 EE
->StoreValueToMemory(PTOGV(0),
164 (GenericValue
*)(Result
+InputArgv
.size()*PtrSize
),
170 /// runStaticConstructorsDestructors - This method is used to execute all of
171 /// the static constructors or destructors for a module, depending on the
172 /// value of isDtors.
173 void ExecutionEngine::runStaticConstructorsDestructors(bool isDtors
) {
174 const char *Name
= isDtors
? "llvm.global_dtors" : "llvm.global_ctors";
175 GlobalVariable
*GV
= CurMod
.getNamedGlobal(Name
);
177 // If this global has internal linkage, or if it has a use, then it must be
178 // an old-style (llvmgcc3) static ctor with __main linked in and in use. If
179 // this is the case, don't execute any of the global ctors, __main will do it.
180 if (!GV
|| GV
->isExternal() || GV
->hasInternalLinkage()) return;
182 // Should be an array of '{ int, void ()* }' structs. The first value is the
183 // init priority, which we ignore.
184 ConstantArray
*InitList
= dyn_cast
<ConstantArray
>(GV
->getInitializer());
185 if (!InitList
) return;
186 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
)
187 if (ConstantStruct
*CS
= dyn_cast
<ConstantStruct
>(InitList
->getOperand(i
))){
188 if (CS
->getNumOperands() != 2) return; // Not array of 2-element structs.
190 Constant
*FP
= CS
->getOperand(1);
191 if (FP
->isNullValue())
192 return; // Found a null terminator, exit.
194 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(FP
))
195 if (CE
->getOpcode() == Instruction::Cast
)
196 FP
= CE
->getOperand(0);
197 if (Function
*F
= dyn_cast
<Function
>(FP
)) {
198 // Execute the ctor/dtor function!
199 runFunction(F
, std::vector
<GenericValue
>());
204 /// runFunctionAsMain - This is a helper function which wraps runFunction to
205 /// handle the common task of starting up main with the specified argc, argv,
206 /// and envp parameters.
207 int ExecutionEngine::runFunctionAsMain(Function
*Fn
,
208 const std::vector
<std::string
> &argv
,
209 const char * const * envp
) {
210 std::vector
<GenericValue
> GVArgs
;
212 GVArgc
.IntVal
= argv
.size();
213 unsigned NumArgs
= Fn
->getFunctionType()->getNumParams();
215 GVArgs
.push_back(GVArgc
); // Arg #0 = argc.
217 GVArgs
.push_back(PTOGV(CreateArgv(this, argv
))); // Arg #1 = argv.
218 assert(((char **)GVTOP(GVArgs
[1]))[0] &&
219 "argv[0] was null after CreateArgv");
221 std::vector
<std::string
> EnvVars
;
222 for (unsigned i
= 0; envp
[i
]; ++i
)
223 EnvVars
.push_back(envp
[i
]);
224 GVArgs
.push_back(PTOGV(CreateArgv(this, EnvVars
))); // Arg #2 = envp.
228 return runFunction(Fn
, GVArgs
).IntVal
;
231 /// If possible, create a JIT, unless the caller specifically requests an
232 /// Interpreter or there's an error. If even an Interpreter cannot be created,
233 /// NULL is returned.
235 ExecutionEngine
*ExecutionEngine::create(ModuleProvider
*MP
,
236 bool ForceInterpreter
) {
237 ExecutionEngine
*EE
= 0;
239 // Unless the interpreter was explicitly selected, try making a JIT.
240 if (!ForceInterpreter
&& JITCtor
)
243 // If we can't make a JIT, make an interpreter instead.
244 if (EE
== 0 && InterpCtor
)
248 // Make sure we can resolve symbols in the program as well. The zero arg
249 // to the function tells DynamicLibrary to load the program, not a library.
251 sys::DynamicLibrary::LoadLibraryPermanently(0);
259 /// getPointerToGlobal - This returns the address of the specified global
260 /// value. This may involve code generation if it's a function.
262 void *ExecutionEngine::getPointerToGlobal(const GlobalValue
*GV
) {
263 if (Function
*F
= const_cast<Function
*>(dyn_cast
<Function
>(GV
)))
264 return getPointerToFunction(F
);
266 MutexGuard
locked(lock
);
267 void *p
= state
.getGlobalAddressMap(locked
)[GV
];
271 // Global variable might have been added since interpreter started.
272 if (GlobalVariable
*GVar
=
273 const_cast<GlobalVariable
*>(dyn_cast
<GlobalVariable
>(GV
)))
274 EmitGlobalVariable(GVar
);
276 assert("Global hasn't had an address allocated yet!");
277 return state
.getGlobalAddressMap(locked
)[GV
];
282 GenericValue
ExecutionEngine::getConstantValue(const Constant
*C
) {
284 if (isa
<UndefValue
>(C
)) return Result
;
286 if (ConstantExpr
*CE
= const_cast<ConstantExpr
*>(dyn_cast
<ConstantExpr
>(C
))) {
287 switch (CE
->getOpcode()) {
288 case Instruction::GetElementPtr
: {
289 Result
= getConstantValue(CE
->getOperand(0));
290 std::vector
<Value
*> Indexes(CE
->op_begin()+1, CE
->op_end());
292 TD
->getIndexedOffset(CE
->getOperand(0)->getType(), Indexes
);
294 if (getTargetData()->getPointerSize() == 4)
295 Result
.IntVal
+= Offset
;
297 Result
.LongVal
+= Offset
;
300 case Instruction::Cast
: {
301 // We only need to handle a few cases here. Almost all casts will
302 // automatically fold, just the ones involving pointers won't.
304 Constant
*Op
= CE
->getOperand(0);
305 GenericValue GV
= getConstantValue(Op
);
307 // Handle cast of pointer to pointer...
308 if (Op
->getType()->getTypeID() == C
->getType()->getTypeID())
311 // Handle a cast of pointer to any integral type...
312 if (isa
<PointerType
>(Op
->getType()) && C
->getType()->isIntegral())
315 // Handle cast of integer to a pointer...
316 if (isa
<PointerType
>(C
->getType()) && Op
->getType()->isIntegral())
317 switch (Op
->getType()->getTypeID()) {
318 case Type::BoolTyID
: return PTOGV((void*)(uintptr_t)GV
.BoolVal
);
319 case Type::SByteTyID
: return PTOGV((void*)( intptr_t)GV
.SByteVal
);
320 case Type::UByteTyID
: return PTOGV((void*)(uintptr_t)GV
.UByteVal
);
321 case Type::ShortTyID
: return PTOGV((void*)( intptr_t)GV
.ShortVal
);
322 case Type::UShortTyID
: return PTOGV((void*)(uintptr_t)GV
.UShortVal
);
323 case Type::IntTyID
: return PTOGV((void*)( intptr_t)GV
.IntVal
);
324 case Type::UIntTyID
: return PTOGV((void*)(uintptr_t)GV
.UIntVal
);
325 case Type::LongTyID
: return PTOGV((void*)( intptr_t)GV
.LongVal
);
326 case Type::ULongTyID
: return PTOGV((void*)(uintptr_t)GV
.ULongVal
);
327 default: assert(0 && "Unknown integral type!");
332 case Instruction::Add
:
333 switch (CE
->getOperand(0)->getType()->getTypeID()) {
334 default: assert(0 && "Bad add type!"); abort();
336 case Type::ULongTyID
:
337 Result
.LongVal
= getConstantValue(CE
->getOperand(0)).LongVal
+
338 getConstantValue(CE
->getOperand(1)).LongVal
;
342 Result
.IntVal
= getConstantValue(CE
->getOperand(0)).IntVal
+
343 getConstantValue(CE
->getOperand(1)).IntVal
;
345 case Type::ShortTyID
:
346 case Type::UShortTyID
:
347 Result
.ShortVal
= getConstantValue(CE
->getOperand(0)).ShortVal
+
348 getConstantValue(CE
->getOperand(1)).ShortVal
;
350 case Type::SByteTyID
:
351 case Type::UByteTyID
:
352 Result
.SByteVal
= getConstantValue(CE
->getOperand(0)).SByteVal
+
353 getConstantValue(CE
->getOperand(1)).SByteVal
;
355 case Type::FloatTyID
:
356 Result
.FloatVal
= getConstantValue(CE
->getOperand(0)).FloatVal
+
357 getConstantValue(CE
->getOperand(1)).FloatVal
;
359 case Type::DoubleTyID
:
360 Result
.DoubleVal
= getConstantValue(CE
->getOperand(0)).DoubleVal
+
361 getConstantValue(CE
->getOperand(1)).DoubleVal
;
368 std::cerr
<< "ConstantExpr not handled as global var init: " << *CE
<< "\n";
372 switch (C
->getType()->getTypeID()) {
373 #define GET_CONST_VAL(TY, CTY, CLASS) \
374 case Type::TY##TyID: Result.TY##Val = (CTY)cast<CLASS>(C)->getValue(); break
375 GET_CONST_VAL(Bool
, bool , ConstantBool
);
376 GET_CONST_VAL(UByte
, unsigned char , ConstantUInt
);
377 GET_CONST_VAL(SByte
, signed char , ConstantSInt
);
378 GET_CONST_VAL(UShort
, unsigned short, ConstantUInt
);
379 GET_CONST_VAL(Short
, signed short , ConstantSInt
);
380 GET_CONST_VAL(UInt
, unsigned int , ConstantUInt
);
381 GET_CONST_VAL(Int
, signed int , ConstantSInt
);
382 GET_CONST_VAL(ULong
, uint64_t , ConstantUInt
);
383 GET_CONST_VAL(Long
, int64_t , ConstantSInt
);
384 GET_CONST_VAL(Float
, float , ConstantFP
);
385 GET_CONST_VAL(Double
, double , ConstantFP
);
387 case Type::PointerTyID
:
388 if (isa
<ConstantPointerNull
>(C
))
389 Result
.PointerVal
= 0;
390 else if (const Function
*F
= dyn_cast
<Function
>(C
))
391 Result
= PTOGV(getPointerToFunctionOrStub(const_cast<Function
*>(F
)));
392 else if (const GlobalVariable
* GV
= dyn_cast
<GlobalVariable
>(C
))
393 Result
= PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable
*>(GV
)));
395 assert(0 && "Unknown constant pointer type!");
398 std::cout
<< "ERROR: Constant unimp for type: " << *C
->getType() << "\n";
404 /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr. Ptr
405 /// is the address of the memory at which to store Val, cast to GenericValue *.
406 /// It is not a pointer to a GenericValue containing the address at which to
409 void ExecutionEngine::StoreValueToMemory(GenericValue Val
, GenericValue
*Ptr
,
411 if (getTargetData()->isLittleEndian()) {
412 switch (Ty
->getTypeID()) {
414 case Type::UByteTyID
:
415 case Type::SByteTyID
: Ptr
->Untyped
[0] = Val
.UByteVal
; break;
416 case Type::UShortTyID
:
417 case Type::ShortTyID
: Ptr
->Untyped
[0] = Val
.UShortVal
& 255;
418 Ptr
->Untyped
[1] = (Val
.UShortVal
>> 8) & 255;
420 Store4BytesLittleEndian
:
421 case Type::FloatTyID
:
423 case Type::IntTyID
: Ptr
->Untyped
[0] = Val
.UIntVal
& 255;
424 Ptr
->Untyped
[1] = (Val
.UIntVal
>> 8) & 255;
425 Ptr
->Untyped
[2] = (Val
.UIntVal
>> 16) & 255;
426 Ptr
->Untyped
[3] = (Val
.UIntVal
>> 24) & 255;
428 case Type::PointerTyID
: if (getTargetData()->getPointerSize() == 4)
429 goto Store4BytesLittleEndian
;
430 case Type::DoubleTyID
:
431 case Type::ULongTyID
:
433 Ptr
->Untyped
[0] = (unsigned char)(Val
.ULongVal
);
434 Ptr
->Untyped
[1] = (unsigned char)(Val
.ULongVal
>> 8);
435 Ptr
->Untyped
[2] = (unsigned char)(Val
.ULongVal
>> 16);
436 Ptr
->Untyped
[3] = (unsigned char)(Val
.ULongVal
>> 24);
437 Ptr
->Untyped
[4] = (unsigned char)(Val
.ULongVal
>> 32);
438 Ptr
->Untyped
[5] = (unsigned char)(Val
.ULongVal
>> 40);
439 Ptr
->Untyped
[6] = (unsigned char)(Val
.ULongVal
>> 48);
440 Ptr
->Untyped
[7] = (unsigned char)(Val
.ULongVal
>> 56);
443 std::cout
<< "Cannot store value of type " << *Ty
<< "!\n";
446 switch (Ty
->getTypeID()) {
448 case Type::UByteTyID
:
449 case Type::SByteTyID
: Ptr
->Untyped
[0] = Val
.UByteVal
; break;
450 case Type::UShortTyID
:
451 case Type::ShortTyID
: Ptr
->Untyped
[1] = Val
.UShortVal
& 255;
452 Ptr
->Untyped
[0] = (Val
.UShortVal
>> 8) & 255;
454 Store4BytesBigEndian
:
455 case Type::FloatTyID
:
457 case Type::IntTyID
: Ptr
->Untyped
[3] = Val
.UIntVal
& 255;
458 Ptr
->Untyped
[2] = (Val
.UIntVal
>> 8) & 255;
459 Ptr
->Untyped
[1] = (Val
.UIntVal
>> 16) & 255;
460 Ptr
->Untyped
[0] = (Val
.UIntVal
>> 24) & 255;
462 case Type::PointerTyID
: if (getTargetData()->getPointerSize() == 4)
463 goto Store4BytesBigEndian
;
464 case Type::DoubleTyID
:
465 case Type::ULongTyID
:
467 Ptr
->Untyped
[7] = (unsigned char)(Val
.ULongVal
);
468 Ptr
->Untyped
[6] = (unsigned char)(Val
.ULongVal
>> 8);
469 Ptr
->Untyped
[5] = (unsigned char)(Val
.ULongVal
>> 16);
470 Ptr
->Untyped
[4] = (unsigned char)(Val
.ULongVal
>> 24);
471 Ptr
->Untyped
[3] = (unsigned char)(Val
.ULongVal
>> 32);
472 Ptr
->Untyped
[2] = (unsigned char)(Val
.ULongVal
>> 40);
473 Ptr
->Untyped
[1] = (unsigned char)(Val
.ULongVal
>> 48);
474 Ptr
->Untyped
[0] = (unsigned char)(Val
.ULongVal
>> 56);
477 std::cout
<< "Cannot store value of type " << *Ty
<< "!\n";
484 GenericValue
ExecutionEngine::LoadValueFromMemory(GenericValue
*Ptr
,
487 if (getTargetData()->isLittleEndian()) {
488 switch (Ty
->getTypeID()) {
490 case Type::UByteTyID
:
491 case Type::SByteTyID
: Result
.UByteVal
= Ptr
->Untyped
[0]; break;
492 case Type::UShortTyID
:
493 case Type::ShortTyID
: Result
.UShortVal
= (unsigned)Ptr
->Untyped
[0] |
494 ((unsigned)Ptr
->Untyped
[1] << 8);
496 Load4BytesLittleEndian
:
497 case Type::FloatTyID
:
499 case Type::IntTyID
: Result
.UIntVal
= (unsigned)Ptr
->Untyped
[0] |
500 ((unsigned)Ptr
->Untyped
[1] << 8) |
501 ((unsigned)Ptr
->Untyped
[2] << 16) |
502 ((unsigned)Ptr
->Untyped
[3] << 24);
504 case Type::PointerTyID
: if (getTargetData()->getPointerSize() == 4)
505 goto Load4BytesLittleEndian
;
506 case Type::DoubleTyID
:
507 case Type::ULongTyID
:
508 case Type::LongTyID
: Result
.ULongVal
= (uint64_t)Ptr
->Untyped
[0] |
509 ((uint64_t)Ptr
->Untyped
[1] << 8) |
510 ((uint64_t)Ptr
->Untyped
[2] << 16) |
511 ((uint64_t)Ptr
->Untyped
[3] << 24) |
512 ((uint64_t)Ptr
->Untyped
[4] << 32) |
513 ((uint64_t)Ptr
->Untyped
[5] << 40) |
514 ((uint64_t)Ptr
->Untyped
[6] << 48) |
515 ((uint64_t)Ptr
->Untyped
[7] << 56);
518 std::cout
<< "Cannot load value of type " << *Ty
<< "!\n";
522 switch (Ty
->getTypeID()) {
524 case Type::UByteTyID
:
525 case Type::SByteTyID
: Result
.UByteVal
= Ptr
->Untyped
[0]; break;
526 case Type::UShortTyID
:
527 case Type::ShortTyID
: Result
.UShortVal
= (unsigned)Ptr
->Untyped
[1] |
528 ((unsigned)Ptr
->Untyped
[0] << 8);
531 case Type::FloatTyID
:
533 case Type::IntTyID
: Result
.UIntVal
= (unsigned)Ptr
->Untyped
[3] |
534 ((unsigned)Ptr
->Untyped
[2] << 8) |
535 ((unsigned)Ptr
->Untyped
[1] << 16) |
536 ((unsigned)Ptr
->Untyped
[0] << 24);
538 case Type::PointerTyID
: if (getTargetData()->getPointerSize() == 4)
539 goto Load4BytesBigEndian
;
540 case Type::DoubleTyID
:
541 case Type::ULongTyID
:
542 case Type::LongTyID
: Result
.ULongVal
= (uint64_t)Ptr
->Untyped
[7] |
543 ((uint64_t)Ptr
->Untyped
[6] << 8) |
544 ((uint64_t)Ptr
->Untyped
[5] << 16) |
545 ((uint64_t)Ptr
->Untyped
[4] << 24) |
546 ((uint64_t)Ptr
->Untyped
[3] << 32) |
547 ((uint64_t)Ptr
->Untyped
[2] << 40) |
548 ((uint64_t)Ptr
->Untyped
[1] << 48) |
549 ((uint64_t)Ptr
->Untyped
[0] << 56);
552 std::cout
<< "Cannot load value of type " << *Ty
<< "!\n";
559 // InitializeMemory - Recursive function to apply a Constant value into the
560 // specified memory location...
562 void ExecutionEngine::InitializeMemory(const Constant
*Init
, void *Addr
) {
563 if (isa
<UndefValue
>(Init
)) {
565 } else if (const ConstantPacked
*CP
= dyn_cast
<ConstantPacked
>(Init
)) {
566 unsigned ElementSize
=
567 getTargetData()->getTypeSize(CP
->getType()->getElementType());
568 for (unsigned i
= 0, e
= CP
->getNumOperands(); i
!= e
; ++i
)
569 InitializeMemory(CP
->getOperand(i
), (char*)Addr
+i
*ElementSize
);
571 } else if (Init
->getType()->isFirstClassType()) {
572 GenericValue Val
= getConstantValue(Init
);
573 StoreValueToMemory(Val
, (GenericValue
*)Addr
, Init
->getType());
575 } else if (isa
<ConstantAggregateZero
>(Init
)) {
576 memset(Addr
, 0, (size_t)getTargetData()->getTypeSize(Init
->getType()));
580 switch (Init
->getType()->getTypeID()) {
581 case Type::ArrayTyID
: {
582 const ConstantArray
*CPA
= cast
<ConstantArray
>(Init
);
583 unsigned ElementSize
=
584 getTargetData()->getTypeSize(CPA
->getType()->getElementType());
585 for (unsigned i
= 0, e
= CPA
->getNumOperands(); i
!= e
; ++i
)
586 InitializeMemory(CPA
->getOperand(i
), (char*)Addr
+i
*ElementSize
);
590 case Type::StructTyID
: {
591 const ConstantStruct
*CPS
= cast
<ConstantStruct
>(Init
);
592 const StructLayout
*SL
=
593 getTargetData()->getStructLayout(cast
<StructType
>(CPS
->getType()));
594 for (unsigned i
= 0, e
= CPS
->getNumOperands(); i
!= e
; ++i
)
595 InitializeMemory(CPS
->getOperand(i
), (char*)Addr
+SL
->MemberOffsets
[i
]);
600 std::cerr
<< "Bad Type: " << *Init
->getType() << "\n";
601 assert(0 && "Unknown constant type to initialize memory with!");
605 /// EmitGlobals - Emit all of the global variables to memory, storing their
606 /// addresses into GlobalAddress. This must make sure to copy the contents of
607 /// their initializers into the memory.
609 void ExecutionEngine::emitGlobals() {
610 const TargetData
*TD
= getTargetData();
612 // Loop over all of the global variables in the program, allocating the memory
614 Module
&M
= getModule();
615 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
617 if (!I
->isExternal()) {
618 // Get the type of the global...
619 const Type
*Ty
= I
->getType()->getElementType();
621 // Allocate some memory for it!
622 unsigned Size
= TD
->getTypeSize(Ty
);
623 addGlobalMapping(I
, new char[Size
]);
625 // External variable reference. Try to use the dynamic loader to
626 // get a pointer to it.
627 if (void *SymAddr
= sys::DynamicLibrary::SearchForAddressOfSymbol(
628 I
->getName().c_str()))
629 addGlobalMapping(I
, SymAddr
);
631 std::cerr
<< "Could not resolve external global address: "
632 << I
->getName() << "\n";
637 // Now that all of the globals are set up in memory, loop through them all and
638 // initialize their contents.
639 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
641 if (!I
->isExternal())
642 EmitGlobalVariable(I
);
645 // EmitGlobalVariable - This method emits the specified global variable to the
646 // address specified in GlobalAddresses, or allocates new memory if it's not
647 // already in the map.
648 void ExecutionEngine::EmitGlobalVariable(const GlobalVariable
*GV
) {
649 void *GA
= getPointerToGlobalIfAvailable(GV
);
650 DEBUG(std::cerr
<< "Global '" << GV
->getName() << "' -> " << GA
<< "\n");
652 const Type
*ElTy
= GV
->getType()->getElementType();
653 size_t GVSize
= (size_t)getTargetData()->getTypeSize(ElTy
);
655 // If it's not already specified, allocate memory for the global.
656 GA
= new char[GVSize
];
657 addGlobalMapping(GV
, GA
);
660 InitializeMemory(GV
->getInitializer(), GA
);
661 NumInitBytes
+= (unsigned)GVSize
;