summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
commitb64793999546ed8adebaeebd9d8345d18db8927d (patch)
tree4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h
parentAdd support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff)
downloadwireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz
wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h')
-rw-r--r--gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h334
1 files changed, 0 insertions, 334 deletions
diff --git a/gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h b/gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h
deleted file mode 100644
index 50a57f141f4..00000000000
--- a/gnu/llvm/unittests/ExecutionEngine/MCJIT/MCJITTestBase.h
+++ /dev/null
@@ -1,334 +0,0 @@
-//===- MCJITTestBase.h - Common base class for MCJIT Unit tests -*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This class implements common functionality required by the MCJIT unit tests,
-// as well as logic to skip tests on unsupported architectures and operating
-// systems.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_UNITTESTS_EXECUTIONENGINE_MCJIT_MCJITTESTBASE_H
-#define LLVM_UNITTESTS_EXECUTIONENGINE_MCJIT_MCJITTESTBASE_H
-
-#include "MCJITTestAPICommon.h"
-#include "llvm/Config/config.h"
-#include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/SectionMemoryManager.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/LLVMContext.h"
-#include "llvm/IR/Module.h"
-#include "llvm/IR/Type.h"
-#include "llvm/Support/CodeGen.h"
-
-namespace llvm {
-
-/// Helper class that can build very simple Modules
-class TrivialModuleBuilder {
-protected:
- LLVMContext Context;
- IRBuilder<> Builder;
- std::string BuilderTriple;
-
- TrivialModuleBuilder(const std::string &Triple)
- : Builder(Context), BuilderTriple(Triple) {}
-
- Module *createEmptyModule(StringRef Name = StringRef()) {
- Module * M = new Module(Name, Context);
- M->setTargetTriple(Triple::normalize(BuilderTriple));
- return M;
- }
-
- Function *startFunction(Module *M, FunctionType *FT, StringRef Name) {
- Function *Result =
- Function::Create(FT, GlobalValue::ExternalLinkage, Name, M);
-
- BasicBlock *BB = BasicBlock::Create(Context, Name, Result);
- Builder.SetInsertPoint(BB);
-
- return Result;
- }
-
- void endFunctionWithRet(Function *Func, Value *RetValue) {
- Builder.CreateRet(RetValue);
- }
-
- // Inserts a simple function that invokes Callee and takes the same arguments:
- // int Caller(...) { return Callee(...); }
- Function *insertSimpleCallFunction(Module *M, Function *Callee) {
- Function *Result = startFunction(M, Callee->getFunctionType(), "caller");
-
- SmallVector<Value*, 1> CallArgs;
-
- for (Argument &A : Result->args())
- CallArgs.push_back(&A);
-
- Value *ReturnCode = Builder.CreateCall(Callee, CallArgs);
- Builder.CreateRet(ReturnCode);
- return Result;
- }
-
- // Inserts a function named 'main' that returns a uint32_t:
- // int32_t main() { return X; }
- // where X is given by returnCode
- Function *insertMainFunction(Module *M, uint32_t returnCode) {
- Function *Result = startFunction(
- M, FunctionType::get(Type::getInt32Ty(Context), {}, false), "main");
-
- Value *ReturnVal = ConstantInt::get(Context, APInt(32, returnCode));
- endFunctionWithRet(Result, ReturnVal);
-
- return Result;
- }
-
- // Inserts a function
- // int32_t add(int32_t a, int32_t b) { return a + b; }
- // in the current module and returns a pointer to it.
- Function *insertAddFunction(Module *M, StringRef Name = "add") {
- Function *Result = startFunction(
- M,
- FunctionType::get(
- Type::getInt32Ty(Context),
- {Type::getInt32Ty(Context), Type::getInt32Ty(Context)}, false),
- Name);
-
- Function::arg_iterator args = Result->arg_begin();
- Value *Arg1 = &*args;
- Value *Arg2 = &*++args;
- Value *AddResult = Builder.CreateAdd(Arg1, Arg2);
-
- endFunctionWithRet(Result, AddResult);
-
- return Result;
- }
-
- // Inserts a declaration to a function defined elsewhere
- Function *insertExternalReferenceToFunction(Module *M, FunctionType *FTy,
- StringRef Name) {
- Function *Result =
- Function::Create(FTy, GlobalValue::ExternalLinkage, Name, M);
- return Result;
- }
-
- // Inserts an declaration to a function defined elsewhere
- Function *insertExternalReferenceToFunction(Module *M, Function *Func) {
- Function *Result = Function::Create(Func->getFunctionType(),
- GlobalValue::ExternalLinkage,
- Func->getName(), M);
- return Result;
- }
-
- // Inserts a global variable of type int32
- // FIXME: make this a template function to support any type
- GlobalVariable *insertGlobalInt32(Module *M,
- StringRef name,
- int32_t InitialValue) {
- Type *GlobalTy = Type::getInt32Ty(Context);
- Constant *IV = ConstantInt::get(Context, APInt(32, InitialValue));
- GlobalVariable *Global = new GlobalVariable(*M,
- GlobalTy,
- false,
- GlobalValue::ExternalLinkage,
- IV,
- name);
- return Global;
- }
-
- // Inserts a function
- // int32_t recursive_add(int32_t num) {
- // if (num == 0) {
- // return num;
- // } else {
- // int32_t recursive_param = num - 1;
- // return num + Helper(recursive_param);
- // }
- // }
- // NOTE: if Helper is left as the default parameter, Helper == recursive_add.
- Function *insertAccumulateFunction(Module *M,
- Function *Helper = nullptr,
- StringRef Name = "accumulate") {
- Function *Result =
- startFunction(M,
- FunctionType::get(Type::getInt32Ty(Context),
- {Type::getInt32Ty(Context)}, false),
- Name);
- if (!Helper)
- Helper = Result;
-
- BasicBlock *BaseCase = BasicBlock::Create(Context, "", Result);
- BasicBlock *RecursiveCase = BasicBlock::Create(Context, "", Result);
-
- // if (num == 0)
- Value *Param = &*Result->arg_begin();
- Value *Zero = ConstantInt::get(Context, APInt(32, 0));
- Builder.CreateCondBr(Builder.CreateICmpEQ(Param, Zero),
- BaseCase, RecursiveCase);
-
- // return num;
- Builder.SetInsertPoint(BaseCase);
- Builder.CreateRet(Param);
-
- // int32_t recursive_param = num - 1;
- // return Helper(recursive_param);
- Builder.SetInsertPoint(RecursiveCase);
- Value *One = ConstantInt::get(Context, APInt(32, 1));
- Value *RecursiveParam = Builder.CreateSub(Param, One);
- Value *RecursiveReturn = Builder.CreateCall(Helper, RecursiveParam);
- Value *Accumulator = Builder.CreateAdd(Param, RecursiveReturn);
- Builder.CreateRet(Accumulator);
-
- return Result;
- }
-
- // Populates Modules A and B:
- // Module A { Extern FB1, Function FA which calls FB1 },
- // Module B { Extern FA, Function FB1, Function FB2 which calls FA },
- void createCrossModuleRecursiveCase(std::unique_ptr<Module> &A, Function *&FA,
- std::unique_ptr<Module> &B,
- Function *&FB1, Function *&FB2) {
- // Define FB1 in B.
- B.reset(createEmptyModule("B"));
- FB1 = insertAccumulateFunction(B.get(), nullptr, "FB1");
-
- // Declare FB1 in A (as an external).
- A.reset(createEmptyModule("A"));
- Function *FB1Extern = insertExternalReferenceToFunction(A.get(), FB1);
-
- // Define FA in A (with a call to FB1).
- FA = insertAccumulateFunction(A.get(), FB1Extern, "FA");
-
- // Declare FA in B (as an external)
- Function *FAExtern = insertExternalReferenceToFunction(B.get(), FA);
-
- // Define FB2 in B (with a call to FA)
- FB2 = insertAccumulateFunction(B.get(), FAExtern, "FB2");
- }
-
- // Module A { Function FA },
- // Module B { Extern FA, Function FB which calls FA },
- // Module C { Extern FB, Function FC which calls FB },
- void
- createThreeModuleChainedCallsCase(std::unique_ptr<Module> &A, Function *&FA,
- std::unique_ptr<Module> &B, Function *&FB,
- std::unique_ptr<Module> &C, Function *&FC) {
- A.reset(createEmptyModule("A"));
- FA = insertAddFunction(A.get());
-
- B.reset(createEmptyModule("B"));
- Function *FAExtern_in_B = insertExternalReferenceToFunction(B.get(), FA);
- FB = insertSimpleCallFunction(B.get(), FAExtern_in_B);
-
- C.reset(createEmptyModule("C"));
- Function *FBExtern_in_C = insertExternalReferenceToFunction(C.get(), FB);
- FC = insertSimpleCallFunction(C.get(), FBExtern_in_C);
- }
-
- // Module A { Function FA },
- // Populates Modules A and B:
- // Module B { Function FB }
- void createTwoModuleCase(std::unique_ptr<Module> &A, Function *&FA,
- std::unique_ptr<Module> &B, Function *&FB) {
- A.reset(createEmptyModule("A"));
- FA = insertAddFunction(A.get());
-
- B.reset(createEmptyModule("B"));
- FB = insertAddFunction(B.get());
- }
-
- // Module A { Function FA },
- // Module B { Extern FA, Function FB which calls FA }
- void createTwoModuleExternCase(std::unique_ptr<Module> &A, Function *&FA,
- std::unique_ptr<Module> &B, Function *&FB) {
- A.reset(createEmptyModule("A"));
- FA = insertAddFunction(A.get());
-
- B.reset(createEmptyModule("B"));
- Function *FAExtern_in_B = insertExternalReferenceToFunction(B.get(), FA);
- FB = insertSimpleCallFunction(B.get(), FAExtern_in_B);
- }
-
- // Module A { Function FA },
- // Module B { Extern FA, Function FB which calls FA },
- // Module C { Extern FB, Function FC which calls FA },
- void createThreeModuleCase(std::unique_ptr<Module> &A, Function *&FA,
- std::unique_ptr<Module> &B, Function *&FB,
- std::unique_ptr<Module> &C, Function *&FC) {
- A.reset(createEmptyModule("A"));
- FA = insertAddFunction(A.get());
-
- B.reset(createEmptyModule("B"));
- Function *FAExtern_in_B = insertExternalReferenceToFunction(B.get(), FA);
- FB = insertSimpleCallFunction(B.get(), FAExtern_in_B);
-
- C.reset(createEmptyModule("C"));
- Function *FAExtern_in_C = insertExternalReferenceToFunction(C.get(), FA);
- FC = insertSimpleCallFunction(C.get(), FAExtern_in_C);
- }
-};
-
-class MCJITTestBase : public MCJITTestAPICommon, public TrivialModuleBuilder {
-protected:
- MCJITTestBase()
- : TrivialModuleBuilder(HostTriple), OptLevel(CodeGenOpt::None),
- CodeModel(CodeModel::Small), MArch(""), MM(new SectionMemoryManager) {
- // The architectures below are known to be compatible with MCJIT as they
- // are copied from test/ExecutionEngine/MCJIT/lit.local.cfg and should be
- // kept in sync.
- SupportedArchs.push_back(Triple::aarch64);
- SupportedArchs.push_back(Triple::arm);
- SupportedArchs.push_back(Triple::mips);
- SupportedArchs.push_back(Triple::mipsel);
- SupportedArchs.push_back(Triple::mips64);
- SupportedArchs.push_back(Triple::mips64el);
- SupportedArchs.push_back(Triple::x86);
- SupportedArchs.push_back(Triple::x86_64);
-
- // Some architectures have sub-architectures in which tests will fail, like
- // ARM. These two vectors will define if they do have sub-archs (to avoid
- // extra work for those who don't), and if so, if they are listed to work
- HasSubArchs.push_back(Triple::arm);
- SupportedSubArchs.push_back("armv6");
- SupportedSubArchs.push_back("armv7");
-
- UnsupportedEnvironments.push_back(Triple::Cygnus);
- }
-
- void createJIT(std::unique_ptr<Module> M) {
-
- // Due to the EngineBuilder constructor, it is required to have a Module
- // in order to construct an ExecutionEngine (i.e. MCJIT)
- assert(M != 0 && "a non-null Module must be provided to create MCJIT");
-
- EngineBuilder EB(std::move(M));
- std::string Error;
- TheJIT.reset(EB.setEngineKind(EngineKind::JIT)
- .setMCJITMemoryManager(std::move(MM))
- .setErrorStr(&Error)
- .setOptLevel(CodeGenOpt::None)
- .setMArch(MArch)
- .setMCPU(sys::getHostCPUName())
- //.setMAttrs(MAttrs)
- .create());
- // At this point, we cannot modify the module any more.
- assert(TheJIT.get() != NULL && "error creating MCJIT with EngineBuilder");
- }
-
- CodeGenOpt::Level OptLevel;
- CodeModel::Model CodeModel;
- StringRef MArch;
- SmallVector<std::string, 1> MAttrs;
- std::unique_ptr<ExecutionEngine> TheJIT;
- std::unique_ptr<RTDyldMemoryManager> MM;
-
- std::unique_ptr<Module> M;
-};
-
-} // namespace llvm
-
-#endif // LLVM_UNITTESTS_EXECUTIONENGINE_MCJIT_MCJITTESTBASE_H