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
85 : DL(std::move(DL)), LazyFunctionCreator(nullptr) {
86 Init(std::move(M));
87}
88
91}
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);
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.
379 ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer());
380 if (!InitList)
381 return;
382 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
383 ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(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.
391 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(FP))
392 if (CE->isCast())
393 FP = CE->getOperand(0);
394
395 // Execute the ctor/dtor function!
396 if (Function *F = dyn_cast<Function>(FP))
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);
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,
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
888 OS << "ConstantExpr not handled: " << *CE;
889 report_fatal_error(OS.str());
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 }
919 if (isa<ConstantPointerNull>(C))
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;
934 const ConstantDataVector *CDV = dyn_cast<ConstantDataVector>(C);
935 const ConstantVector *CV = dyn_cast<ConstantVector>(C);
936 const ConstantAggregateZero *CAZ = dyn_cast<ConstantAggregateZero>(C);
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;
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;
1149 OS << "Cannot load value of type " << *Ty << "!";
1150 report_fatal_error(OS.str());
1151 }
1152}
1153
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 =
1183 getDataLayout().getStructLayout(cast<StructType>(CPS->getType()));
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 =
1190 dyn_cast<ConstantDataSequential>(Init)) {
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()) {
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!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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...
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
uint64_t Addr
std::string Name
uint64_t Size
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)
raw_pwrite_stream & OS
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.
Value * RHS
Value * LHS
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 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
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1488
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
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.
Definition: ValueHandle.h:384
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 ...
Definition: Constants.cpp:3112
LLVM_ABI float getElementAsFloat(uint64_t i) const
If this is an sequential container of floats, return the specified element as a float.
Definition: Constants.cpp:3185
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
Definition: Constants.cpp:2860
LLVM_ABI double getElementAsDouble(uint64_t i) const
If this is an sequential container of doubles, return the specified element as a double.
Definition: Constants.cpp:3191
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
Definition: Constants.cpp:2834
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.
Definition: Constants.cpp:373
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition: DataLayout.h:390
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...
Definition: DataLayout.cpp:708
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:504
LLVM_ABI Align getPreferredAlign(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
Definition: DataLayout.cpp:987
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
Definition: DataLayout.cpp:738
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition: DataLayout.h:674
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()
std::map< uint64_t, std::string > & getGlobalAddressReverseMap()
LLVM_ABI uint64_t RemoveMapping(StringRef Name)
Erase an entry from the mapping table.
GlobalAddressMapTy & getGlobalAddressMap()
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)
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.
Definition: DerivedTypes.h:105
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Definition: DerivedTypes.h:144
Type * getParamType(unsigned i) const
Parameter type accessors.
Definition: DerivedTypes.h:137
Type * getReturnType() const
Definition: DerivedTypes.h:126
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
Definition: GlobalValue.h:513
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
Definition: GlobalValue.h:265
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
Definition: GlobalValue.h:530
bool hasExternalWeakLinkage() const
Definition: GlobalValue.h:531
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:296
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition: Globals.cpp:132
bool hasAppendingLinkage() const
Definition: GlobalValue.h:527
Type * getValueType() const
Definition: GlobalValue.h:298
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
void dump() const
Debugging method that may be called through a debugger; just invokes print on stderr.
Definition: Record.cpp:382
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...
Definition: DerivedTypes.h:720
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:2196
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
iterator end()
Definition: StringMap.h:224
iterator begin()
Definition: StringMap.h:223
iterator find(StringRef Key)
Definition: StringMap.h:237
void erase(iterator I)
Definition: StringMap.h:419
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:626
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:657
Class to represent struct types.
Definition: DerivedTypes.h:218
@ HasZeroInit
zeroinitializer is valid for this target extension type.
Definition: DerivedTypes.h:842
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
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 isAggregateType() const
Return true if the type is an aggregate type.
Definition: Type.h:304
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
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
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.
Definition: Constants.cpp:1866
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.
Definition: raw_ostream.h:692
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
Definition: SwapByteOrder.h:29
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ 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:1764
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
void * PointerTy
Definition: GenericValue.h:21
GenericValue PTOGV(void *P)
Definition: GenericValue.h:49
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
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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:1854
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223
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:1886
void * GVTOP(const GenericValue &GV)
Definition: GenericValue.h:50
@ Default
The result values are uniform if and only if all operands are uniform.
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:856
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
PointerTy PointerVal
Definition: GenericValue.h:31
std::vector< GenericValue > AggregateVal
Definition: GenericValue.h:37