LLVM 22.0.0git
ExecutionEngine.cpp
Go to the documentation of this file.
1//===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the common interface used by the various execution engine
10// subclasses.
11//
12// FIXME: This file needs to be updated to support scalable vectors
13//
14//===----------------------------------------------------------------------===//
15
18#include "llvm/ADT/Statistic.h"
23#include "llvm/IR/Constants.h"
24#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/Mangler.h"
27#include "llvm/IR/Module.h"
28#include "llvm/IR/Operator.h"
29#include "llvm/IR/ValueHandle.h"
31#include "llvm/Object/Archive.h"
33#include "llvm/Support/Debug.h"
39#include <cmath>
40#include <cstring>
41#include <mutex>
42using namespace llvm;
43
44#define DEBUG_TYPE "jit"
45
46STATISTIC(NumInitBytes, "Number of bytes of global vars initialized");
47STATISTIC(NumGlobals , "Number of global vars initialized");
48
49ExecutionEngine *(*ExecutionEngine::MCJITCtor)(
50 std::unique_ptr<Module> M, std::string *ErrorStr,
51 std::shared_ptr<MCJITMemoryManager> MemMgr,
52 std::shared_ptr<LegacyJITSymbolResolver> Resolver,
53 std::unique_ptr<TargetMachine> TM) = nullptr;
54
55ExecutionEngine *(*ExecutionEngine::InterpCtor)(std::unique_ptr<Module> M,
56 std::string *ErrorStr) =nullptr;
57
58void JITEventListener::anchor() {}
59
60void ObjectCache::anchor() {}
61
62void ExecutionEngine::Init(std::unique_ptr<Module> M) {
63 CompilingLazily = false;
64 GVCompilationDisabled = false;
65 SymbolSearchingDisabled = false;
66
67 // IR module verification is enabled by default in debug builds, and disabled
68 // by default in release builds.
69#ifndef NDEBUG
70 VerifyModules = true;
71#else
72 VerifyModules = false;
73#endif
74
75 assert(M && "Module is null?");
76 Modules.push_back(std::move(M));
77}
78
79ExecutionEngine::ExecutionEngine(std::unique_ptr<Module> M)
80 : DL(M->getDataLayout()), LazyFunctionCreator(nullptr) {
81 Init(std::move(M));
82}
83
84ExecutionEngine::ExecutionEngine(DataLayout DL, std::unique_ptr<Module> M)
85 : DL(std::move(DL)), LazyFunctionCreator(nullptr) {
86 Init(std::move(M));
87}
88
92
93namespace {
94/// Helper class which uses a value handler to automatically deletes the
95/// memory block when the GlobalVariable is destroyed.
96class GVMemoryBlock final : public CallbackVH {
97 GVMemoryBlock(const GlobalVariable *GV)
98 : CallbackVH(const_cast<GlobalVariable*>(GV)) {}
99
100public:
101 /// Returns the address the GlobalVariable should be written into. The
102 /// GVMemoryBlock object prefixes that.
103 static char *Create(const GlobalVariable *GV, const DataLayout& TD) {
104 Type *ElTy = GV->getValueType();
105 size_t GVSize = (size_t)TD.getTypeAllocSize(ElTy);
106 void *RawMemory = ::operator new(
107 alignTo(sizeof(GVMemoryBlock), TD.getPreferredAlign(GV)) + GVSize);
108 new(RawMemory) GVMemoryBlock(GV);
109 return static_cast<char*>(RawMemory) + sizeof(GVMemoryBlock);
110 }
111
112 void deleted() override {
113 // We allocated with operator new and with some extra memory hanging off the
114 // end, so don't just delete this. I'm not sure if this is actually
115 // required.
116 this->~GVMemoryBlock();
117 ::operator delete(this);
118 }
119};
120} // anonymous namespace
121
123 return GVMemoryBlock::Create(GV, getDataLayout());
124}
125
126void ExecutionEngine::addObjectFile(std::unique_ptr<object::ObjectFile> O) {
127 llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
128}
129
130void
132 llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
133}
134
136 llvm_unreachable("ExecutionEngine subclass doesn't implement addArchive.");
137}
138
140 for (auto I = Modules.begin(), E = Modules.end(); I != E; ++I) {
141 Module *Found = I->get();
142 if (Found == M) {
143 I->release();
144 Modules.erase(I);
146 return true;
147 }
148 }
149 return false;
150}
151
153 for (const auto &M : Modules) {
154 Function *F = M->getFunction(FnName);
155 if (F && !F->isDeclaration())
156 return F;
157 }
158 return nullptr;
159}
160
162 for (const auto &M : Modules) {
163 GlobalVariable *GV = M->getGlobalVariable(Name, AllowInternal);
164 if (GV && !GV->isDeclaration())
165 return GV;
166 }
167 return nullptr;
168}
169
171 GlobalAddressMapTy::iterator I = GlobalAddressMap.find(Name);
172 uint64_t OldVal;
173
174 // FIXME: This is silly, we shouldn't end up with a mapping -> 0 in the
175 // GlobalAddressMap.
176 if (I == GlobalAddressMap.end())
177 OldVal = 0;
178 else {
179 GlobalAddressReverseMap.erase(I->second);
180 OldVal = I->second;
181 GlobalAddressMap.erase(I);
182 }
183
184 return OldVal;
185}
186
188 assert(GV->hasName() && "Global must have name.");
189
190 std::lock_guard<sys::Mutex> locked(lock);
191 SmallString<128> FullName;
192
193 const DataLayout &DL =
195 ? getDataLayout()
196 : GV->getDataLayout();
197
198 Mangler::getNameWithPrefix(FullName, GV->getName(), DL);
199 return std::string(FullName);
200}
201
203 std::lock_guard<sys::Mutex> locked(lock);
205}
206
208 std::lock_guard<sys::Mutex> locked(lock);
209
210 assert(!Name.empty() && "Empty GlobalMapping symbol name!");
211
212 LLVM_DEBUG(dbgs() << "JIT: Map \'" << Name << "\' to [" << Addr << "]\n";);
213 uint64_t &CurVal = EEState.getGlobalAddressMap()[Name];
214 assert((!CurVal || !Addr) && "GlobalMapping already established!");
215 CurVal = Addr;
216
217 // If we are using the reverse mapping, add it too.
218 if (!EEState.getGlobalAddressReverseMap().empty()) {
219 std::string &V = EEState.getGlobalAddressReverseMap()[CurVal];
220 assert((!V.empty() || !Name.empty()) &&
221 "GlobalMapping already established!");
222 V = std::string(Name);
223 }
224}
225
227 std::lock_guard<sys::Mutex> locked(lock);
228
229 EEState.getGlobalAddressMap().clear();
230 EEState.getGlobalAddressReverseMap().clear();
231}
232
234 std::lock_guard<sys::Mutex> locked(lock);
235
236 for (GlobalObject &GO : M->global_objects())
237 EEState.RemoveMapping(getMangledName(&GO));
238}
239
241 void *Addr) {
242 std::lock_guard<sys::Mutex> locked(lock);
243 return updateGlobalMapping(getMangledName(GV), (uint64_t) Addr);
244}
245
247 std::lock_guard<sys::Mutex> locked(lock);
248
250 EEState.getGlobalAddressMap();
251
252 // Deleting from the mapping?
253 if (!Addr)
254 return EEState.RemoveMapping(Name);
255
256 uint64_t &CurVal = Map[Name];
257 uint64_t OldVal = CurVal;
258
259 if (CurVal && !EEState.getGlobalAddressReverseMap().empty())
260 EEState.getGlobalAddressReverseMap().erase(CurVal);
261 CurVal = Addr;
262
263 // If we are using the reverse mapping, add it too.
264 if (!EEState.getGlobalAddressReverseMap().empty()) {
265 std::string &V = EEState.getGlobalAddressReverseMap()[CurVal];
266 assert((!V.empty() || !Name.empty()) &&
267 "GlobalMapping already established!");
268 V = std::string(Name);
269 }
270 return OldVal;
271}
272
274 std::lock_guard<sys::Mutex> locked(lock);
275 uint64_t Address = 0;
277 EEState.getGlobalAddressMap().find(S);
278 if (I != EEState.getGlobalAddressMap().end())
279 Address = I->second;
280 return Address;
281}
282
283
285 std::lock_guard<sys::Mutex> locked(lock);
286 if (void* Address = (void *) getAddressToGlobalIfAvailable(S))
287 return Address;
288 return nullptr;
289}
290
292 std::lock_guard<sys::Mutex> locked(lock);
294}
295
297 std::lock_guard<sys::Mutex> locked(lock);
298
299 // If we haven't computed the reverse mapping yet, do so first.
300 if (EEState.getGlobalAddressReverseMap().empty()) {
302 I = EEState.getGlobalAddressMap().begin(),
303 E = EEState.getGlobalAddressMap().end(); I != E; ++I) {
304 StringRef Name = I->first();
305 uint64_t Addr = I->second;
306 EEState.getGlobalAddressReverseMap().insert(
307 std::make_pair(Addr, std::string(Name)));
308 }
309 }
310
311 std::map<uint64_t, std::string>::iterator I =
312 EEState.getGlobalAddressReverseMap().find((uint64_t) Addr);
313
314 if (I != EEState.getGlobalAddressReverseMap().end()) {
315 StringRef Name = I->second;
316 for (const auto &M : Modules)
317 if (GlobalValue *GV = M->getNamedValue(Name))
318 return GV;
319 }
320 return nullptr;
321}
322
323namespace {
324class ArgvArray {
325 std::unique_ptr<char[]> Array;
326 std::vector<std::unique_ptr<char[]>> Values;
327public:
328 /// Turn a vector of strings into a nice argv style array of pointers to null
329 /// terminated strings.
330 void *reset(LLVMContext &C, ExecutionEngine *EE,
331 const std::vector<std::string> &InputArgv);
332};
333} // anonymous namespace
334void *ArgvArray::reset(LLVMContext &C, ExecutionEngine *EE,
335 const std::vector<std::string> &InputArgv) {
336 Values.clear(); // Free the old contents.
337 Values.reserve(InputArgv.size());
338 unsigned PtrSize = EE->getDataLayout().getPointerSize();
339 Array = std::make_unique<char[]>((InputArgv.size()+1)*PtrSize);
340
341 LLVM_DEBUG(dbgs() << "JIT: ARGV = " << (void *)Array.get() << "\n");
342 Type *SBytePtr = PointerType::getUnqual(C);
343
344 for (unsigned i = 0; i != InputArgv.size(); ++i) {
345 unsigned Size = InputArgv[i].size()+1;
346 auto Dest = std::make_unique<char[]>(Size);
347 LLVM_DEBUG(dbgs() << "JIT: ARGV[" << i << "] = " << (void *)Dest.get()
348 << "\n");
349
350 llvm::copy(InputArgv[i], Dest.get());
351 Dest[Size-1] = 0;
352
353 // Endian safe: Array[i] = (PointerTy)Dest;
354 EE->StoreValueToMemory(PTOGV(Dest.get()),
355 (GenericValue*)(&Array[i*PtrSize]), SBytePtr);
356 Values.push_back(std::move(Dest));
357 }
358
359 // Null terminate it
360 EE->StoreValueToMemory(PTOGV(nullptr),
361 (GenericValue*)(&Array[InputArgv.size()*PtrSize]),
362 SBytePtr);
363 return Array.get();
364}
365
367 bool isDtors) {
368 StringRef Name(isDtors ? "llvm.global_dtors" : "llvm.global_ctors");
369 GlobalVariable *GV = module.getNamedGlobal(Name);
370
371 // If this global has internal linkage, or if it has a use, then it must be
372 // an old-style (llvmgcc3) static ctor with __main linked in and in use. If
373 // this is the case, don't execute any of the global ctors, __main will do
374 // it.
375 if (!GV || GV->isDeclaration() || GV->hasLocalLinkage()) return;
376
377 // Should be an array of '{ i32, void ()* }' structs. The first value is
378 // the init priority, which we ignore.
380 if (!InitList)
381 return;
382 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
384 if (!CS) continue;
385
386 Constant *FP = CS->getOperand(1);
387 if (FP->isNullValue())
388 continue; // Found a sentinel value, ignore.
389
390 // Strip off constant expression casts.
392 if (CE->isCast())
393 FP = CE->getOperand(0);
394
395 // Execute the ctor/dtor function!
397 runFunction(F, {});
398
399 // FIXME: It is marginally lame that we just do nothing here if we see an
400 // entry we don't recognize. It might not be unreasonable for the verifier
401 // to not even allow this and just assert here.
402 }
403}
404
406 // Execute global ctors/dtors for each module in the program.
407 for (std::unique_ptr<Module> &M : Modules)
409}
410
411#ifndef NDEBUG
412/// isTargetNullPtr - Return whether the target pointer stored at Loc is null.
413static bool isTargetNullPtr(ExecutionEngine *EE, void *Loc) {
414 unsigned PtrSize = EE->getDataLayout().getPointerSize();
415 for (unsigned i = 0; i < PtrSize; ++i)
416 if (*(i + (uint8_t*)Loc))
417 return false;
418 return true;
419}
420#endif
421
423 const std::vector<std::string> &argv,
424 const char * const * envp) {
425 std::vector<GenericValue> GVArgs;
426 GenericValue GVArgc;
427 GVArgc.IntVal = APInt(32, argv.size());
428
429 // Check main() type
430 unsigned NumArgs = Fn->getFunctionType()->getNumParams();
431 FunctionType *FTy = Fn->getFunctionType();
432 Type *PPInt8Ty = PointerType::get(Fn->getContext(), 0);
433
434 // Check the argument types.
435 if (NumArgs > 3)
436 report_fatal_error("Invalid number of arguments of main() supplied");
437 if (NumArgs >= 3 && FTy->getParamType(2) != PPInt8Ty)
438 report_fatal_error("Invalid type for third argument of main() supplied");
439 if (NumArgs >= 2 && FTy->getParamType(1) != PPInt8Ty)
440 report_fatal_error("Invalid type for second argument of main() supplied");
441 if (NumArgs >= 1 && !FTy->getParamType(0)->isIntegerTy(32))
442 report_fatal_error("Invalid type for first argument of main() supplied");
443 if (!FTy->getReturnType()->isIntegerTy() &&
444 !FTy->getReturnType()->isVoidTy())
445 report_fatal_error("Invalid return type of main() supplied");
446
447 ArgvArray CArgv;
448 ArgvArray CEnv;
449 if (NumArgs) {
450 GVArgs.push_back(GVArgc); // Arg #0 = argc.
451 if (NumArgs > 1) {
452 // Arg #1 = argv.
453 GVArgs.push_back(PTOGV(CArgv.reset(Fn->getContext(), this, argv)));
454 assert(!isTargetNullPtr(this, GVTOP(GVArgs[1])) &&
455 "argv[0] was null after CreateArgv");
456 if (NumArgs > 2) {
457 std::vector<std::string> EnvVars;
458 for (unsigned i = 0; envp[i]; ++i)
459 EnvVars.emplace_back(envp[i]);
460 // Arg #2 = envp.
461 GVArgs.push_back(PTOGV(CEnv.reset(Fn->getContext(), this, EnvVars)));
462 }
463 }
464 }
465
466 return runFunction(Fn, GVArgs).IntVal.getZExtValue();
467}
468
470
471EngineBuilder::EngineBuilder(std::unique_ptr<Module> M)
472 : M(std::move(M)), WhichEngine(EngineKind::Either), ErrorStr(nullptr),
473 OptLevel(CodeGenOptLevel::Default), MemMgr(nullptr), Resolver(nullptr) {
474// IR module verification is enabled by default in debug builds, and disabled
475// by default in release builds.
476#ifndef NDEBUG
477 VerifyModules = true;
478#else
479 VerifyModules = false;
480#endif
481}
482
484
486 std::unique_ptr<RTDyldMemoryManager> mcjmm) {
487 auto SharedMM = std::shared_ptr<RTDyldMemoryManager>(std::move(mcjmm));
488 MemMgr = SharedMM;
489 Resolver = SharedMM;
490 return *this;
491}
492
494EngineBuilder::setMemoryManager(std::unique_ptr<MCJITMemoryManager> MM) {
495 MemMgr = std::shared_ptr<MCJITMemoryManager>(std::move(MM));
496 return *this;
497}
498
500EngineBuilder::setSymbolResolver(std::unique_ptr<LegacyJITSymbolResolver> SR) {
501 Resolver = std::shared_ptr<LegacyJITSymbolResolver>(std::move(SR));
502 return *this;
503}
504
506 std::unique_ptr<TargetMachine> TheTM(TM); // Take ownership.
507
508 // Make sure we can resolve symbols in the program as well. The zero arg
509 // to the function tells DynamicLibrary to load the program, not a library.
510 if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr, ErrorStr))
511 return nullptr;
512
513 // If the user specified a memory manager but didn't specify which engine to
514 // create, we assume they only want the JIT, and we fail if they only want
515 // the interpreter.
516 if (MemMgr) {
517 if (WhichEngine & EngineKind::JIT)
518 WhichEngine = EngineKind::JIT;
519 else {
520 if (ErrorStr)
521 *ErrorStr = "Cannot create an interpreter with a memory manager.";
522 return nullptr;
523 }
524 }
525
526 // Unless the interpreter was explicitly selected or the JIT is not linked,
527 // try making a JIT.
528 if ((WhichEngine & EngineKind::JIT) && TheTM) {
529 if (!TM->getTarget().hasJIT()) {
530 errs() << "WARNING: This target JIT is not designed for the host"
531 << " you are running. If bad things happen, please choose"
532 << " a different -march switch.\n";
533 }
534
535 ExecutionEngine *EE = nullptr;
537 EE = ExecutionEngine::MCJITCtor(std::move(M), ErrorStr, std::move(MemMgr),
538 std::move(Resolver), std::move(TheTM));
539
540 if (EE) {
541 EE->setVerifyModules(VerifyModules);
542 return EE;
543 }
544 }
545
546 // If we can't make a JIT and we didn't request one specifically, try making
547 // an interpreter instead.
548 if (WhichEngine & EngineKind::Interpreter) {
550 return ExecutionEngine::InterpCtor(std::move(M), ErrorStr);
551 if (ErrorStr)
552 *ErrorStr = "Interpreter has not been linked in.";
553 return nullptr;
554 }
555
556 if ((WhichEngine & EngineKind::JIT) && !ExecutionEngine::MCJITCtor) {
557 if (ErrorStr)
558 *ErrorStr = "JIT has not been linked in.";
559 }
560
561 return nullptr;
562}
563
565 if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV)))
566 return getPointerToFunction(F);
567
568 std::lock_guard<sys::Mutex> locked(lock);
569 if (void* P = getPointerToGlobalIfAvailable(GV))
570 return P;
571
572 // Global variable might have been added since interpreter started.
573 if (GlobalVariable *GVar =
574 const_cast<GlobalVariable *>(dyn_cast<GlobalVariable>(GV)))
575 emitGlobalVariable(GVar);
576 else
577 llvm_unreachable("Global hasn't had an address allocated yet!");
578
580}
581
582/// Converts a Constant* into a GenericValue, including handling of
583/// ConstantExpr values.
585 // If its undefined, return the garbage.
586 if (isa<UndefValue>(C)) {
587 GenericValue Result;
588 switch (C->getType()->getTypeID()) {
589 default:
590 break;
593 case Type::FP128TyID:
595 // Although the value is undefined, we still have to construct an APInt
596 // with the correct bit width.
597 Result.IntVal = APInt(C->getType()->getPrimitiveSizeInBits(), 0);
598 break;
599 case Type::StructTyID: {
600 // if the whole struct is 'undef' just reserve memory for the value.
601 if(StructType *STy = dyn_cast<StructType>(C->getType())) {
602 unsigned int elemNum = STy->getNumElements();
603 Result.AggregateVal.resize(elemNum);
604 for (unsigned int i = 0; i < elemNum; ++i) {
605 Type *ElemTy = STy->getElementType(i);
606 if (ElemTy->isIntegerTy())
607 Result.AggregateVal[i].IntVal =
608 APInt(ElemTy->getPrimitiveSizeInBits(), 0);
609 else if (ElemTy->isAggregateType()) {
610 const Constant *ElemUndef = UndefValue::get(ElemTy);
611 Result.AggregateVal[i] = getConstantValue(ElemUndef);
612 }
613 }
614 }
615 }
616 break;
619 "Scalable vector support not yet implemented in ExecutionEngine");
620 case Type::ArrayTyID: {
621 auto *ArrTy = cast<ArrayType>(C->getType());
622 Type *ElemTy = ArrTy->getElementType();
623 unsigned int elemNum = ArrTy->getNumElements();
624 Result.AggregateVal.resize(elemNum);
625 if (ElemTy->isIntegerTy())
626 for (unsigned int i = 0; i < elemNum; ++i)
627 Result.AggregateVal[i].IntVal =
628 APInt(ElemTy->getPrimitiveSizeInBits(), 0);
629 break;
630 }
632 // if the whole vector is 'undef' just reserve memory for the value.
633 auto *VTy = cast<FixedVectorType>(C->getType());
634 Type *ElemTy = VTy->getElementType();
635 unsigned int elemNum = VTy->getNumElements();
636 Result.AggregateVal.resize(elemNum);
637 if (ElemTy->isIntegerTy())
638 for (unsigned int i = 0; i < elemNum; ++i)
639 Result.AggregateVal[i].IntVal =
640 APInt(ElemTy->getPrimitiveSizeInBits(), 0);
641 break;
642 }
643 }
644 return Result;
645 }
646
647 // Otherwise, if the value is a ConstantExpr...
648 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
649 Constant *Op0 = CE->getOperand(0);
650 switch (CE->getOpcode()) {
651 case Instruction::GetElementPtr: {
652 // Compute the index
653 GenericValue Result = getConstantValue(Op0);
654 APInt Offset(DL.getPointerSizeInBits(), 0);
655 cast<GEPOperator>(CE)->accumulateConstantOffset(DL, Offset);
656
657 char* tmp = (char*) Result.PointerVal;
658 Result = PTOGV(tmp + Offset.getSExtValue());
659 return Result;
660 }
661 case Instruction::Trunc: {
663 uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth();
664 GV.IntVal = GV.IntVal.trunc(BitWidth);
665 return GV;
666 }
667 case Instruction::ZExt: {
669 uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth();
670 GV.IntVal = GV.IntVal.zext(BitWidth);
671 return GV;
672 }
673 case Instruction::SExt: {
675 uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth();
676 GV.IntVal = GV.IntVal.sext(BitWidth);
677 return GV;
678 }
679 case Instruction::FPTrunc: {
680 // FIXME long double
682 GV.FloatVal = float(GV.DoubleVal);
683 return GV;
684 }
685 case Instruction::FPExt:{
686 // FIXME long double
688 GV.DoubleVal = double(GV.FloatVal);
689 return GV;
690 }
691 case Instruction::UIToFP: {
693 if (CE->getType()->isFloatTy())
694 GV.FloatVal = float(GV.IntVal.roundToDouble());
695 else if (CE->getType()->isDoubleTy())
697 else if (CE->getType()->isX86_FP80Ty()) {
699 (void)apf.convertFromAPInt(GV.IntVal,
700 false,
702 GV.IntVal = apf.bitcastToAPInt();
703 }
704 return GV;
705 }
706 case Instruction::SIToFP: {
708 if (CE->getType()->isFloatTy())
709 GV.FloatVal = float(GV.IntVal.signedRoundToDouble());
710 else if (CE->getType()->isDoubleTy())
712 else if (CE->getType()->isX86_FP80Ty()) {
714 (void)apf.convertFromAPInt(GV.IntVal,
715 true,
717 GV.IntVal = apf.bitcastToAPInt();
718 }
719 return GV;
720 }
721 case Instruction::FPToUI: // double->APInt conversion handles sign
722 case Instruction::FPToSI: {
724 uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth();
725 if (Op0->getType()->isFloatTy())
727 else if (Op0->getType()->isDoubleTy())
729 else if (Op0->getType()->isX86_FP80Ty()) {
731 uint64_t v;
732 bool ignored;
734 CE->getOpcode()==Instruction::FPToSI,
735 APFloat::rmTowardZero, &ignored);
736 GV.IntVal = v; // endian?
737 }
738 return GV;
739 }
740 case Instruction::PtrToInt: {
742 uint32_t PtrWidth = DL.getTypeSizeInBits(Op0->getType());
743 assert(PtrWidth <= 64 && "Bad pointer width");
744 GV.IntVal = APInt(PtrWidth, uintptr_t(GV.PointerVal));
745 uint32_t IntWidth = DL.getTypeSizeInBits(CE->getType());
746 GV.IntVal = GV.IntVal.zextOrTrunc(IntWidth);
747 return GV;
748 }
749 case Instruction::IntToPtr: {
751 uint32_t PtrWidth = DL.getTypeSizeInBits(CE->getType());
752 GV.IntVal = GV.IntVal.zextOrTrunc(PtrWidth);
753 assert(GV.IntVal.getBitWidth() <= 64 && "Bad pointer width");
754 GV.PointerVal = PointerTy(uintptr_t(GV.IntVal.getZExtValue()));
755 return GV;
756 }
757 case Instruction::BitCast: {
759 Type* DestTy = CE->getType();
760 switch (Op0->getType()->getTypeID()) {
761 default: llvm_unreachable("Invalid bitcast operand");
763 assert(DestTy->isFloatingPointTy() && "invalid bitcast");
764 if (DestTy->isFloatTy())
765 GV.FloatVal = GV.IntVal.bitsToFloat();
766 else if (DestTy->isDoubleTy())
767 GV.DoubleVal = GV.IntVal.bitsToDouble();
768 break;
769 case Type::FloatTyID:
770 assert(DestTy->isIntegerTy(32) && "Invalid bitcast");
772 break;
773 case Type::DoubleTyID:
774 assert(DestTy->isIntegerTy(64) && "Invalid bitcast");
776 break;
778 assert(DestTy->isPointerTy() && "Invalid bitcast");
779 break; // getConstantValue(Op0) above already converted it
780 }
781 return GV;
782 }
783 case Instruction::Add:
784 case Instruction::FAdd:
785 case Instruction::Sub:
786 case Instruction::FSub:
787 case Instruction::Mul:
788 case Instruction::FMul:
789 case Instruction::UDiv:
790 case Instruction::SDiv:
791 case Instruction::URem:
792 case Instruction::SRem:
793 case Instruction::And:
794 case Instruction::Or:
795 case Instruction::Xor: {
797 GenericValue RHS = getConstantValue(CE->getOperand(1));
798 GenericValue GV;
799 switch (CE->getOperand(0)->getType()->getTypeID()) {
800 default: llvm_unreachable("Bad add type!");
802 switch (CE->getOpcode()) {
803 default: llvm_unreachable("Invalid integer opcode");
804 case Instruction::Add: GV.IntVal = LHS.IntVal + RHS.IntVal; break;
805 case Instruction::Sub: GV.IntVal = LHS.IntVal - RHS.IntVal; break;
806 case Instruction::Mul: GV.IntVal = LHS.IntVal * RHS.IntVal; break;
807 case Instruction::UDiv:GV.IntVal = LHS.IntVal.udiv(RHS.IntVal); break;
808 case Instruction::SDiv:GV.IntVal = LHS.IntVal.sdiv(RHS.IntVal); break;
809 case Instruction::URem:GV.IntVal = LHS.IntVal.urem(RHS.IntVal); break;
810 case Instruction::SRem:GV.IntVal = LHS.IntVal.srem(RHS.IntVal); break;
811 case Instruction::And: GV.IntVal = LHS.IntVal & RHS.IntVal; break;
812 case Instruction::Or: GV.IntVal = LHS.IntVal | RHS.IntVal; break;
813 case Instruction::Xor: GV.IntVal = LHS.IntVal ^ RHS.IntVal; break;
814 }
815 break;
816 case Type::FloatTyID:
817 switch (CE->getOpcode()) {
818 default: llvm_unreachable("Invalid float opcode");
819 case Instruction::FAdd:
820 GV.FloatVal = LHS.FloatVal + RHS.FloatVal; break;
821 case Instruction::FSub:
822 GV.FloatVal = LHS.FloatVal - RHS.FloatVal; break;
823 case Instruction::FMul:
824 GV.FloatVal = LHS.FloatVal * RHS.FloatVal; break;
825 case Instruction::FDiv:
826 GV.FloatVal = LHS.FloatVal / RHS.FloatVal; break;
827 case Instruction::FRem:
828 GV.FloatVal = std::fmod(LHS.FloatVal,RHS.FloatVal); break;
829 }
830 break;
831 case Type::DoubleTyID:
832 switch (CE->getOpcode()) {
833 default: llvm_unreachable("Invalid double opcode");
834 case Instruction::FAdd:
835 GV.DoubleVal = LHS.DoubleVal + RHS.DoubleVal; break;
836 case Instruction::FSub:
837 GV.DoubleVal = LHS.DoubleVal - RHS.DoubleVal; break;
838 case Instruction::FMul:
839 GV.DoubleVal = LHS.DoubleVal * RHS.DoubleVal; break;
840 case Instruction::FDiv:
841 GV.DoubleVal = LHS.DoubleVal / RHS.DoubleVal; break;
842 case Instruction::FRem:
843 GV.DoubleVal = std::fmod(LHS.DoubleVal,RHS.DoubleVal); break;
844 }
845 break;
848 case Type::FP128TyID: {
849 const fltSemantics &Sem = CE->getOperand(0)->getType()->getFltSemantics();
850 APFloat apfLHS = APFloat(Sem, LHS.IntVal);
851 switch (CE->getOpcode()) {
852 default: llvm_unreachable("Invalid long double opcode");
853 case Instruction::FAdd:
854 apfLHS.add(APFloat(Sem, RHS.IntVal), APFloat::rmNearestTiesToEven);
855 GV.IntVal = apfLHS.bitcastToAPInt();
856 break;
857 case Instruction::FSub:
858 apfLHS.subtract(APFloat(Sem, RHS.IntVal),
860 GV.IntVal = apfLHS.bitcastToAPInt();
861 break;
862 case Instruction::FMul:
863 apfLHS.multiply(APFloat(Sem, RHS.IntVal),
865 GV.IntVal = apfLHS.bitcastToAPInt();
866 break;
867 case Instruction::FDiv:
868 apfLHS.divide(APFloat(Sem, RHS.IntVal),
870 GV.IntVal = apfLHS.bitcastToAPInt();
871 break;
872 case Instruction::FRem:
873 apfLHS.mod(APFloat(Sem, RHS.IntVal));
874 GV.IntVal = apfLHS.bitcastToAPInt();
875 break;
876 }
877 }
878 break;
879 }
880 return GV;
881 }
882 default:
883 break;
884 }
885
887 raw_svector_ostream OS(Msg);
888 OS << "ConstantExpr not handled: " << *CE;
890 }
891
892 if (auto *TETy = dyn_cast<TargetExtType>(C->getType())) {
893 assert(TETy->hasProperty(TargetExtType::HasZeroInit) && C->isNullValue() &&
894 "TargetExtType only supports null constant value");
895 C = Constant::getNullValue(TETy->getLayoutType());
896 }
897
898 // Otherwise, we have a simple constant.
899 GenericValue Result;
900 switch (C->getType()->getTypeID()) {
901 case Type::FloatTyID:
902 Result.FloatVal = cast<ConstantFP>(C)->getValueAPF().convertToFloat();
903 break;
904 case Type::DoubleTyID:
905 Result.DoubleVal = cast<ConstantFP>(C)->getValueAPF().convertToDouble();
906 break;
908 case Type::FP128TyID:
910 Result.IntVal = cast <ConstantFP>(C)->getValueAPF().bitcastToAPInt();
911 break;
913 Result.IntVal = cast<ConstantInt>(C)->getValue();
914 break;
916 while (auto *A = dyn_cast<GlobalAlias>(C)) {
917 C = A->getAliasee();
918 }
920 Result.PointerVal = nullptr;
921 else if (const Function *F = dyn_cast<Function>(C))
922 Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F)));
923 else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
924 Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV)));
925 else
926 llvm_unreachable("Unknown constant pointer type!");
927 break;
930 "Scalable vector support not yet implemented in ExecutionEngine");
932 unsigned elemNum;
933 Type* ElemTy;
937
938 if (CDV) {
939 elemNum = CDV->getNumElements();
940 ElemTy = CDV->getElementType();
941 } else if (CV || CAZ) {
942 auto *VTy = cast<FixedVectorType>(C->getType());
943 elemNum = VTy->getNumElements();
944 ElemTy = VTy->getElementType();
945 } else {
946 llvm_unreachable("Unknown constant vector type!");
947 }
948
949 Result.AggregateVal.resize(elemNum);
950 // Check if vector holds floats.
951 if(ElemTy->isFloatTy()) {
952 if (CAZ) {
953 GenericValue floatZero;
954 floatZero.FloatVal = 0.f;
955 llvm::fill(Result.AggregateVal, floatZero);
956 break;
957 }
958 if(CV) {
959 for (unsigned i = 0; i < elemNum; ++i)
960 if (!isa<UndefValue>(CV->getOperand(i)))
961 Result.AggregateVal[i].FloatVal = cast<ConstantFP>(
962 CV->getOperand(i))->getValueAPF().convertToFloat();
963 break;
964 }
965 if(CDV)
966 for (unsigned i = 0; i < elemNum; ++i)
967 Result.AggregateVal[i].FloatVal = CDV->getElementAsFloat(i);
968
969 break;
970 }
971 // Check if vector holds doubles.
972 if (ElemTy->isDoubleTy()) {
973 if (CAZ) {
974 GenericValue doubleZero;
975 doubleZero.DoubleVal = 0.0;
976 llvm::fill(Result.AggregateVal, doubleZero);
977 break;
978 }
979 if(CV) {
980 for (unsigned i = 0; i < elemNum; ++i)
981 if (!isa<UndefValue>(CV->getOperand(i)))
982 Result.AggregateVal[i].DoubleVal = cast<ConstantFP>(
983 CV->getOperand(i))->getValueAPF().convertToDouble();
984 break;
985 }
986 if(CDV)
987 for (unsigned i = 0; i < elemNum; ++i)
988 Result.AggregateVal[i].DoubleVal = CDV->getElementAsDouble(i);
989
990 break;
991 }
992 // Check if vector holds integers.
993 if (ElemTy->isIntegerTy()) {
994 if (CAZ) {
995 GenericValue intZero;
996 intZero.IntVal = APInt(ElemTy->getScalarSizeInBits(), 0ull);
997 llvm::fill(Result.AggregateVal, intZero);
998 break;
999 }
1000 if(CV) {
1001 for (unsigned i = 0; i < elemNum; ++i)
1002 if (!isa<UndefValue>(CV->getOperand(i)))
1003 Result.AggregateVal[i].IntVal = cast<ConstantInt>(
1004 CV->getOperand(i))->getValue();
1005 else {
1006 Result.AggregateVal[i].IntVal =
1008 }
1009 break;
1010 }
1011 if(CDV)
1012 for (unsigned i = 0; i < elemNum; ++i)
1013 Result.AggregateVal[i].IntVal = APInt(
1015 CDV->getElementAsInteger(i));
1016
1017 break;
1018 }
1019 llvm_unreachable("Unknown constant pointer type!");
1020 } break;
1021
1022 default:
1023 SmallString<256> Msg;
1024 raw_svector_ostream OS(Msg);
1025 OS << "ERROR: Constant unimplemented for type: " << *C->getType();
1026 report_fatal_error(OS.str());
1027 }
1028
1029 return Result;
1030}
1031
1033 GenericValue *Ptr, Type *Ty) {
1034 // It is safe to treat TargetExtType as its layout type since the underlying
1035 // bits are only copied and are not inspected.
1036 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
1037 Ty = TETy->getLayoutType();
1038
1039 const unsigned StoreBytes = getDataLayout().getTypeStoreSize(Ty);
1040
1041 switch (Ty->getTypeID()) {
1042 default:
1043 dbgs() << "Cannot store value of type " << *Ty << "!\n";
1044 break;
1045 case Type::IntegerTyID:
1046 StoreIntToMemory(Val.IntVal, (uint8_t*)Ptr, StoreBytes);
1047 break;
1048 case Type::FloatTyID:
1049 *((float*)Ptr) = Val.FloatVal;
1050 break;
1051 case Type::DoubleTyID:
1052 *((double*)Ptr) = Val.DoubleVal;
1053 break;
1054 case Type::X86_FP80TyID:
1055 memcpy(static_cast<void *>(Ptr), Val.IntVal.getRawData(), 10);
1056 break;
1057 case Type::PointerTyID:
1058 // Ensure 64 bit target pointers are fully initialized on 32 bit hosts.
1059 if (StoreBytes != sizeof(PointerTy))
1060 memset(&(Ptr->PointerVal), 0, StoreBytes);
1061
1062 *((PointerTy*)Ptr) = Val.PointerVal;
1063 break;
1066 for (unsigned i = 0; i < Val.AggregateVal.size(); ++i) {
1067 if (cast<VectorType>(Ty)->getElementType()->isDoubleTy())
1068 *(((double*)Ptr)+i) = Val.AggregateVal[i].DoubleVal;
1069 if (cast<VectorType>(Ty)->getElementType()->isFloatTy())
1070 *(((float*)Ptr)+i) = Val.AggregateVal[i].FloatVal;
1071 if (cast<VectorType>(Ty)->getElementType()->isIntegerTy()) {
1072 unsigned numOfBytes =(Val.AggregateVal[i].IntVal.getBitWidth()+7)/8;
1073 StoreIntToMemory(Val.AggregateVal[i].IntVal,
1074 (uint8_t*)Ptr + numOfBytes*i, numOfBytes);
1075 }
1076 }
1077 break;
1078 }
1079
1080 if (sys::IsLittleEndianHost != getDataLayout().isLittleEndian())
1081 // Host and target are different endian - reverse the stored bytes.
1082 std::reverse((uint8_t*)Ptr, StoreBytes + (uint8_t*)Ptr);
1083}
1084
1085/// FIXME: document
1086///
1089 Type *Ty) {
1090 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
1091 Ty = TETy->getLayoutType();
1092
1093 const unsigned LoadBytes = getDataLayout().getTypeStoreSize(Ty);
1094
1095 switch (Ty->getTypeID()) {
1096 case Type::IntegerTyID:
1097 // An APInt with all words initially zero.
1098 Result.IntVal = APInt(cast<IntegerType>(Ty)->getBitWidth(), 0);
1099 LoadIntFromMemory(Result.IntVal, (uint8_t*)Ptr, LoadBytes);
1100 break;
1101 case Type::FloatTyID:
1102 Result.FloatVal = *((float*)Ptr);
1103 break;
1104 case Type::DoubleTyID:
1105 Result.DoubleVal = *((double*)Ptr);
1106 break;
1107 case Type::PointerTyID:
1108 Result.PointerVal = *((PointerTy*)Ptr);
1109 break;
1110 case Type::X86_FP80TyID: {
1111 // This is endian dependent, but it will only work on x86 anyway.
1112 // FIXME: Will not trap if loading a signaling NaN.
1113 uint64_t y[2];
1114 memcpy(y, Ptr, 10);
1115 Result.IntVal = APInt(80, y);
1116 break;
1117 }
1120 "Scalable vector support not yet implemented in ExecutionEngine");
1121 case Type::FixedVectorTyID: {
1122 auto *VT = cast<FixedVectorType>(Ty);
1123 Type *ElemT = VT->getElementType();
1124 const unsigned numElems = VT->getNumElements();
1125 if (ElemT->isFloatTy()) {
1126 Result.AggregateVal.resize(numElems);
1127 for (unsigned i = 0; i < numElems; ++i)
1128 Result.AggregateVal[i].FloatVal = *((float*)Ptr+i);
1129 }
1130 if (ElemT->isDoubleTy()) {
1131 Result.AggregateVal.resize(numElems);
1132 for (unsigned i = 0; i < numElems; ++i)
1133 Result.AggregateVal[i].DoubleVal = *((double*)Ptr+i);
1134 }
1135 if (ElemT->isIntegerTy()) {
1136 GenericValue intZero;
1137 const unsigned elemBitWidth = cast<IntegerType>(ElemT)->getBitWidth();
1138 intZero.IntVal = APInt(elemBitWidth, 0);
1139 Result.AggregateVal.resize(numElems, intZero);
1140 for (unsigned i = 0; i < numElems; ++i)
1141 LoadIntFromMemory(Result.AggregateVal[i].IntVal,
1142 (uint8_t*)Ptr+((elemBitWidth+7)/8)*i, (elemBitWidth+7)/8);
1143 }
1144 break;
1145 }
1146 default:
1147 SmallString<256> Msg;
1148 raw_svector_ostream OS(Msg);
1149 OS << "Cannot load value of type " << *Ty << "!";
1150 report_fatal_error(OS.str());
1151 }
1152}
1153
1154void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
1155 LLVM_DEBUG(dbgs() << "JIT: Initializing " << Addr << " ");
1156 LLVM_DEBUG(Init->dump());
1157 if (isa<UndefValue>(Init))
1158 return;
1159
1160 if (const ConstantVector *CP = dyn_cast<ConstantVector>(Init)) {
1161 unsigned ElementSize =
1162 getDataLayout().getTypeAllocSize(CP->getType()->getElementType());
1163 for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
1164 InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
1165 return;
1166 }
1167
1168 if (isa<ConstantAggregateZero>(Init)) {
1169 memset(Addr, 0, (size_t)getDataLayout().getTypeAllocSize(Init->getType()));
1170 return;
1171 }
1172
1173 if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) {
1174 unsigned ElementSize =
1175 getDataLayout().getTypeAllocSize(CPA->getType()->getElementType());
1176 for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
1177 InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
1178 return;
1179 }
1180
1181 if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) {
1182 const StructLayout *SL =
1184 for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
1185 InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
1186 return;
1187 }
1188
1189 if (const ConstantDataSequential *CDS =
1191 // CDS is already laid out in host memory order.
1192 StringRef Data = CDS->getRawDataValues();
1193 memcpy(Addr, Data.data(), Data.size());
1194 return;
1195 }
1196
1197 if (Init->getType()->isFirstClassType()) {
1198 GenericValue Val = getConstantValue(Init);
1199 StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
1200 return;
1201 }
1202
1203 LLVM_DEBUG(dbgs() << "Bad Type: " << *Init->getType() << "\n");
1204 llvm_unreachable("Unknown constant type to initialize memory with!");
1205}
1206
1207/// EmitGlobals - Emit all of the global variables to memory, storing their
1208/// addresses into GlobalAddress. This must make sure to copy the contents of
1209/// their initializers into the memory.
1211 // Loop over all of the global variables in the program, allocating the memory
1212 // to hold them. If there is more than one module, do a prepass over globals
1213 // to figure out how the different modules should link together.
1214 std::map<std::pair<std::string, Type*>,
1215 const GlobalValue*> LinkedGlobalsMap;
1216
1217 if (Modules.size() != 1) {
1218 for (const auto &M : Modules) {
1219 for (const auto &GV : M->globals()) {
1220 if (GV.hasLocalLinkage() || GV.isDeclaration() ||
1221 GV.hasAppendingLinkage() || !GV.hasName())
1222 continue;// Ignore external globals and globals with internal linkage.
1223
1224 const GlobalValue *&GVEntry = LinkedGlobalsMap[std::make_pair(
1225 std::string(GV.getName()), GV.getType())];
1226
1227 // If this is the first time we've seen this global, it is the canonical
1228 // version.
1229 if (!GVEntry) {
1230 GVEntry = &GV;
1231 continue;
1232 }
1233
1234 // If the existing global is strong, never replace it.
1235 if (GVEntry->hasExternalLinkage())
1236 continue;
1237
1238 // Otherwise, we know it's linkonce/weak, replace it if this is a strong
1239 // symbol. FIXME is this right for common?
1240 if (GV.hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
1241 GVEntry = &GV;
1242 }
1243 }
1244 }
1245
1246 std::vector<const GlobalValue*> NonCanonicalGlobals;
1247 for (const auto &M : Modules) {
1248 for (const auto &GV : M->globals()) {
1249 // In the multi-module case, see what this global maps to.
1250 if (!LinkedGlobalsMap.empty()) {
1251 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1252 std::string(GV.getName()), GV.getType())]) {
1253 // If something else is the canonical global, ignore this one.
1254 if (GVEntry != &GV) {
1255 NonCanonicalGlobals.push_back(&GV);
1256 continue;
1257 }
1258 }
1259 }
1260
1261 if (!GV.isDeclaration()) {
1263 } else {
1264 // External variable reference. Try to use the dynamic loader to
1265 // get a pointer to it.
1267 std::string(GV.getName())))
1268 addGlobalMapping(&GV, SymAddr);
1269 else {
1270 report_fatal_error("Could not resolve external global address: "
1271 +GV.getName());
1272 }
1273 }
1274 }
1275
1276 // If there are multiple modules, map the non-canonical globals to their
1277 // canonical location.
1278 if (!NonCanonicalGlobals.empty()) {
1279 for (const GlobalValue *GV : NonCanonicalGlobals) {
1280 const GlobalValue *CGV = LinkedGlobalsMap[std::make_pair(
1281 std::string(GV->getName()), GV->getType())];
1283 assert(Ptr && "Canonical global wasn't codegen'd!");
1284 addGlobalMapping(GV, Ptr);
1285 }
1286 }
1287
1288 // Now that all of the globals are set up in memory, loop through them all
1289 // and initialize their contents.
1290 for (const auto &GV : M->globals()) {
1291 if (!GV.isDeclaration()) {
1292 if (!LinkedGlobalsMap.empty()) {
1293 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1294 std::string(GV.getName()), GV.getType())])
1295 if (GVEntry != &GV) // Not the canonical variable.
1296 continue;
1297 }
1298 emitGlobalVariable(&GV);
1299 }
1300 }
1301 }
1302}
1303
1304// EmitGlobalVariable - This method emits the specified global variable to the
1305// address specified in GlobalAddresses, or allocates new memory if it's not
1306// already in the map.
1308 void *GA = getPointerToGlobalIfAvailable(GV);
1309
1310 if (!GA) {
1311 // If it's not already specified, allocate memory for the global.
1312 GA = getMemoryForGV(GV);
1313
1314 // If we failed to allocate memory for this global, return.
1315 if (!GA) return;
1316
1317 addGlobalMapping(GV, GA);
1318 }
1319
1320 // Don't initialize if it's thread local, let the client do it.
1321 if (!GV->isThreadLocal())
1323
1324 Type *ElTy = GV->getValueType();
1325 size_t GVSize = (size_t)getDataLayout().getTypeAllocSize(ElTy);
1326 NumInitBytes += (unsigned)GVSize;
1327 ++NumGlobals;
1328}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool isTargetNullPtr(ExecutionEngine *EE, void *Loc)
isTargetNullPtr - Return whether the target pointer stored at Loc is null.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
#define P(N)
This file defines the SmallString class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:167
#define LLVM_DEBUG(...)
Definition Debug.h:119
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1208
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1190
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1181
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1347
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1199
APInt bitcastToAPInt() const
Definition APFloat.h:1353
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1332
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1226
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition APFloat.h:1079
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1573
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1012
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1540
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1033
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
static APInt floatToBits(float V)
Converts a float to APInt bits.
Definition APInt.h:1752
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1666
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1488
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1644
double signedRoundToDouble() const
Converts this signed APInt to a double value.
Definition APInt.h:1715
float bitsToFloat() const
Converts APInt bits to a float.
Definition APInt.h:1736
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1736
static APInt doubleToBits(double V)
Converts a double to APInt bits.
Definition APInt.h:1744
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:985
double bitsToDouble() const
Converts APInt bits to a double.
Definition APInt.h:1722
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition APInt.h:569
LLVM_ABI double roundToDouble(bool isSigned) const
Converts this APInt to a double value.
Definition APInt.cpp:880
Value handle with callbacks on RAUW and destruction.
All zero aggregate value.
Definition Constants.h:359
ConstantArray - Constant Array Declarations.
Definition Constants.h:433
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:593
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
LLVM_ABI float getElementAsFloat(uint64_t i) const
If this is an sequential container of floats, return the specified element as a float.
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
LLVM_ABI double getElementAsDouble(uint64_t i) const
If this is an sequential container of doubles, return the specified element as a double.
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
A vector constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
Definition Constants.h:776
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1120
Constant Vector Declarations.
Definition Constants.h:517
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
bool isDefault() const
Test if the DataLayout was constructed from an empty string.
Definition DataLayout.h:211
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
LLVM_ABI Align getPreferredAlign(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:468
Builder class for ExecutionEngines.
LLVM_ABI EngineBuilder & setMCJITMemoryManager(std::unique_ptr< RTDyldMemoryManager > mcjmm)
setMCJITMemoryManager - Sets the MCJIT memory manager to use.
LLVM_ABI EngineBuilder()
Default constructor for EngineBuilder.
LLVM_ABI EngineBuilder & setSymbolResolver(std::unique_ptr< LegacyJITSymbolResolver > SR)
LLVM_ABI ~EngineBuilder()
LLVM_ABI EngineBuilder & setMemoryManager(std::unique_ptr< MCJITMemoryManager > MM)
ExecutionEngine * create()
LLVM_ABI uint64_t RemoveMapping(StringRef Name)
Erase an entry from the mapping table.
StringMap< uint64_t > GlobalAddressMapTy
Abstract interface for implementation execution of LLVM modules, designed to support both interpreter...
void setVerifyModules(bool Verify)
Enable/Disable IR module verification.
void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr, Type *Ty)
StoreValueToMemory - Stores the data in Val of type Ty at address Ptr.
GenericValue getConstantValue(const Constant *C)
Converts a Constant* into a GenericValue, including handling of ConstantExpr values.
const DataLayout & getDataLayout() const
void * getPointerToGlobalIfAvailable(StringRef S)
getPointerToGlobalIfAvailable - This returns the address of the specified global value if it is has a...
void clearAllGlobalMappings()
clearAllGlobalMappings - Clear all global mappings and start over again, for use in dynamic compilati...
virtual void addArchive(object::OwningBinary< object::Archive > A)
addArchive - Add an Archive to the execution engine.
void InitializeMemory(const Constant *Init, void *Addr)
virtual void * getPointerToFunctionOrStub(Function *F)
getPointerToFunctionOrStub - If the specified function has been code-gen'd, return a pointer to the f...
std::string getMangledName(const GlobalValue *GV)
getMangledName - Get mangled name.
virtual bool removeModule(Module *M)
removeModule - Removes a Module from the list of modules, but does not free the module's memory.
virtual void * getPointerToFunction(Function *F)=0
getPointerToFunction - The different EE's represent function bodies in different ways.
sys::Mutex lock
lock - This lock protects the ExecutionEngine and MCJIT classes.
static ExecutionEngine *(* InterpCtor)(std::unique_ptr< Module > M, std::string *ErrorStr)
virtual void runStaticConstructorsDestructors(bool isDtors)
runStaticConstructorsDestructors - This method is used to execute all of the static constructors or d...
static ExecutionEngine *(* MCJITCtor)(std::unique_ptr< Module > M, std::string *ErrorStr, std::shared_ptr< MCJITMemoryManager > MM, std::shared_ptr< LegacyJITSymbolResolver > SR, std::unique_ptr< TargetMachine > TM)
FunctionCreator LazyFunctionCreator
LazyFunctionCreator - If an unknown function is needed, this function pointer is invoked to create it...
void addGlobalMapping(const GlobalValue *GV, void *Addr)
addGlobalMapping - Tell the execution engine that the specified global is at the specified location.
SmallVector< std::unique_ptr< Module >, 1 > Modules
The list of Modules that we are JIT'ing from.
const GlobalValue * getGlobalValueAtAddress(void *Addr)
getGlobalValueAtAddress - Return the LLVM global value object that starts at the specified address.
ExecutionEngine(DataLayout DL)
void clearGlobalMappingsFromModule(Module *M)
clearGlobalMappingsFromModule - Clear all global mappings that came from a particular module,...
void * getPointerToGlobal(const GlobalValue *GV)
getPointerToGlobal - This returns the address of the specified global value.
int runFunctionAsMain(Function *Fn, const std::vector< std::string > &argv, const char *const *envp)
runFunctionAsMain - This is a helper function which wraps runFunction to handle the common task of st...
virtual void addObjectFile(std::unique_ptr< object::ObjectFile > O)
addObjectFile - Add an ObjectFile to the execution engine.
virtual void * getOrEmitGlobalVariable(const GlobalVariable *GV)
getOrEmitGlobalVariable - Return the address of the specified global variable, possibly emitting it t...
uint64_t getAddressToGlobalIfAvailable(StringRef S)
getAddressToGlobalIfAvailable - This returns the address of the specified global symbol.
void emitGlobalVariable(const GlobalVariable *GV)
virtual GlobalVariable * FindGlobalVariableNamed(StringRef Name, bool AllowInternal=false)
FindGlobalVariableNamed - Search all of the active modules to find the global variable that defines N...
virtual GenericValue runFunction(Function *F, ArrayRef< GenericValue > ArgValues)=0
runFunction - Execute the specified function with the specified arguments, and return the result.
void emitGlobals()
EmitGlobals - Emit all of the global variables to memory, storing their addresses into GlobalAddress.
void LoadValueFromMemory(GenericValue &Result, GenericValue *Ptr, Type *Ty)
FIXME: document.
uint64_t updateGlobalMapping(const GlobalValue *GV, void *Addr)
updateGlobalMapping - Replace an existing mapping for GV with a new address.
virtual char * getMemoryForGV(const GlobalVariable *GV)
getMemoryforGV - Allocate memory for a global variable.
virtual Function * FindFunctionNamed(StringRef FnName)
FindFunctionNamed - Search all of the active modules to find the function that defines FnName.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:209
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:359
bool hasExternalLinkage() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:316
bool hasLocalLinkage() const
bool hasExternalWeakLinkage() const
PointerType * getType() const
Global values are always pointers.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:132
bool hasAppendingLinkage() const
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
Definition Mangler.cpp:121
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:303
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition Record.h:2199
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
StringMapIterBase< uint64_t, false > iterator
Definition StringMap.h:221
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:623
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:654
Class to represent struct types.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
Primary interface to the complete machine description for the target machine.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isX86_FP80Ty() const
Return true if this is x86 long double.
Definition Type.h:159
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:153
@ ArrayTyID
Arrays.
Definition Type.h:74
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:76
@ FloatTyID
32-bit floating point type
Definition Type.h:58
@ StructTyID
Structures.
Definition Type.h:73
@ IntegerTyID
Arbitrary bit width integers.
Definition Type.h:70
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:75
@ DoubleTyID
64-bit floating point type
Definition Type.h:59
@ X86_FP80TyID
80-bit floating point type (X87)
Definition Type.h:60
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
Definition Type.h:62
@ PointerTyID
Pointers.
Definition Type.h:72
@ FP128TyID
128-bit floating point type (112-bit significand)
Definition Type.h:61
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:198
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:156
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:184
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
TypeID getTypeID() const
Return the type id for the type.
Definition Type.h:136
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Value * getOperand(unsigned i) const
Definition User.h:232
unsigned getNumOperands() const
Definition User.h:254
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasName() const
Definition Value.h:262
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
static bool LoadLibraryPermanently(const char *Filename, std::string *ErrMsg=nullptr)
This function permanently loads the dynamic library at the given path.
static LLVM_ABI void * SearchForAddressOfSymbol(const char *symbolName)
This function will search through all previously loaded dynamic libraries for the symbol symbolName.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
APInt RoundFloatToAPInt(float Float, unsigned width)
Converts a float value into a APInt.
Definition APInt.h:2349
LLVM_ABI APInt RoundDoubleToAPInt(double Double, unsigned width)
Converts the given double value into a APInt.
Definition APInt.cpp:841
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1747
LLVM_ABI void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
StoreIntToMemory - Fills the StoreBytes bytes of memory starting from Dst with the integer held in In...
Definition APInt.cpp:3051
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
void * PointerTy
GenericValue PTOGV(void *P)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:155
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1837
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1869
void * GVTOP(const GenericValue &GV)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, unsigned LoadBytes)
LoadIntFromMemory - Loads the integer stored in the LoadBytes bytes starting from Src into IntVal,...
Definition APInt.cpp:3077
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:851
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:304
static constexpr roundingMode rmTowardZero
Definition APFloat.h:308
static LLVM_ABI const fltSemantics & x87DoubleExtended() LLVM_READNONE
Definition APFloat.cpp:289
std::vector< GenericValue > AggregateVal