LLVM 23.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 = std::move(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 Type *ElemTy = cast<FixedVectorType>(C->getType())->getElementType();
933 if (!ElemTy->isIntegerTy() && !ElemTy->isFloatTy() && !ElemTy->isDoubleTy())
934 llvm_unreachable("Unknown constant pointer type!");
935
936 unsigned ElemNum = cast<FixedVectorType>(C->getType())->getNumElements();
937 Result.AggregateVal.resize(ElemNum);
938 for (unsigned I = 0; I < ElemNum; ++I) {
939 Constant *Elt = C->getAggregateElement(I);
940 if (!Elt)
941 llvm_unreachable("Failed to extract element from constant vector!");
942
943 if (auto *CI = dyn_cast<ConstantInt>(Elt))
944 Result.AggregateVal[I].IntVal = CI->getValue();
945 else if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
946 APFloat Val = CFP->getValueAPF();
947 if (ElemTy->isFloatTy())
948 Result.AggregateVal[I].FloatVal = Val.convertToFloat();
949 else
950 Result.AggregateVal[I].DoubleVal = Val.convertToDouble();
951 } else if (isa<UndefValue>(Elt)) {
952 if (ElemTy->isIntegerTy())
953 Result.AggregateVal[I].IntVal =
954 APInt(ElemTy->getScalarSizeInBits(), 0ull);
955 } else
956 llvm_unreachable("Unknown constant pointer type!");
957 }
958 } break;
959
960 default:
962 raw_svector_ostream OS(Msg);
963 OS << "ERROR: Constant unimplemented for type: " << *C->getType();
965 }
966
967 return Result;
968}
969
971 GenericValue *Ptr, Type *Ty) {
972 // It is safe to treat TargetExtType as its layout type since the underlying
973 // bits are only copied and are not inspected.
974 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
975 Ty = TETy->getLayoutType();
976
977 const unsigned StoreBytes = getDataLayout().getTypeStoreSize(Ty);
978
979 switch (Ty->getTypeID()) {
980 default:
981 dbgs() << "Cannot store value of type " << *Ty << "!\n";
982 break;
984 StoreIntToMemory(Val.IntVal, (uint8_t*)Ptr, StoreBytes);
985 break;
986 case Type::FloatTyID:
987 *((float*)Ptr) = Val.FloatVal;
988 break;
989 case Type::DoubleTyID:
990 *((double*)Ptr) = Val.DoubleVal;
991 break;
993 memcpy(static_cast<void *>(Ptr), Val.IntVal.getRawData(), 10);
994 break;
996 // Ensure 64 bit target pointers are fully initialized on 32 bit hosts.
997 if (StoreBytes != sizeof(PointerTy))
998 memset(&(Ptr->PointerVal), 0, StoreBytes);
999
1000 *((PointerTy*)Ptr) = Val.PointerVal;
1001 break;
1004 for (unsigned i = 0; i < Val.AggregateVal.size(); ++i) {
1005 if (cast<VectorType>(Ty)->getElementType()->isDoubleTy())
1006 *(((double*)Ptr)+i) = Val.AggregateVal[i].DoubleVal;
1007 if (cast<VectorType>(Ty)->getElementType()->isFloatTy())
1008 *(((float*)Ptr)+i) = Val.AggregateVal[i].FloatVal;
1009 if (cast<VectorType>(Ty)->getElementType()->isIntegerTy()) {
1010 unsigned numOfBytes =(Val.AggregateVal[i].IntVal.getBitWidth()+7)/8;
1011 StoreIntToMemory(Val.AggregateVal[i].IntVal,
1012 (uint8_t*)Ptr + numOfBytes*i, numOfBytes);
1013 }
1014 }
1015 break;
1016 }
1017
1018 if (sys::IsLittleEndianHost != getDataLayout().isLittleEndian())
1019 // Host and target are different endian - reverse the stored bytes.
1020 std::reverse((uint8_t*)Ptr, StoreBytes + (uint8_t*)Ptr);
1021}
1022
1023/// FIXME: document
1024///
1026 GenericValue *Ptr,
1027 Type *Ty) {
1028 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
1029 Ty = TETy->getLayoutType();
1030
1031 const unsigned LoadBytes = getDataLayout().getTypeStoreSize(Ty);
1032
1033 switch (Ty->getTypeID()) {
1034 case Type::IntegerTyID:
1035 // An APInt with all words initially zero.
1036 Result.IntVal = APInt(cast<IntegerType>(Ty)->getBitWidth(), 0);
1037 LoadIntFromMemory(Result.IntVal, (uint8_t*)Ptr, LoadBytes);
1038 break;
1039 case Type::FloatTyID:
1040 Result.FloatVal = *((float*)Ptr);
1041 break;
1042 case Type::DoubleTyID:
1043 Result.DoubleVal = *((double*)Ptr);
1044 break;
1045 case Type::PointerTyID:
1046 Result.PointerVal = *((PointerTy*)Ptr);
1047 break;
1048 case Type::X86_FP80TyID: {
1049 // This is endian dependent, but it will only work on x86 anyway.
1050 // FIXME: Will not trap if loading a signaling NaN.
1051 uint64_t y[2];
1052 memcpy(y, Ptr, 10);
1053 Result.IntVal = APInt(80, y);
1054 break;
1055 }
1058 "Scalable vector support not yet implemented in ExecutionEngine");
1059 case Type::FixedVectorTyID: {
1060 auto *VT = cast<FixedVectorType>(Ty);
1061 Type *ElemT = VT->getElementType();
1062 const unsigned numElems = VT->getNumElements();
1063 if (ElemT->isFloatTy()) {
1064 Result.AggregateVal.resize(numElems);
1065 for (unsigned i = 0; i < numElems; ++i)
1066 Result.AggregateVal[i].FloatVal = *((float*)Ptr+i);
1067 }
1068 if (ElemT->isDoubleTy()) {
1069 Result.AggregateVal.resize(numElems);
1070 for (unsigned i = 0; i < numElems; ++i)
1071 Result.AggregateVal[i].DoubleVal = *((double*)Ptr+i);
1072 }
1073 if (ElemT->isIntegerTy()) {
1074 GenericValue intZero;
1075 const unsigned elemBitWidth = cast<IntegerType>(ElemT)->getBitWidth();
1076 intZero.IntVal = APInt(elemBitWidth, 0);
1077 Result.AggregateVal.resize(numElems, intZero);
1078 for (unsigned i = 0; i < numElems; ++i)
1079 LoadIntFromMemory(Result.AggregateVal[i].IntVal,
1080 (uint8_t*)Ptr+((elemBitWidth+7)/8)*i, (elemBitWidth+7)/8);
1081 }
1082 break;
1083 }
1084 default:
1085 SmallString<256> Msg;
1086 raw_svector_ostream OS(Msg);
1087 OS << "Cannot load value of type " << *Ty << "!";
1088 report_fatal_error(OS.str());
1089 }
1090}
1091
1092void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
1093 LLVM_DEBUG(dbgs() << "JIT: Initializing " << Addr << " ");
1094 LLVM_DEBUG(Init->dump());
1095 if (isa<UndefValue>(Init))
1096 return;
1097
1098 if (const ConstantVector *CP = dyn_cast<ConstantVector>(Init)) {
1099 unsigned ElementSize =
1100 getDataLayout().getTypeAllocSize(CP->getType()->getElementType());
1101 for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
1102 InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
1103 return;
1104 }
1105
1106 if (isa<ConstantAggregateZero>(Init)) {
1107 memset(Addr, 0, (size_t)getDataLayout().getTypeAllocSize(Init->getType()));
1108 return;
1109 }
1110
1111 if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) {
1112 unsigned ElementSize =
1113 getDataLayout().getTypeAllocSize(CPA->getType()->getElementType());
1114 for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
1115 InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
1116 return;
1117 }
1118
1119 if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) {
1120 const StructLayout *SL =
1122 for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
1123 InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
1124 return;
1125 }
1126
1127 if (const ConstantDataSequential *CDS =
1129 // CDS is already laid out in host memory order.
1130 StringRef Data = CDS->getRawDataValues();
1131 memcpy(Addr, Data.data(), Data.size());
1132 return;
1133 }
1134
1135 if (Init->getType()->isFirstClassType()) {
1136 GenericValue Val = getConstantValue(Init);
1137 StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
1138 return;
1139 }
1140
1141 LLVM_DEBUG(dbgs() << "Bad Type: " << *Init->getType() << "\n");
1142 llvm_unreachable("Unknown constant type to initialize memory with!");
1143}
1144
1145/// EmitGlobals - Emit all of the global variables to memory, storing their
1146/// addresses into GlobalAddress. This must make sure to copy the contents of
1147/// their initializers into the memory.
1149 // Loop over all of the global variables in the program, allocating the memory
1150 // to hold them. If there is more than one module, do a prepass over globals
1151 // to figure out how the different modules should link together.
1152 std::map<std::pair<std::string, Type*>,
1153 const GlobalValue*> LinkedGlobalsMap;
1154
1155 if (Modules.size() != 1) {
1156 for (const auto &M : Modules) {
1157 for (const auto &GV : M->globals()) {
1158 if (GV.hasLocalLinkage() || GV.isDeclaration() ||
1159 GV.hasAppendingLinkage() || !GV.hasName())
1160 continue;// Ignore external globals and globals with internal linkage.
1161
1162 const GlobalValue *&GVEntry = LinkedGlobalsMap[std::make_pair(
1163 std::string(GV.getName()), GV.getType())];
1164
1165 // If this is the first time we've seen this global, it is the canonical
1166 // version.
1167 if (!GVEntry) {
1168 GVEntry = &GV;
1169 continue;
1170 }
1171
1172 // If the existing global is strong, never replace it.
1173 if (GVEntry->hasExternalLinkage())
1174 continue;
1175
1176 // Otherwise, we know it's linkonce/weak, replace it if this is a strong
1177 // symbol. FIXME is this right for common?
1178 if (GV.hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
1179 GVEntry = &GV;
1180 }
1181 }
1182 }
1183
1184 std::vector<const GlobalValue*> NonCanonicalGlobals;
1185 for (const auto &M : Modules) {
1186 for (const auto &GV : M->globals()) {
1187 // In the multi-module case, see what this global maps to.
1188 if (!LinkedGlobalsMap.empty()) {
1189 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1190 std::string(GV.getName()), GV.getType())]) {
1191 // If something else is the canonical global, ignore this one.
1192 if (GVEntry != &GV) {
1193 NonCanonicalGlobals.push_back(&GV);
1194 continue;
1195 }
1196 }
1197 }
1198
1199 if (!GV.isDeclaration()) {
1201 } else {
1202 // External variable reference. Try to use the dynamic loader to
1203 // get a pointer to it.
1205 std::string(GV.getName())))
1206 addGlobalMapping(&GV, SymAddr);
1207 else {
1208 report_fatal_error("Could not resolve external global address: "
1209 +GV.getName());
1210 }
1211 }
1212 }
1213
1214 // If there are multiple modules, map the non-canonical globals to their
1215 // canonical location.
1216 if (!NonCanonicalGlobals.empty()) {
1217 for (const GlobalValue *GV : NonCanonicalGlobals) {
1218 const GlobalValue *CGV = LinkedGlobalsMap[std::make_pair(
1219 std::string(GV->getName()), GV->getType())];
1220 void *Ptr = getPointerToGlobalIfAvailable(CGV);
1221 assert(Ptr && "Canonical global wasn't codegen'd!");
1222 addGlobalMapping(GV, Ptr);
1223 }
1224 }
1225
1226 // Now that all of the globals are set up in memory, loop through them all
1227 // and initialize their contents.
1228 for (const auto &GV : M->globals()) {
1229 if (!GV.isDeclaration()) {
1230 if (!LinkedGlobalsMap.empty()) {
1231 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1232 std::string(GV.getName()), GV.getType())])
1233 if (GVEntry != &GV) // Not the canonical variable.
1234 continue;
1235 }
1236 emitGlobalVariable(&GV);
1237 }
1238 }
1239 }
1240}
1241
1242// EmitGlobalVariable - This method emits the specified global variable to the
1243// address specified in GlobalAddresses, or allocates new memory if it's not
1244// already in the map.
1246 void *GA = getPointerToGlobalIfAvailable(GV);
1247
1248 if (!GA) {
1249 // If it's not already specified, allocate memory for the global.
1250 GA = getMemoryForGV(GV);
1251
1252 // If we failed to allocate memory for this global, return.
1253 if (!GA) return;
1254
1255 addGlobalMapping(GV, GA);
1256 }
1257
1258 // Don't initialize if it's thread local, let the client do it.
1259 if (!GV->isThreadLocal())
1261
1262 Type *ElTy = GV->getValueType();
1263 size_t GVSize = (size_t)getDataLayout().getTypeAllocSize(ElTy);
1264 NumInitBytes += (unsigned)GVSize;
1265 ++NumGlobals;
1266}
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:54
#define I(x, y, z)
Definition MD5.cpp:57
#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:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & x87DoubleExtended()
Definition APFloat.h:317
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1259
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1241
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition APFloat.cpp:6034
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1232
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1398
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1250
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
Definition APFloat.cpp:6065
APInt bitcastToAPInt() const
Definition APFloat.h:1404
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1383
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1277
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition APFloat.h:1130
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1023
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1044
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:1767
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1677
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1655
double signedRoundToDouble() const
Converts this signed APInt to a double value.
Definition APInt.h:1730
float bitsToFloat() const
Converts APInt bits to a float.
Definition APInt.h:1751
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1747
static APInt doubleToBits(double V)
Converts a double to APInt bits.
Definition APInt.h:1759
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:996
double bitsToDouble() const
Converts APInt bits to a double.
Definition APInt.h:1737
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition APInt.h:576
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.
ConstantArray - Constant Array Declarations.
Definition Constants.h:438
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:598
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1130
Constant Vector Declarations.
Definition Constants.h:522
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:64
bool isDefault() const
Test if the DataLayout was constructed from an empty string.
Definition DataLayout.h:227
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...
LLVM_ABI 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:568
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:211
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:358
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:329
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:133
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:298
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:723
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:754
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.
const Target & getTarget() const
bool hasJIT() const
hasJIT - Check if this targets supports the just-in-time compilation.
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
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:207
unsigned getNumOperands() const
Definition User.h:229
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:2364
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.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
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:3062
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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:163
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:547
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:144
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
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:1917
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:559
@ 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:3088
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
std::vector< GenericValue > AggregateVal