LLVM 24.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);
204 addGlobalMapping(getMangledName(GV), (uint64_t) Addr);
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
246uint64_t ExecutionEngine::updateGlobalMapping(StringRef Name, uint64_t Addr) {
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::PtrToInt: {
669 uint32_t PtrWidth = DL.getTypeSizeInBits(Op0->getType());
670 assert(PtrWidth <= 64 && "Bad pointer width");
671 GV.IntVal = APInt(PtrWidth, uintptr_t(GV.PointerVal));
672 uint32_t IntWidth = DL.getTypeSizeInBits(CE->getType());
673 GV.IntVal = GV.IntVal.zextOrTrunc(IntWidth);
674 return GV;
675 }
676 case Instruction::IntToPtr: {
678 uint32_t PtrWidth = DL.getTypeSizeInBits(CE->getType());
679 GV.IntVal = GV.IntVal.zextOrTrunc(PtrWidth);
680 assert(GV.IntVal.getBitWidth() <= 64 && "Bad pointer width");
682 return GV;
683 }
684 case Instruction::BitCast: {
686 Type* DestTy = CE->getType();
687 switch (Op0->getType()->getTypeID()) {
688 default: llvm_unreachable("Invalid bitcast operand");
690 assert(DestTy->isFloatingPointTy() && "invalid bitcast");
691 if (DestTy->isFloatTy())
692 GV.FloatVal = GV.IntVal.bitsToFloat();
693 else if (DestTy->isDoubleTy())
694 GV.DoubleVal = GV.IntVal.bitsToDouble();
695 break;
696 case Type::FloatTyID:
697 assert(DestTy->isIntegerTy(32) && "Invalid bitcast");
699 break;
700 case Type::DoubleTyID:
701 assert(DestTy->isIntegerTy(64) && "Invalid bitcast");
703 break;
705 assert(DestTy->isPointerTy() && "Invalid bitcast");
706 break; // getConstantValue(Op0) above already converted it
707 }
708 return GV;
709 }
710 case Instruction::Add:
711 case Instruction::Sub:
712 case Instruction::Xor: {
713 assert(Op0->getType()->isIntegerTy() && "Bad binop type!");
715 GenericValue RHS = getConstantValue(CE->getOperand(1));
716 GenericValue GV;
717 switch (CE->getOpcode()) {
718 default: llvm_unreachable("Invalid integer opcode");
719 case Instruction::Add: GV.IntVal = LHS.IntVal + RHS.IntVal; break;
720 case Instruction::Sub: GV.IntVal = LHS.IntVal - RHS.IntVal; break;
721 case Instruction::Xor: GV.IntVal = LHS.IntVal ^ RHS.IntVal; break;
722 }
723 return GV;
724 }
725 default:
726 break;
727 }
728
731 OS << "ConstantExpr not handled: " << *CE;
733 }
734
735 if (auto *TETy = dyn_cast<TargetExtType>(C->getType())) {
736 assert(TETy->hasProperty(TargetExtType::HasZeroInit) && C->isNullValue() &&
737 "TargetExtType only supports null constant value");
738 C = Constant::getNullValue(TETy->getLayoutType());
739 }
740
741 // Otherwise, we have a simple constant.
742 GenericValue Result;
743 switch (C->getType()->getTypeID()) {
744 case Type::FloatTyID:
745 Result.FloatVal = cast<ConstantFP>(C)->getValueAPF().convertToFloat();
746 break;
747 case Type::DoubleTyID:
748 Result.DoubleVal = cast<ConstantFP>(C)->getValueAPF().convertToDouble();
749 break;
751 case Type::FP128TyID:
753 Result.IntVal = cast <ConstantFP>(C)->getValueAPF().bitcastToAPInt();
754 break;
756 Result.IntVal = cast<ConstantInt>(C)->getValue();
757 break;
759 while (auto *A = dyn_cast<GlobalAlias>(C)) {
760 C = A->getAliasee();
761 }
763 Result.PointerVal = nullptr;
764 else if (const Function *F = dyn_cast<Function>(C))
765 Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F)));
766 else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
767 Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV)));
768 else
769 llvm_unreachable("Unknown constant pointer type!");
770 break;
773 "Scalable vector support not yet implemented in ExecutionEngine");
775 Type *ElemTy = cast<FixedVectorType>(C->getType())->getElementType();
776 if (!ElemTy->isIntegerTy() && !ElemTy->isFloatTy() && !ElemTy->isDoubleTy())
777 llvm_unreachable("Unknown constant pointer type!");
778
779 unsigned ElemNum = cast<FixedVectorType>(C->getType())->getNumElements();
780 Result.AggregateVal.resize(ElemNum);
781 for (unsigned I = 0; I < ElemNum; ++I) {
782 Constant *Elt = C->getAggregateElement(I);
783 if (!Elt)
784 llvm_unreachable("Failed to extract element from constant vector!");
785
786 if (auto *CI = dyn_cast<ConstantInt>(Elt))
787 Result.AggregateVal[I].IntVal = CI->getValue();
788 else if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
789 APFloat Val = CFP->getValueAPF();
790 if (ElemTy->isFloatTy())
791 Result.AggregateVal[I].FloatVal = Val.convertToFloat();
792 else
793 Result.AggregateVal[I].DoubleVal = Val.convertToDouble();
794 } else if (isa<UndefValue>(Elt)) {
795 if (ElemTy->isIntegerTy())
796 Result.AggregateVal[I].IntVal =
797 APInt(ElemTy->getScalarSizeInBits(), 0ull);
798 } else
799 llvm_unreachable("Unknown constant pointer type!");
800 }
801 } break;
802
803 default:
806 OS << "ERROR: Constant unimplemented for type: " << *C->getType();
808 }
809
810 return Result;
811}
812
814 GenericValue *Ptr, Type *Ty) {
815 // It is safe to treat TargetExtType as its layout type since the underlying
816 // bits are only copied and are not inspected.
817 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
818 Ty = TETy->getLayoutType();
819
820 const unsigned StoreBytes = getDataLayout().getTypeStoreSize(Ty);
821
822 switch (Ty->getTypeID()) {
823 default:
824 dbgs() << "Cannot store value of type " << *Ty << "!\n";
825 break;
827 StoreIntToMemory(Val.IntVal, (uint8_t*)Ptr, StoreBytes);
828 break;
829 case Type::FloatTyID:
830 *((float*)Ptr) = Val.FloatVal;
831 break;
832 case Type::DoubleTyID:
833 *((double*)Ptr) = Val.DoubleVal;
834 break;
836 memcpy(static_cast<void *>(Ptr), Val.IntVal.getRawData(), 10);
837 break;
839 // Ensure 64 bit target pointers are fully initialized on 32 bit hosts.
840 if (StoreBytes != sizeof(PointerTy))
841 memset(&(Ptr->PointerVal), 0, StoreBytes);
842
843 *((PointerTy*)Ptr) = Val.PointerVal;
844 break;
847 for (unsigned i = 0; i < Val.AggregateVal.size(); ++i) {
848 if (cast<VectorType>(Ty)->getElementType()->isDoubleTy())
849 *(((double*)Ptr)+i) = Val.AggregateVal[i].DoubleVal;
850 if (cast<VectorType>(Ty)->getElementType()->isFloatTy())
851 *(((float*)Ptr)+i) = Val.AggregateVal[i].FloatVal;
852 if (cast<VectorType>(Ty)->getElementType()->isIntegerTy()) {
853 unsigned numOfBytes =(Val.AggregateVal[i].IntVal.getBitWidth()+7)/8;
854 StoreIntToMemory(Val.AggregateVal[i].IntVal,
855 (uint8_t*)Ptr + numOfBytes*i, numOfBytes);
856 }
857 }
858 break;
859 }
860
861 if (sys::IsLittleEndianHost != getDataLayout().isLittleEndian())
862 // Host and target are different endian - reverse the stored bytes.
863 std::reverse((uint8_t*)Ptr, StoreBytes + (uint8_t*)Ptr);
864}
865
866/// FIXME: document
867///
869 GenericValue *Ptr,
870 Type *Ty) {
871 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
872 Ty = TETy->getLayoutType();
873
874 const unsigned LoadBytes = getDataLayout().getTypeStoreSize(Ty);
875
876 switch (Ty->getTypeID()) {
878 // An APInt with all words initially zero.
879 Result.IntVal = APInt(cast<IntegerType>(Ty)->getBitWidth(), 0);
880 LoadIntFromMemory(Result.IntVal, (uint8_t*)Ptr, LoadBytes);
881 break;
882 case Type::FloatTyID:
883 Result.FloatVal = *((float*)Ptr);
884 break;
885 case Type::DoubleTyID:
886 Result.DoubleVal = *((double*)Ptr);
887 break;
889 Result.PointerVal = *((PointerTy*)Ptr);
890 break;
891 case Type::X86_FP80TyID: {
892 // This is endian dependent, but it will only work on x86 anyway.
893 // FIXME: Will not trap if loading a signaling NaN.
894 uint64_t y[2];
895 memcpy(y, Ptr, 10);
896 Result.IntVal = APInt(80, y);
897 break;
898 }
901 "Scalable vector support not yet implemented in ExecutionEngine");
903 auto *VT = cast<FixedVectorType>(Ty);
904 Type *ElemT = VT->getElementType();
905 const unsigned numElems = VT->getNumElements();
906 if (ElemT->isFloatTy()) {
907 Result.AggregateVal.resize(numElems);
908 for (unsigned i = 0; i < numElems; ++i)
909 Result.AggregateVal[i].FloatVal = *((float*)Ptr+i);
910 }
911 if (ElemT->isDoubleTy()) {
912 Result.AggregateVal.resize(numElems);
913 for (unsigned i = 0; i < numElems; ++i)
914 Result.AggregateVal[i].DoubleVal = *((double*)Ptr+i);
915 }
916 if (ElemT->isIntegerTy()) {
917 GenericValue intZero;
918 const unsigned elemBitWidth = cast<IntegerType>(ElemT)->getBitWidth();
919 intZero.IntVal = APInt(elemBitWidth, 0);
920 Result.AggregateVal.resize(numElems, intZero);
921 for (unsigned i = 0; i < numElems; ++i)
922 LoadIntFromMemory(Result.AggregateVal[i].IntVal,
923 (uint8_t*)Ptr+((elemBitWidth+7)/8)*i, (elemBitWidth+7)/8);
924 }
925 break;
926 }
927 default:
930 OS << "Cannot load value of type " << *Ty << "!";
932 }
933}
934
935void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
936 LLVM_DEBUG(dbgs() << "JIT: Initializing " << Addr << " ");
937 LLVM_DEBUG(Init->dump());
938 if (isa<UndefValue>(Init))
939 return;
940
941 if (const ConstantVector *CP = dyn_cast<ConstantVector>(Init)) {
942 unsigned ElementSize =
943 getDataLayout().getTypeAllocSize(CP->getType()->getElementType());
944 for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
945 InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
946 return;
947 }
948
949 if (isa<ConstantAggregateZero>(Init)) {
950 memset(Addr, 0, (size_t)getDataLayout().getTypeAllocSize(Init->getType()));
951 return;
952 }
953
954 if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) {
955 unsigned ElementSize =
956 getDataLayout().getTypeAllocSize(CPA->getType()->getElementType());
957 for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
958 InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
959 return;
960 }
961
962 if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) {
963 const StructLayout *SL =
965 for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
966 InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
967 return;
968 }
969
970 if (const ConstantDataSequential *CDS =
972 // CDS is already laid out in host memory order.
973 StringRef Data = CDS->getRawDataValues();
974 memcpy(Addr, Data.data(), Data.size());
975 return;
976 }
977
978 if (Init->getType()->isFirstClassType()) {
979 GenericValue Val = getConstantValue(Init);
980 StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
981 return;
982 }
983
984 LLVM_DEBUG(dbgs() << "Bad Type: " << *Init->getType() << "\n");
985 llvm_unreachable("Unknown constant type to initialize memory with!");
986}
987
988/// EmitGlobals - Emit all of the global variables to memory, storing their
989/// addresses into GlobalAddress. This must make sure to copy the contents of
990/// their initializers into the memory.
992 // Loop over all of the global variables in the program, allocating the memory
993 // to hold them. If there is more than one module, do a prepass over globals
994 // to figure out how the different modules should link together.
995 std::map<std::pair<std::string, Type*>,
996 const GlobalValue*> LinkedGlobalsMap;
997
998 if (Modules.size() != 1) {
999 for (const auto &M : Modules) {
1000 for (const auto &GV : M->globals()) {
1001 if (GV.hasLocalLinkage() || GV.isDeclaration() ||
1002 GV.hasAppendingLinkage() || !GV.hasName())
1003 continue;// Ignore external globals and globals with internal linkage.
1004
1005 const GlobalValue *&GVEntry = LinkedGlobalsMap[std::make_pair(
1006 std::string(GV.getName()), GV.getType())];
1007
1008 // If this is the first time we've seen this global, it is the canonical
1009 // version.
1010 if (!GVEntry) {
1011 GVEntry = &GV;
1012 continue;
1013 }
1014
1015 // If the existing global is strong, never replace it.
1016 if (GVEntry->hasExternalLinkage())
1017 continue;
1018
1019 // Otherwise, we know it's linkonce/weak, replace it if this is a strong
1020 // symbol. FIXME is this right for common?
1021 if (GV.hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
1022 GVEntry = &GV;
1023 }
1024 }
1025 }
1026
1027 std::vector<const GlobalValue*> NonCanonicalGlobals;
1028 for (const auto &M : Modules) {
1029 for (const auto &GV : M->globals()) {
1030 // In the multi-module case, see what this global maps to.
1031 if (!LinkedGlobalsMap.empty()) {
1032 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1033 std::string(GV.getName()), GV.getType())]) {
1034 // If something else is the canonical global, ignore this one.
1035 if (GVEntry != &GV) {
1036 NonCanonicalGlobals.push_back(&GV);
1037 continue;
1038 }
1039 }
1040 }
1041
1042 if (!GV.isDeclaration()) {
1044 } else {
1045 // External variable reference. Try to use the dynamic loader to
1046 // get a pointer to it.
1048 std::string(GV.getName())))
1049 addGlobalMapping(&GV, SymAddr);
1050 else {
1051 report_fatal_error("Could not resolve external global address: "
1052 +GV.getName());
1053 }
1054 }
1055 }
1056
1057 // If there are multiple modules, map the non-canonical globals to their
1058 // canonical location.
1059 if (!NonCanonicalGlobals.empty()) {
1060 for (const GlobalValue *GV : NonCanonicalGlobals) {
1061 const GlobalValue *CGV = LinkedGlobalsMap[std::make_pair(
1062 std::string(GV->getName()), GV->getType())];
1063 void *Ptr = getPointerToGlobalIfAvailable(CGV);
1064 assert(Ptr && "Canonical global wasn't codegen'd!");
1065 addGlobalMapping(GV, Ptr);
1066 }
1067 }
1068
1069 // Now that all of the globals are set up in memory, loop through them all
1070 // and initialize their contents.
1071 for (const auto &GV : M->globals()) {
1072 if (!GV.isDeclaration()) {
1073 if (!LinkedGlobalsMap.empty()) {
1074 if (const GlobalValue *GVEntry = LinkedGlobalsMap[std::make_pair(
1075 std::string(GV.getName()), GV.getType())])
1076 if (GVEntry != &GV) // Not the canonical variable.
1077 continue;
1078 }
1079 emitGlobalVariable(&GV);
1080 }
1081 }
1082 }
1083}
1084
1085// EmitGlobalVariable - This method emits the specified global variable to the
1086// address specified in GlobalAddresses, or allocates new memory if it's not
1087// already in the map.
1089 void *GA = getPointerToGlobalIfAvailable(GV);
1090
1091 if (!GA) {
1092 // If it's not already specified, allocate memory for the global.
1093 GA = getMemoryForGV(GV);
1094
1095 // If we failed to allocate memory for this global, return.
1096 if (!GA) return;
1097
1098 addGlobalMapping(GV, GA);
1099 }
1100
1101 // Don't initialize if it's thread local, let the client do it.
1102 if (!GV->isThreadLocal())
1104
1105 Type *ElTy = GV->getValueType();
1106 size_t GVSize = (size_t)getDataLayout().getTypeAllocSize(ElTy);
1107 NumInitBytes += (unsigned)GVSize;
1108 ++NumGlobals;
1109}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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)
const char * Msg
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:119
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition APFloat.cpp:6103
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
Definition APFloat.cpp:6131
Class for arbitrary precision integers.
Definition APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1078
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
static APInt floatToBits(float V)
Converts a float to APInt bits.
Definition APInt.h:1772
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
float bitsToFloat() const
Converts APInt bits to a float.
Definition APInt.h:1756
static APInt doubleToBits(double V)
Converts a double to APInt bits.
Definition APInt.h:1764
double bitsToDouble() const
Converts APInt bits to a double.
Definition APInt.h:1742
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition APInt.h:571
Value handle with callbacks on RAUW and destruction.
ConstantArray - Constant Array Declarations.
Definition Constants.h:590
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:755
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
Constant Vector Declarations.
Definition Constants.h:674
This is an important base class in LLVM.
Definition Constant.h:44
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:233
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:579
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:212
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:352
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:408
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:205
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:76
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:68
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition Record.h:2295
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:209
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:743
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
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:46
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:155
@ ArrayTyID
Arrays.
Definition Type.h:76
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:78
@ FloatTyID
32-bit floating point type
Definition Type.h:59
@ StructTyID
Structures.
Definition Type.h:75
@ IntegerTyID
Arbitrary bit width integers.
Definition Type.h:71
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:77
@ DoubleTyID
64-bit floating point type
Definition Type.h:60
@ X86_FP80TyID
80-bit floating point type (X87)
Definition Type.h:61
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
Definition Type.h:63
@ PointerTyID
Pointers.
Definition Type.h:74
@ FP128TyID
128-bit floating point type (112-bit significand)
Definition Type.h:62
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:158
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
TypeID getTypeID() const
Return the type id for the type.
Definition Type.h:138
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
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:257
bool hasName() const
Definition Value.h:263
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
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.
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
LLVM_ABI void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
Fills the StoreBytes bytes of memory starting from Dst with the integer held in IntVal.
Definition APInt.cpp:3085
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
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:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:280
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.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1901
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:1933
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
LLVM_ABI void LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, unsigned LoadBytes)
Loads the integer stored in the LoadBytes bytes starting from Src into IntVal, which is assumed to be...
Definition APInt.cpp:3111
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
std::vector< GenericValue > AggregateVal