1 //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines the common interface used by the various execution engine
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ExecutionEngine/ExecutionEngine.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/Statistic.h"
18 #include "llvm/ExecutionEngine/GenericValue.h"
19 #include "llvm/ExecutionEngine/JITEventListener.h"
20 #include "llvm/ExecutionEngine/ObjectCache.h"
21 #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
22 #include "llvm/IR/Constants.h"
23 #include "llvm/IR/DataLayout.h"
24 #include "llvm/IR/DerivedTypes.h"
25 #include "llvm/IR/Mangler.h"
26 #include "llvm/IR/Module.h"
27 #include "llvm/IR/Operator.h"
28 #include "llvm/IR/ValueHandle.h"
29 #include "llvm/Object/Archive.h"
30 #include "llvm/Object/ObjectFile.h"
31 #include "llvm/Support/Debug.h"
32 #include "llvm/Support/DynamicLibrary.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/Host.h"
35 #include "llvm/Support/MutexGuard.h"
36 #include "llvm/Support/TargetRegistry.h"
37 #include "llvm/Support/raw_ostream.h"
38 #include "llvm/Target/TargetMachine.h"
43 #define DEBUG_TYPE "jit"
45 STATISTIC(NumInitBytes
, "Number of bytes of global vars initialized");
46 STATISTIC(NumGlobals
, "Number of global vars initialized");
48 ExecutionEngine
*(*ExecutionEngine::MCJITCtor
)(
49 std::unique_ptr
<Module
> M
, std::string
*ErrorStr
,
50 std::shared_ptr
<MCJITMemoryManager
> MemMgr
,
51 std::shared_ptr
<LegacyJITSymbolResolver
> Resolver
,
52 std::unique_ptr
<TargetMachine
> TM
) = nullptr;
54 ExecutionEngine
*(*ExecutionEngine::OrcMCJITReplacementCtor
)(
55 std::string
*ErrorStr
, std::shared_ptr
<MCJITMemoryManager
> MemMgr
,
56 std::shared_ptr
<LegacyJITSymbolResolver
> Resolver
,
57 std::unique_ptr
<TargetMachine
> TM
) = nullptr;
59 ExecutionEngine
*(*ExecutionEngine::InterpCtor
)(std::unique_ptr
<Module
> M
,
60 std::string
*ErrorStr
) =nullptr;
62 void JITEventListener::anchor() {}
64 void ObjectCache::anchor() {}
66 void ExecutionEngine::Init(std::unique_ptr
<Module
> M
) {
67 CompilingLazily
= false;
68 GVCompilationDisabled
= false;
69 SymbolSearchingDisabled
= false;
71 // IR module verification is enabled by default in debug builds, and disabled
72 // by default in release builds.
76 VerifyModules
= false;
79 assert(M
&& "Module is null?");
80 Modules
.push_back(std::move(M
));
83 ExecutionEngine::ExecutionEngine(std::unique_ptr
<Module
> M
)
84 : DL(M
->getDataLayout()), LazyFunctionCreator(nullptr) {
88 ExecutionEngine::ExecutionEngine(DataLayout DL
, std::unique_ptr
<Module
> M
)
89 : DL(std::move(DL
)), LazyFunctionCreator(nullptr) {
93 ExecutionEngine::~ExecutionEngine() {
94 clearAllGlobalMappings();
98 /// Helper class which uses a value handler to automatically deletes the
99 /// memory block when the GlobalVariable is destroyed.
100 class GVMemoryBlock final
: public CallbackVH
{
101 GVMemoryBlock(const GlobalVariable
*GV
)
102 : CallbackVH(const_cast<GlobalVariable
*>(GV
)) {}
105 /// Returns the address the GlobalVariable should be written into. The
106 /// GVMemoryBlock object prefixes that.
107 static char *Create(const GlobalVariable
*GV
, const DataLayout
& TD
) {
108 Type
*ElTy
= GV
->getValueType();
109 size_t GVSize
= (size_t)TD
.getTypeAllocSize(ElTy
);
110 void *RawMemory
= ::operator new(
111 alignTo(sizeof(GVMemoryBlock
), TD
.getPreferredAlignment(GV
)) + GVSize
);
112 new(RawMemory
) GVMemoryBlock(GV
);
113 return static_cast<char*>(RawMemory
) + sizeof(GVMemoryBlock
);
116 void deleted() override
{
117 // We allocated with operator new and with some extra memory hanging off the
118 // end, so don't just delete this. I'm not sure if this is actually
120 this->~GVMemoryBlock();
121 ::operator delete(this);
124 } // anonymous namespace
126 char *ExecutionEngine::getMemoryForGV(const GlobalVariable
*GV
) {
127 return GVMemoryBlock::Create(GV
, getDataLayout());
130 void ExecutionEngine::addObjectFile(std::unique_ptr
<object::ObjectFile
> O
) {
131 llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
135 ExecutionEngine::addObjectFile(object::OwningBinary
<object::ObjectFile
> O
) {
136 llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
139 void ExecutionEngine::addArchive(object::OwningBinary
<object::Archive
> A
) {
140 llvm_unreachable("ExecutionEngine subclass doesn't implement addArchive.");
143 bool ExecutionEngine::removeModule(Module
*M
) {
144 for (auto I
= Modules
.begin(), E
= Modules
.end(); I
!= E
; ++I
) {
145 Module
*Found
= I
->get();
149 clearGlobalMappingsFromModule(M
);
156 Function
*ExecutionEngine::FindFunctionNamed(StringRef FnName
) {
157 for (unsigned i
= 0, e
= Modules
.size(); i
!= e
; ++i
) {
158 Function
*F
= Modules
[i
]->getFunction(FnName
);
159 if (F
&& !F
->isDeclaration())
165 GlobalVariable
*ExecutionEngine::FindGlobalVariableNamed(StringRef Name
, bool AllowInternal
) {
166 for (unsigned i
= 0, e
= Modules
.size(); i
!= e
; ++i
) {
167 GlobalVariable
*GV
= Modules
[i
]->getGlobalVariable(Name
,AllowInternal
);
168 if (GV
&& !GV
->isDeclaration())
174 uint64_t ExecutionEngineState::RemoveMapping(StringRef Name
) {
175 GlobalAddressMapTy::iterator I
= GlobalAddressMap
.find(Name
);
178 // FIXME: This is silly, we shouldn't end up with a mapping -> 0 in the
180 if (I
== GlobalAddressMap
.end())
183 GlobalAddressReverseMap
.erase(I
->second
);
185 GlobalAddressMap
.erase(I
);
191 std::string
ExecutionEngine::getMangledName(const GlobalValue
*GV
) {
192 assert(GV
->hasName() && "Global must have name.");
194 MutexGuard
locked(lock
);
195 SmallString
<128> FullName
;
197 const DataLayout
&DL
=
198 GV
->getParent()->getDataLayout().isDefault()
200 : GV
->getParent()->getDataLayout();
202 Mangler::getNameWithPrefix(FullName
, GV
->getName(), DL
);
203 return FullName
.str();
206 void ExecutionEngine::addGlobalMapping(const GlobalValue
*GV
, void *Addr
) {
207 MutexGuard
locked(lock
);
208 addGlobalMapping(getMangledName(GV
), (uint64_t) Addr
);
211 void ExecutionEngine::addGlobalMapping(StringRef Name
, uint64_t Addr
) {
212 MutexGuard
locked(lock
);
214 assert(!Name
.empty() && "Empty GlobalMapping symbol name!");
216 LLVM_DEBUG(dbgs() << "JIT: Map \'" << Name
<< "\' to [" << Addr
<< "]\n";);
217 uint64_t &CurVal
= EEState
.getGlobalAddressMap()[Name
];
218 assert((!CurVal
|| !Addr
) && "GlobalMapping already established!");
221 // If we are using the reverse mapping, add it too.
222 if (!EEState
.getGlobalAddressReverseMap().empty()) {
223 std::string
&V
= EEState
.getGlobalAddressReverseMap()[CurVal
];
224 assert((!V
.empty() || !Name
.empty()) &&
225 "GlobalMapping already established!");
230 void ExecutionEngine::clearAllGlobalMappings() {
231 MutexGuard
locked(lock
);
233 EEState
.getGlobalAddressMap().clear();
234 EEState
.getGlobalAddressReverseMap().clear();
237 void ExecutionEngine::clearGlobalMappingsFromModule(Module
*M
) {
238 MutexGuard
locked(lock
);
240 for (GlobalObject
&GO
: M
->global_objects())
241 EEState
.RemoveMapping(getMangledName(&GO
));
244 uint64_t ExecutionEngine::updateGlobalMapping(const GlobalValue
*GV
,
246 MutexGuard
locked(lock
);
247 return updateGlobalMapping(getMangledName(GV
), (uint64_t) Addr
);
250 uint64_t ExecutionEngine::updateGlobalMapping(StringRef Name
, uint64_t Addr
) {
251 MutexGuard
locked(lock
);
253 ExecutionEngineState::GlobalAddressMapTy
&Map
=
254 EEState
.getGlobalAddressMap();
256 // Deleting from the mapping?
258 return EEState
.RemoveMapping(Name
);
260 uint64_t &CurVal
= Map
[Name
];
261 uint64_t OldVal
= CurVal
;
263 if (CurVal
&& !EEState
.getGlobalAddressReverseMap().empty())
264 EEState
.getGlobalAddressReverseMap().erase(CurVal
);
267 // If we are using the reverse mapping, add it too.
268 if (!EEState
.getGlobalAddressReverseMap().empty()) {
269 std::string
&V
= EEState
.getGlobalAddressReverseMap()[CurVal
];
270 assert((!V
.empty() || !Name
.empty()) &&
271 "GlobalMapping already established!");
277 uint64_t ExecutionEngine::getAddressToGlobalIfAvailable(StringRef S
) {
278 MutexGuard
locked(lock
);
279 uint64_t Address
= 0;
280 ExecutionEngineState::GlobalAddressMapTy::iterator I
=
281 EEState
.getGlobalAddressMap().find(S
);
282 if (I
!= EEState
.getGlobalAddressMap().end())
288 void *ExecutionEngine::getPointerToGlobalIfAvailable(StringRef S
) {
289 MutexGuard
locked(lock
);
290 if (void* Address
= (void *) getAddressToGlobalIfAvailable(S
))
295 void *ExecutionEngine::getPointerToGlobalIfAvailable(const GlobalValue
*GV
) {
296 MutexGuard
locked(lock
);
297 return getPointerToGlobalIfAvailable(getMangledName(GV
));
300 const GlobalValue
*ExecutionEngine::getGlobalValueAtAddress(void *Addr
) {
301 MutexGuard
locked(lock
);
303 // If we haven't computed the reverse mapping yet, do so first.
304 if (EEState
.getGlobalAddressReverseMap().empty()) {
305 for (ExecutionEngineState::GlobalAddressMapTy::iterator
306 I
= EEState
.getGlobalAddressMap().begin(),
307 E
= EEState
.getGlobalAddressMap().end(); I
!= E
; ++I
) {
308 StringRef Name
= I
->first();
309 uint64_t Addr
= I
->second
;
310 EEState
.getGlobalAddressReverseMap().insert(std::make_pair(
315 std::map
<uint64_t, std::string
>::iterator I
=
316 EEState
.getGlobalAddressReverseMap().find((uint64_t) Addr
);
318 if (I
!= EEState
.getGlobalAddressReverseMap().end()) {
319 StringRef Name
= I
->second
;
320 for (unsigned i
= 0, e
= Modules
.size(); i
!= e
; ++i
)
321 if (GlobalValue
*GV
= Modules
[i
]->getNamedValue(Name
))
329 std::unique_ptr
<char[]> Array
;
330 std::vector
<std::unique_ptr
<char[]>> Values
;
332 /// Turn a vector of strings into a nice argv style array of pointers to null
333 /// terminated strings.
334 void *reset(LLVMContext
&C
, ExecutionEngine
*EE
,
335 const std::vector
<std::string
> &InputArgv
);
337 } // anonymous namespace
338 void *ArgvArray::reset(LLVMContext
&C
, ExecutionEngine
*EE
,
339 const std::vector
<std::string
> &InputArgv
) {
340 Values
.clear(); // Free the old contents.
341 Values
.reserve(InputArgv
.size());
342 unsigned PtrSize
= EE
->getDataLayout().getPointerSize();
343 Array
= make_unique
<char[]>((InputArgv
.size()+1)*PtrSize
);
345 LLVM_DEBUG(dbgs() << "JIT: ARGV = " << (void *)Array
.get() << "\n");
346 Type
*SBytePtr
= Type::getInt8PtrTy(C
);
348 for (unsigned i
= 0; i
!= InputArgv
.size(); ++i
) {
349 unsigned Size
= InputArgv
[i
].size()+1;
350 auto Dest
= make_unique
<char[]>(Size
);
351 LLVM_DEBUG(dbgs() << "JIT: ARGV[" << i
<< "] = " << (void *)Dest
.get()
354 std::copy(InputArgv
[i
].begin(), InputArgv
[i
].end(), Dest
.get());
357 // Endian safe: Array[i] = (PointerTy)Dest;
358 EE
->StoreValueToMemory(PTOGV(Dest
.get()),
359 (GenericValue
*)(&Array
[i
*PtrSize
]), SBytePtr
);
360 Values
.push_back(std::move(Dest
));
364 EE
->StoreValueToMemory(PTOGV(nullptr),
365 (GenericValue
*)(&Array
[InputArgv
.size()*PtrSize
]),
370 void ExecutionEngine::runStaticConstructorsDestructors(Module
&module
,
372 StringRef
Name(isDtors
? "llvm.global_dtors" : "llvm.global_ctors");
373 GlobalVariable
*GV
= module
.getNamedGlobal(Name
);
375 // If this global has internal linkage, or if it has a use, then it must be
376 // an old-style (llvmgcc3) static ctor with __main linked in and in use. If
377 // this is the case, don't execute any of the global ctors, __main will do
379 if (!GV
|| GV
->isDeclaration() || GV
->hasLocalLinkage()) return;
381 // Should be an array of '{ i32, void ()* }' structs. The first value is
382 // the init priority, which we ignore.
383 ConstantArray
*InitList
= dyn_cast
<ConstantArray
>(GV
->getInitializer());
386 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
) {
387 ConstantStruct
*CS
= dyn_cast
<ConstantStruct
>(InitList
->getOperand(i
));
390 Constant
*FP
= CS
->getOperand(1);
391 if (FP
->isNullValue())
392 continue; // Found a sentinal value, ignore.
394 // Strip off constant expression casts.
395 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(FP
))
397 FP
= CE
->getOperand(0);
399 // Execute the ctor/dtor function!
400 if (Function
*F
= dyn_cast
<Function
>(FP
))
401 runFunction(F
, None
);
403 // FIXME: It is marginally lame that we just do nothing here if we see an
404 // entry we don't recognize. It might not be unreasonable for the verifier
405 // to not even allow this and just assert here.
409 void ExecutionEngine::runStaticConstructorsDestructors(bool isDtors
) {
410 // Execute global ctors/dtors for each module in the program.
411 for (std::unique_ptr
<Module
> &M
: Modules
)
412 runStaticConstructorsDestructors(*M
, isDtors
);
416 /// isTargetNullPtr - Return whether the target pointer stored at Loc is null.
417 static bool isTargetNullPtr(ExecutionEngine
*EE
, void *Loc
) {
418 unsigned PtrSize
= EE
->getDataLayout().getPointerSize();
419 for (unsigned i
= 0; i
< PtrSize
; ++i
)
420 if (*(i
+ (uint8_t*)Loc
))
426 int ExecutionEngine::runFunctionAsMain(Function
*Fn
,
427 const std::vector
<std::string
> &argv
,
428 const char * const * envp
) {
429 std::vector
<GenericValue
> GVArgs
;
431 GVArgc
.IntVal
= APInt(32, argv
.size());
434 unsigned NumArgs
= Fn
->getFunctionType()->getNumParams();
435 FunctionType
*FTy
= Fn
->getFunctionType();
436 Type
* PPInt8Ty
= Type::getInt8PtrTy(Fn
->getContext())->getPointerTo();
438 // Check the argument types.
440 report_fatal_error("Invalid number of arguments of main() supplied");
441 if (NumArgs
>= 3 && FTy
->getParamType(2) != PPInt8Ty
)
442 report_fatal_error("Invalid type for third argument of main() supplied");
443 if (NumArgs
>= 2 && FTy
->getParamType(1) != PPInt8Ty
)
444 report_fatal_error("Invalid type for second argument of main() supplied");
445 if (NumArgs
>= 1 && !FTy
->getParamType(0)->isIntegerTy(32))
446 report_fatal_error("Invalid type for first argument of main() supplied");
447 if (!FTy
->getReturnType()->isIntegerTy() &&
448 !FTy
->getReturnType()->isVoidTy())
449 report_fatal_error("Invalid return type of main() supplied");
454 GVArgs
.push_back(GVArgc
); // Arg #0 = argc.
457 GVArgs
.push_back(PTOGV(CArgv
.reset(Fn
->getContext(), this, argv
)));
458 assert(!isTargetNullPtr(this, GVTOP(GVArgs
[1])) &&
459 "argv[0] was null after CreateArgv");
461 std::vector
<std::string
> EnvVars
;
462 for (unsigned i
= 0; envp
[i
]; ++i
)
463 EnvVars
.emplace_back(envp
[i
]);
465 GVArgs
.push_back(PTOGV(CEnv
.reset(Fn
->getContext(), this, EnvVars
)));
470 return runFunction(Fn
, GVArgs
).IntVal
.getZExtValue();
473 EngineBuilder::EngineBuilder() : EngineBuilder(nullptr) {}
475 EngineBuilder::EngineBuilder(std::unique_ptr
<Module
> M
)
476 : M(std::move(M
)), WhichEngine(EngineKind::Either
), ErrorStr(nullptr),
477 OptLevel(CodeGenOpt::Default
), MemMgr(nullptr), Resolver(nullptr),
478 UseOrcMCJITReplacement(false) {
479 // IR module verification is enabled by default in debug builds, and disabled
480 // by default in release builds.
482 VerifyModules
= true;
484 VerifyModules
= false;
488 EngineBuilder::~EngineBuilder() = default;
490 EngineBuilder
&EngineBuilder::setMCJITMemoryManager(
491 std::unique_ptr
<RTDyldMemoryManager
> mcjmm
) {
492 auto SharedMM
= std::shared_ptr
<RTDyldMemoryManager
>(std::move(mcjmm
));
499 EngineBuilder::setMemoryManager(std::unique_ptr
<MCJITMemoryManager
> MM
) {
500 MemMgr
= std::shared_ptr
<MCJITMemoryManager
>(std::move(MM
));
505 EngineBuilder::setSymbolResolver(std::unique_ptr
<LegacyJITSymbolResolver
> SR
) {
506 Resolver
= std::shared_ptr
<LegacyJITSymbolResolver
>(std::move(SR
));
510 ExecutionEngine
*EngineBuilder::create(TargetMachine
*TM
) {
511 std::unique_ptr
<TargetMachine
> TheTM(TM
); // Take ownership.
513 // Make sure we can resolve symbols in the program as well. The zero arg
514 // to the function tells DynamicLibrary to load the program, not a library.
515 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr, ErrorStr
))
518 // If the user specified a memory manager but didn't specify which engine to
519 // create, we assume they only want the JIT, and we fail if they only want
522 if (WhichEngine
& EngineKind::JIT
)
523 WhichEngine
= EngineKind::JIT
;
526 *ErrorStr
= "Cannot create an interpreter with a memory manager.";
531 // Unless the interpreter was explicitly selected or the JIT is not linked,
533 if ((WhichEngine
& EngineKind::JIT
) && TheTM
) {
534 if (!TM
->getTarget().hasJIT()) {
535 errs() << "WARNING: This target JIT is not designed for the host"
536 << " you are running. If bad things happen, please choose"
537 << " a different -march switch.\n";
540 ExecutionEngine
*EE
= nullptr;
541 if (ExecutionEngine::OrcMCJITReplacementCtor
&& UseOrcMCJITReplacement
) {
542 EE
= ExecutionEngine::OrcMCJITReplacementCtor(ErrorStr
, std::move(MemMgr
),
545 EE
->addModule(std::move(M
));
546 } else if (ExecutionEngine::MCJITCtor
)
547 EE
= ExecutionEngine::MCJITCtor(std::move(M
), ErrorStr
, std::move(MemMgr
),
548 std::move(Resolver
), std::move(TheTM
));
551 EE
->setVerifyModules(VerifyModules
);
556 // If we can't make a JIT and we didn't request one specifically, try making
557 // an interpreter instead.
558 if (WhichEngine
& EngineKind::Interpreter
) {
559 if (ExecutionEngine::InterpCtor
)
560 return ExecutionEngine::InterpCtor(std::move(M
), ErrorStr
);
562 *ErrorStr
= "Interpreter has not been linked in.";
566 if ((WhichEngine
& EngineKind::JIT
) && !ExecutionEngine::MCJITCtor
) {
568 *ErrorStr
= "JIT has not been linked in.";
574 void *ExecutionEngine::getPointerToGlobal(const GlobalValue
*GV
) {
575 if (Function
*F
= const_cast<Function
*>(dyn_cast
<Function
>(GV
)))
576 return getPointerToFunction(F
);
578 MutexGuard
locked(lock
);
579 if (void* P
= getPointerToGlobalIfAvailable(GV
))
582 // Global variable might have been added since interpreter started.
583 if (GlobalVariable
*GVar
=
584 const_cast<GlobalVariable
*>(dyn_cast
<GlobalVariable
>(GV
)))
585 EmitGlobalVariable(GVar
);
587 llvm_unreachable("Global hasn't had an address allocated yet!");
589 return getPointerToGlobalIfAvailable(GV
);
592 /// Converts a Constant* into a GenericValue, including handling of
593 /// ConstantExpr values.
594 GenericValue
ExecutionEngine::getConstantValue(const Constant
*C
) {
595 // If its undefined, return the garbage.
596 if (isa
<UndefValue
>(C
)) {
598 switch (C
->getType()->getTypeID()) {
601 case Type::IntegerTyID
:
602 case Type::X86_FP80TyID
:
603 case Type::FP128TyID
:
604 case Type::PPC_FP128TyID
:
605 // Although the value is undefined, we still have to construct an APInt
606 // with the correct bit width.
607 Result
.IntVal
= APInt(C
->getType()->getPrimitiveSizeInBits(), 0);
609 case Type::StructTyID
: {
610 // if the whole struct is 'undef' just reserve memory for the value.
611 if(StructType
*STy
= dyn_cast
<StructType
>(C
->getType())) {
612 unsigned int elemNum
= STy
->getNumElements();
613 Result
.AggregateVal
.resize(elemNum
);
614 for (unsigned int i
= 0; i
< elemNum
; ++i
) {
615 Type
*ElemTy
= STy
->getElementType(i
);
616 if (ElemTy
->isIntegerTy())
617 Result
.AggregateVal
[i
].IntVal
=
618 APInt(ElemTy
->getPrimitiveSizeInBits(), 0);
619 else if (ElemTy
->isAggregateType()) {
620 const Constant
*ElemUndef
= UndefValue::get(ElemTy
);
621 Result
.AggregateVal
[i
] = getConstantValue(ElemUndef
);
627 case Type::VectorTyID
:
628 // if the whole vector is 'undef' just reserve memory for the value.
629 auto* VTy
= dyn_cast
<VectorType
>(C
->getType());
630 Type
*ElemTy
= VTy
->getElementType();
631 unsigned int elemNum
= VTy
->getNumElements();
632 Result
.AggregateVal
.resize(elemNum
);
633 if (ElemTy
->isIntegerTy())
634 for (unsigned int i
= 0; i
< elemNum
; ++i
)
635 Result
.AggregateVal
[i
].IntVal
=
636 APInt(ElemTy
->getPrimitiveSizeInBits(), 0);
642 // Otherwise, if the value is a ConstantExpr...
643 if (const ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(C
)) {
644 Constant
*Op0
= CE
->getOperand(0);
645 switch (CE
->getOpcode()) {
646 case Instruction::GetElementPtr
: {
648 GenericValue Result
= getConstantValue(Op0
);
649 APInt
Offset(DL
.getPointerSizeInBits(), 0);
650 cast
<GEPOperator
>(CE
)->accumulateConstantOffset(DL
, Offset
);
652 char* tmp
= (char*) Result
.PointerVal
;
653 Result
= PTOGV(tmp
+ Offset
.getSExtValue());
656 case Instruction::Trunc
: {
657 GenericValue GV
= getConstantValue(Op0
);
658 uint32_t BitWidth
= cast
<IntegerType
>(CE
->getType())->getBitWidth();
659 GV
.IntVal
= GV
.IntVal
.trunc(BitWidth
);
662 case Instruction::ZExt
: {
663 GenericValue GV
= getConstantValue(Op0
);
664 uint32_t BitWidth
= cast
<IntegerType
>(CE
->getType())->getBitWidth();
665 GV
.IntVal
= GV
.IntVal
.zext(BitWidth
);
668 case Instruction::SExt
: {
669 GenericValue GV
= getConstantValue(Op0
);
670 uint32_t BitWidth
= cast
<IntegerType
>(CE
->getType())->getBitWidth();
671 GV
.IntVal
= GV
.IntVal
.sext(BitWidth
);
674 case Instruction::FPTrunc
: {
676 GenericValue GV
= getConstantValue(Op0
);
677 GV
.FloatVal
= float(GV
.DoubleVal
);
680 case Instruction::FPExt
:{
682 GenericValue GV
= getConstantValue(Op0
);
683 GV
.DoubleVal
= double(GV
.FloatVal
);
686 case Instruction::UIToFP
: {
687 GenericValue GV
= getConstantValue(Op0
);
688 if (CE
->getType()->isFloatTy())
689 GV
.FloatVal
= float(GV
.IntVal
.roundToDouble());
690 else if (CE
->getType()->isDoubleTy())
691 GV
.DoubleVal
= GV
.IntVal
.roundToDouble();
692 else if (CE
->getType()->isX86_FP80Ty()) {
693 APFloat apf
= APFloat::getZero(APFloat::x87DoubleExtended());
694 (void)apf
.convertFromAPInt(GV
.IntVal
,
696 APFloat::rmNearestTiesToEven
);
697 GV
.IntVal
= apf
.bitcastToAPInt();
701 case Instruction::SIToFP
: {
702 GenericValue GV
= getConstantValue(Op0
);
703 if (CE
->getType()->isFloatTy())
704 GV
.FloatVal
= float(GV
.IntVal
.signedRoundToDouble());
705 else if (CE
->getType()->isDoubleTy())
706 GV
.DoubleVal
= GV
.IntVal
.signedRoundToDouble();
707 else if (CE
->getType()->isX86_FP80Ty()) {
708 APFloat apf
= APFloat::getZero(APFloat::x87DoubleExtended());
709 (void)apf
.convertFromAPInt(GV
.IntVal
,
711 APFloat::rmNearestTiesToEven
);
712 GV
.IntVal
= apf
.bitcastToAPInt();
716 case Instruction::FPToUI
: // double->APInt conversion handles sign
717 case Instruction::FPToSI
: {
718 GenericValue GV
= getConstantValue(Op0
);
719 uint32_t BitWidth
= cast
<IntegerType
>(CE
->getType())->getBitWidth();
720 if (Op0
->getType()->isFloatTy())
721 GV
.IntVal
= APIntOps::RoundFloatToAPInt(GV
.FloatVal
, BitWidth
);
722 else if (Op0
->getType()->isDoubleTy())
723 GV
.IntVal
= APIntOps::RoundDoubleToAPInt(GV
.DoubleVal
, BitWidth
);
724 else if (Op0
->getType()->isX86_FP80Ty()) {
725 APFloat apf
= APFloat(APFloat::x87DoubleExtended(), GV
.IntVal
);
728 (void)apf
.convertToInteger(makeMutableArrayRef(v
), BitWidth
,
729 CE
->getOpcode()==Instruction::FPToSI
,
730 APFloat::rmTowardZero
, &ignored
);
731 GV
.IntVal
= v
; // endian?
735 case Instruction::PtrToInt
: {
736 GenericValue GV
= getConstantValue(Op0
);
737 uint32_t PtrWidth
= DL
.getTypeSizeInBits(Op0
->getType());
738 assert(PtrWidth
<= 64 && "Bad pointer width");
739 GV
.IntVal
= APInt(PtrWidth
, uintptr_t(GV
.PointerVal
));
740 uint32_t IntWidth
= DL
.getTypeSizeInBits(CE
->getType());
741 GV
.IntVal
= GV
.IntVal
.zextOrTrunc(IntWidth
);
744 case Instruction::IntToPtr
: {
745 GenericValue GV
= getConstantValue(Op0
);
746 uint32_t PtrWidth
= DL
.getTypeSizeInBits(CE
->getType());
747 GV
.IntVal
= GV
.IntVal
.zextOrTrunc(PtrWidth
);
748 assert(GV
.IntVal
.getBitWidth() <= 64 && "Bad pointer width");
749 GV
.PointerVal
= PointerTy(uintptr_t(GV
.IntVal
.getZExtValue()));
752 case Instruction::BitCast
: {
753 GenericValue GV
= getConstantValue(Op0
);
754 Type
* DestTy
= CE
->getType();
755 switch (Op0
->getType()->getTypeID()) {
756 default: llvm_unreachable("Invalid bitcast operand");
757 case Type::IntegerTyID
:
758 assert(DestTy
->isFloatingPointTy() && "invalid bitcast");
759 if (DestTy
->isFloatTy())
760 GV
.FloatVal
= GV
.IntVal
.bitsToFloat();
761 else if (DestTy
->isDoubleTy())
762 GV
.DoubleVal
= GV
.IntVal
.bitsToDouble();
764 case Type::FloatTyID
:
765 assert(DestTy
->isIntegerTy(32) && "Invalid bitcast");
766 GV
.IntVal
= APInt::floatToBits(GV
.FloatVal
);
768 case Type::DoubleTyID
:
769 assert(DestTy
->isIntegerTy(64) && "Invalid bitcast");
770 GV
.IntVal
= APInt::doubleToBits(GV
.DoubleVal
);
772 case Type::PointerTyID
:
773 assert(DestTy
->isPointerTy() && "Invalid bitcast");
774 break; // getConstantValue(Op0) above already converted it
778 case Instruction::Add
:
779 case Instruction::FAdd
:
780 case Instruction::Sub
:
781 case Instruction::FSub
:
782 case Instruction::Mul
:
783 case Instruction::FMul
:
784 case Instruction::UDiv
:
785 case Instruction::SDiv
:
786 case Instruction::URem
:
787 case Instruction::SRem
:
788 case Instruction::And
:
789 case Instruction::Or
:
790 case Instruction::Xor
: {
791 GenericValue LHS
= getConstantValue(Op0
);
792 GenericValue RHS
= getConstantValue(CE
->getOperand(1));
794 switch (CE
->getOperand(0)->getType()->getTypeID()) {
795 default: llvm_unreachable("Bad add type!");
796 case Type::IntegerTyID
:
797 switch (CE
->getOpcode()) {
798 default: llvm_unreachable("Invalid integer opcode");
799 case Instruction::Add
: GV
.IntVal
= LHS
.IntVal
+ RHS
.IntVal
; break;
800 case Instruction::Sub
: GV
.IntVal
= LHS
.IntVal
- RHS
.IntVal
; break;
801 case Instruction::Mul
: GV
.IntVal
= LHS
.IntVal
* RHS
.IntVal
; break;
802 case Instruction::UDiv
:GV
.IntVal
= LHS
.IntVal
.udiv(RHS
.IntVal
); break;
803 case Instruction::SDiv
:GV
.IntVal
= LHS
.IntVal
.sdiv(RHS
.IntVal
); break;
804 case Instruction::URem
:GV
.IntVal
= LHS
.IntVal
.urem(RHS
.IntVal
); break;
805 case Instruction::SRem
:GV
.IntVal
= LHS
.IntVal
.srem(RHS
.IntVal
); break;
806 case Instruction::And
: GV
.IntVal
= LHS
.IntVal
& RHS
.IntVal
; break;
807 case Instruction::Or
: GV
.IntVal
= LHS
.IntVal
| RHS
.IntVal
; break;
808 case Instruction::Xor
: GV
.IntVal
= LHS
.IntVal
^ RHS
.IntVal
; break;
811 case Type::FloatTyID
:
812 switch (CE
->getOpcode()) {
813 default: llvm_unreachable("Invalid float opcode");
814 case Instruction::FAdd
:
815 GV
.FloatVal
= LHS
.FloatVal
+ RHS
.FloatVal
; break;
816 case Instruction::FSub
:
817 GV
.FloatVal
= LHS
.FloatVal
- RHS
.FloatVal
; break;
818 case Instruction::FMul
:
819 GV
.FloatVal
= LHS
.FloatVal
* RHS
.FloatVal
; break;
820 case Instruction::FDiv
:
821 GV
.FloatVal
= LHS
.FloatVal
/ RHS
.FloatVal
; break;
822 case Instruction::FRem
:
823 GV
.FloatVal
= std::fmod(LHS
.FloatVal
,RHS
.FloatVal
); break;
826 case Type::DoubleTyID
:
827 switch (CE
->getOpcode()) {
828 default: llvm_unreachable("Invalid double opcode");
829 case Instruction::FAdd
:
830 GV
.DoubleVal
= LHS
.DoubleVal
+ RHS
.DoubleVal
; break;
831 case Instruction::FSub
:
832 GV
.DoubleVal
= LHS
.DoubleVal
- RHS
.DoubleVal
; break;
833 case Instruction::FMul
:
834 GV
.DoubleVal
= LHS
.DoubleVal
* RHS
.DoubleVal
; break;
835 case Instruction::FDiv
:
836 GV
.DoubleVal
= LHS
.DoubleVal
/ RHS
.DoubleVal
; break;
837 case Instruction::FRem
:
838 GV
.DoubleVal
= std::fmod(LHS
.DoubleVal
,RHS
.DoubleVal
); break;
841 case Type::X86_FP80TyID
:
842 case Type::PPC_FP128TyID
:
843 case Type::FP128TyID
: {
844 const fltSemantics
&Sem
= CE
->getOperand(0)->getType()->getFltSemantics();
845 APFloat apfLHS
= APFloat(Sem
, LHS
.IntVal
);
846 switch (CE
->getOpcode()) {
847 default: llvm_unreachable("Invalid long double opcode");
848 case Instruction::FAdd
:
849 apfLHS
.add(APFloat(Sem
, RHS
.IntVal
), APFloat::rmNearestTiesToEven
);
850 GV
.IntVal
= apfLHS
.bitcastToAPInt();
852 case Instruction::FSub
:
853 apfLHS
.subtract(APFloat(Sem
, RHS
.IntVal
),
854 APFloat::rmNearestTiesToEven
);
855 GV
.IntVal
= apfLHS
.bitcastToAPInt();
857 case Instruction::FMul
:
858 apfLHS
.multiply(APFloat(Sem
, RHS
.IntVal
),
859 APFloat::rmNearestTiesToEven
);
860 GV
.IntVal
= apfLHS
.bitcastToAPInt();
862 case Instruction::FDiv
:
863 apfLHS
.divide(APFloat(Sem
, RHS
.IntVal
),
864 APFloat::rmNearestTiesToEven
);
865 GV
.IntVal
= apfLHS
.bitcastToAPInt();
867 case Instruction::FRem
:
868 apfLHS
.mod(APFloat(Sem
, RHS
.IntVal
));
869 GV
.IntVal
= apfLHS
.bitcastToAPInt();
881 SmallString
<256> Msg
;
882 raw_svector_ostream
OS(Msg
);
883 OS
<< "ConstantExpr not handled: " << *CE
;
884 report_fatal_error(OS
.str());
887 // Otherwise, we have a simple constant.
889 switch (C
->getType()->getTypeID()) {
890 case Type::FloatTyID
:
891 Result
.FloatVal
= cast
<ConstantFP
>(C
)->getValueAPF().convertToFloat();
893 case Type::DoubleTyID
:
894 Result
.DoubleVal
= cast
<ConstantFP
>(C
)->getValueAPF().convertToDouble();
896 case Type::X86_FP80TyID
:
897 case Type::FP128TyID
:
898 case Type::PPC_FP128TyID
:
899 Result
.IntVal
= cast
<ConstantFP
>(C
)->getValueAPF().bitcastToAPInt();
901 case Type::IntegerTyID
:
902 Result
.IntVal
= cast
<ConstantInt
>(C
)->getValue();
904 case Type::PointerTyID
:
905 while (auto *A
= dyn_cast
<GlobalAlias
>(C
)) {
908 if (isa
<ConstantPointerNull
>(C
))
909 Result
.PointerVal
= nullptr;
910 else if (const Function
*F
= dyn_cast
<Function
>(C
))
911 Result
= PTOGV(getPointerToFunctionOrStub(const_cast<Function
*>(F
)));
912 else if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(C
))
913 Result
= PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable
*>(GV
)));
915 llvm_unreachable("Unknown constant pointer type!");
917 case Type::VectorTyID
: {
920 const ConstantDataVector
*CDV
= dyn_cast
<ConstantDataVector
>(C
);
921 const ConstantVector
*CV
= dyn_cast
<ConstantVector
>(C
);
922 const ConstantAggregateZero
*CAZ
= dyn_cast
<ConstantAggregateZero
>(C
);
925 elemNum
= CDV
->getNumElements();
926 ElemTy
= CDV
->getElementType();
927 } else if (CV
|| CAZ
) {
928 VectorType
* VTy
= dyn_cast
<VectorType
>(C
->getType());
929 elemNum
= VTy
->getNumElements();
930 ElemTy
= VTy
->getElementType();
932 llvm_unreachable("Unknown constant vector type!");
935 Result
.AggregateVal
.resize(elemNum
);
936 // Check if vector holds floats.
937 if(ElemTy
->isFloatTy()) {
939 GenericValue floatZero
;
940 floatZero
.FloatVal
= 0.f
;
941 std::fill(Result
.AggregateVal
.begin(), Result
.AggregateVal
.end(),
946 for (unsigned i
= 0; i
< elemNum
; ++i
)
947 if (!isa
<UndefValue
>(CV
->getOperand(i
)))
948 Result
.AggregateVal
[i
].FloatVal
= cast
<ConstantFP
>(
949 CV
->getOperand(i
))->getValueAPF().convertToFloat();
953 for (unsigned i
= 0; i
< elemNum
; ++i
)
954 Result
.AggregateVal
[i
].FloatVal
= CDV
->getElementAsFloat(i
);
958 // Check if vector holds doubles.
959 if (ElemTy
->isDoubleTy()) {
961 GenericValue doubleZero
;
962 doubleZero
.DoubleVal
= 0.0;
963 std::fill(Result
.AggregateVal
.begin(), Result
.AggregateVal
.end(),
968 for (unsigned i
= 0; i
< elemNum
; ++i
)
969 if (!isa
<UndefValue
>(CV
->getOperand(i
)))
970 Result
.AggregateVal
[i
].DoubleVal
= cast
<ConstantFP
>(
971 CV
->getOperand(i
))->getValueAPF().convertToDouble();
975 for (unsigned i
= 0; i
< elemNum
; ++i
)
976 Result
.AggregateVal
[i
].DoubleVal
= CDV
->getElementAsDouble(i
);
980 // Check if vector holds integers.
981 if (ElemTy
->isIntegerTy()) {
983 GenericValue intZero
;
984 intZero
.IntVal
= APInt(ElemTy
->getScalarSizeInBits(), 0ull);
985 std::fill(Result
.AggregateVal
.begin(), Result
.AggregateVal
.end(),
990 for (unsigned i
= 0; i
< elemNum
; ++i
)
991 if (!isa
<UndefValue
>(CV
->getOperand(i
)))
992 Result
.AggregateVal
[i
].IntVal
= cast
<ConstantInt
>(
993 CV
->getOperand(i
))->getValue();
995 Result
.AggregateVal
[i
].IntVal
=
996 APInt(CV
->getOperand(i
)->getType()->getPrimitiveSizeInBits(), 0);
1001 for (unsigned i
= 0; i
< elemNum
; ++i
)
1002 Result
.AggregateVal
[i
].IntVal
= APInt(
1003 CDV
->getElementType()->getPrimitiveSizeInBits(),
1004 CDV
->getElementAsInteger(i
));
1008 llvm_unreachable("Unknown constant pointer type!");
1013 SmallString
<256> Msg
;
1014 raw_svector_ostream
OS(Msg
);
1015 OS
<< "ERROR: Constant unimplemented for type: " << *C
->getType();
1016 report_fatal_error(OS
.str());
1022 void ExecutionEngine::StoreValueToMemory(const GenericValue
&Val
,
1023 GenericValue
*Ptr
, Type
*Ty
) {
1024 const unsigned StoreBytes
= getDataLayout().getTypeStoreSize(Ty
);
1026 switch (Ty
->getTypeID()) {
1028 dbgs() << "Cannot store value of type " << *Ty
<< "!\n";
1030 case Type::IntegerTyID
:
1031 StoreIntToMemory(Val
.IntVal
, (uint8_t*)Ptr
, StoreBytes
);
1033 case Type::FloatTyID
:
1034 *((float*)Ptr
) = Val
.FloatVal
;
1036 case Type::DoubleTyID
:
1037 *((double*)Ptr
) = Val
.DoubleVal
;
1039 case Type::X86_FP80TyID
:
1040 memcpy(Ptr
, Val
.IntVal
.getRawData(), 10);
1042 case Type::PointerTyID
:
1043 // Ensure 64 bit target pointers are fully initialized on 32 bit hosts.
1044 if (StoreBytes
!= sizeof(PointerTy
))
1045 memset(&(Ptr
->PointerVal
), 0, StoreBytes
);
1047 *((PointerTy
*)Ptr
) = Val
.PointerVal
;
1049 case Type::VectorTyID
:
1050 for (unsigned i
= 0; i
< Val
.AggregateVal
.size(); ++i
) {
1051 if (cast
<VectorType
>(Ty
)->getElementType()->isDoubleTy())
1052 *(((double*)Ptr
)+i
) = Val
.AggregateVal
[i
].DoubleVal
;
1053 if (cast
<VectorType
>(Ty
)->getElementType()->isFloatTy())
1054 *(((float*)Ptr
)+i
) = Val
.AggregateVal
[i
].FloatVal
;
1055 if (cast
<VectorType
>(Ty
)->getElementType()->isIntegerTy()) {
1056 unsigned numOfBytes
=(Val
.AggregateVal
[i
].IntVal
.getBitWidth()+7)/8;
1057 StoreIntToMemory(Val
.AggregateVal
[i
].IntVal
,
1058 (uint8_t*)Ptr
+ numOfBytes
*i
, numOfBytes
);
1064 if (sys::IsLittleEndianHost
!= getDataLayout().isLittleEndian())
1065 // Host and target are different endian - reverse the stored bytes.
1066 std::reverse((uint8_t*)Ptr
, StoreBytes
+ (uint8_t*)Ptr
);
1071 void ExecutionEngine::LoadValueFromMemory(GenericValue
&Result
,
1074 const unsigned LoadBytes
= getDataLayout().getTypeStoreSize(Ty
);
1076 switch (Ty
->getTypeID()) {
1077 case Type::IntegerTyID
:
1078 // An APInt with all words initially zero.
1079 Result
.IntVal
= APInt(cast
<IntegerType
>(Ty
)->getBitWidth(), 0);
1080 LoadIntFromMemory(Result
.IntVal
, (uint8_t*)Ptr
, LoadBytes
);
1082 case Type::FloatTyID
:
1083 Result
.FloatVal
= *((float*)Ptr
);
1085 case Type::DoubleTyID
:
1086 Result
.DoubleVal
= *((double*)Ptr
);
1088 case Type::PointerTyID
:
1089 Result
.PointerVal
= *((PointerTy
*)Ptr
);
1091 case Type::X86_FP80TyID
: {
1092 // This is endian dependent, but it will only work on x86 anyway.
1093 // FIXME: Will not trap if loading a signaling NaN.
1096 Result
.IntVal
= APInt(80, y
);
1099 case Type::VectorTyID
: {
1100 auto *VT
= cast
<VectorType
>(Ty
);
1101 Type
*ElemT
= VT
->getElementType();
1102 const unsigned numElems
= VT
->getNumElements();
1103 if (ElemT
->isFloatTy()) {
1104 Result
.AggregateVal
.resize(numElems
);
1105 for (unsigned i
= 0; i
< numElems
; ++i
)
1106 Result
.AggregateVal
[i
].FloatVal
= *((float*)Ptr
+i
);
1108 if (ElemT
->isDoubleTy()) {
1109 Result
.AggregateVal
.resize(numElems
);
1110 for (unsigned i
= 0; i
< numElems
; ++i
)
1111 Result
.AggregateVal
[i
].DoubleVal
= *((double*)Ptr
+i
);
1113 if (ElemT
->isIntegerTy()) {
1114 GenericValue intZero
;
1115 const unsigned elemBitWidth
= cast
<IntegerType
>(ElemT
)->getBitWidth();
1116 intZero
.IntVal
= APInt(elemBitWidth
, 0);
1117 Result
.AggregateVal
.resize(numElems
, intZero
);
1118 for (unsigned i
= 0; i
< numElems
; ++i
)
1119 LoadIntFromMemory(Result
.AggregateVal
[i
].IntVal
,
1120 (uint8_t*)Ptr
+((elemBitWidth
+7)/8)*i
, (elemBitWidth
+7)/8);
1125 SmallString
<256> Msg
;
1126 raw_svector_ostream
OS(Msg
);
1127 OS
<< "Cannot load value of type " << *Ty
<< "!";
1128 report_fatal_error(OS
.str());
1132 void ExecutionEngine::InitializeMemory(const Constant
*Init
, void *Addr
) {
1133 LLVM_DEBUG(dbgs() << "JIT: Initializing " << Addr
<< " ");
1134 LLVM_DEBUG(Init
->dump());
1135 if (isa
<UndefValue
>(Init
))
1138 if (const ConstantVector
*CP
= dyn_cast
<ConstantVector
>(Init
)) {
1139 unsigned ElementSize
=
1140 getDataLayout().getTypeAllocSize(CP
->getType()->getElementType());
1141 for (unsigned i
= 0, e
= CP
->getNumOperands(); i
!= e
; ++i
)
1142 InitializeMemory(CP
->getOperand(i
), (char*)Addr
+i
*ElementSize
);
1146 if (isa
<ConstantAggregateZero
>(Init
)) {
1147 memset(Addr
, 0, (size_t)getDataLayout().getTypeAllocSize(Init
->getType()));
1151 if (const ConstantArray
*CPA
= dyn_cast
<ConstantArray
>(Init
)) {
1152 unsigned ElementSize
=
1153 getDataLayout().getTypeAllocSize(CPA
->getType()->getElementType());
1154 for (unsigned i
= 0, e
= CPA
->getNumOperands(); i
!= e
; ++i
)
1155 InitializeMemory(CPA
->getOperand(i
), (char*)Addr
+i
*ElementSize
);
1159 if (const ConstantStruct
*CPS
= dyn_cast
<ConstantStruct
>(Init
)) {
1160 const StructLayout
*SL
=
1161 getDataLayout().getStructLayout(cast
<StructType
>(CPS
->getType()));
1162 for (unsigned i
= 0, e
= CPS
->getNumOperands(); i
!= e
; ++i
)
1163 InitializeMemory(CPS
->getOperand(i
), (char*)Addr
+SL
->getElementOffset(i
));
1167 if (const ConstantDataSequential
*CDS
=
1168 dyn_cast
<ConstantDataSequential
>(Init
)) {
1169 // CDS is already laid out in host memory order.
1170 StringRef Data
= CDS
->getRawDataValues();
1171 memcpy(Addr
, Data
.data(), Data
.size());
1175 if (Init
->getType()->isFirstClassType()) {
1176 GenericValue Val
= getConstantValue(Init
);
1177 StoreValueToMemory(Val
, (GenericValue
*)Addr
, Init
->getType());
1181 LLVM_DEBUG(dbgs() << "Bad Type: " << *Init
->getType() << "\n");
1182 llvm_unreachable("Unknown constant type to initialize memory with!");
1185 /// EmitGlobals - Emit all of the global variables to memory, storing their
1186 /// addresses into GlobalAddress. This must make sure to copy the contents of
1187 /// their initializers into the memory.
1188 void ExecutionEngine::emitGlobals() {
1189 // Loop over all of the global variables in the program, allocating the memory
1190 // to hold them. If there is more than one module, do a prepass over globals
1191 // to figure out how the different modules should link together.
1192 std::map
<std::pair
<std::string
, Type
*>,
1193 const GlobalValue
*> LinkedGlobalsMap
;
1195 if (Modules
.size() != 1) {
1196 for (unsigned m
= 0, e
= Modules
.size(); m
!= e
; ++m
) {
1197 Module
&M
= *Modules
[m
];
1198 for (const auto &GV
: M
.globals()) {
1199 if (GV
.hasLocalLinkage() || GV
.isDeclaration() ||
1200 GV
.hasAppendingLinkage() || !GV
.hasName())
1201 continue;// Ignore external globals and globals with internal linkage.
1203 const GlobalValue
*&GVEntry
=
1204 LinkedGlobalsMap
[std::make_pair(GV
.getName(), GV
.getType())];
1206 // If this is the first time we've seen this global, it is the canonical
1213 // If the existing global is strong, never replace it.
1214 if (GVEntry
->hasExternalLinkage())
1217 // Otherwise, we know it's linkonce/weak, replace it if this is a strong
1218 // symbol. FIXME is this right for common?
1219 if (GV
.hasExternalLinkage() || GVEntry
->hasExternalWeakLinkage())
1225 std::vector
<const GlobalValue
*> NonCanonicalGlobals
;
1226 for (unsigned m
= 0, e
= Modules
.size(); m
!= e
; ++m
) {
1227 Module
&M
= *Modules
[m
];
1228 for (const auto &GV
: M
.globals()) {
1229 // In the multi-module case, see what this global maps to.
1230 if (!LinkedGlobalsMap
.empty()) {
1231 if (const GlobalValue
*GVEntry
=
1232 LinkedGlobalsMap
[std::make_pair(GV
.getName(), GV
.getType())]) {
1233 // If something else is the canonical global, ignore this one.
1234 if (GVEntry
!= &GV
) {
1235 NonCanonicalGlobals
.push_back(&GV
);
1241 if (!GV
.isDeclaration()) {
1242 addGlobalMapping(&GV
, getMemoryForGV(&GV
));
1244 // External variable reference. Try to use the dynamic loader to
1245 // get a pointer to it.
1247 sys::DynamicLibrary::SearchForAddressOfSymbol(GV
.getName()))
1248 addGlobalMapping(&GV
, SymAddr
);
1250 report_fatal_error("Could not resolve external global address: "
1256 // If there are multiple modules, map the non-canonical globals to their
1257 // canonical location.
1258 if (!NonCanonicalGlobals
.empty()) {
1259 for (unsigned i
= 0, e
= NonCanonicalGlobals
.size(); i
!= e
; ++i
) {
1260 const GlobalValue
*GV
= NonCanonicalGlobals
[i
];
1261 const GlobalValue
*CGV
=
1262 LinkedGlobalsMap
[std::make_pair(GV
->getName(), GV
->getType())];
1263 void *Ptr
= getPointerToGlobalIfAvailable(CGV
);
1264 assert(Ptr
&& "Canonical global wasn't codegen'd!");
1265 addGlobalMapping(GV
, Ptr
);
1269 // Now that all of the globals are set up in memory, loop through them all
1270 // and initialize their contents.
1271 for (const auto &GV
: M
.globals()) {
1272 if (!GV
.isDeclaration()) {
1273 if (!LinkedGlobalsMap
.empty()) {
1274 if (const GlobalValue
*GVEntry
=
1275 LinkedGlobalsMap
[std::make_pair(GV
.getName(), GV
.getType())])
1276 if (GVEntry
!= &GV
) // Not the canonical variable.
1279 EmitGlobalVariable(&GV
);
1285 // EmitGlobalVariable - This method emits the specified global variable to the
1286 // address specified in GlobalAddresses, or allocates new memory if it's not
1287 // already in the map.
1288 void ExecutionEngine::EmitGlobalVariable(const GlobalVariable
*GV
) {
1289 void *GA
= getPointerToGlobalIfAvailable(GV
);
1292 // If it's not already specified, allocate memory for the global.
1293 GA
= getMemoryForGV(GV
);
1295 // If we failed to allocate memory for this global, return.
1298 addGlobalMapping(GV
, GA
);
1301 // Don't initialize if it's thread local, let the client do it.
1302 if (!GV
->isThreadLocal())
1303 InitializeMemory(GV
->getInitializer(), GA
);
1305 Type
*ElTy
= GV
->getValueType();
1306 size_t GVSize
= (size_t)getDataLayout().getTypeAllocSize(ElTy
);
1307 NumInitBytes
+= (unsigned)GVSize
;