blob: 6c6b4918c20535fd549c746ee48a9da12c7f75ec [file] [log] [blame]
Lang Hamesdc4260d2015-04-20 20:41:45 +00001//===------ OrcTestCommon.h - Utilities for Orc Unit Tests ------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Common utilities for the Orc unit tests.
11//
12//===----------------------------------------------------------------------===//
13
14
15#ifndef LLVM_UNITTESTS_EXECUTIONENGINE_ORC_ORCTESTCOMMON_H
16#define LLVM_UNITTESTS_EXECUTIONENGINE_ORC_ORCTESTCOMMON_H
17
Chandler Carruth9a67b072017-06-06 11:06:56 +000018#include "llvm/ExecutionEngine/ExecutionEngine.h"
19#include "llvm/ExecutionEngine/JITSymbol.h"
Lang Hamesdc4260d2015-04-20 20:41:45 +000020#include "llvm/IR/Function.h"
21#include "llvm/IR/IRBuilder.h"
22#include "llvm/IR/LLVMContext.h"
23#include "llvm/IR/Module.h"
24#include "llvm/IR/TypeBuilder.h"
Lang Hames859d73c2016-01-09 19:50:40 +000025#include "llvm/Object/ObjectFile.h"
Lang Hames130a7c42015-10-28 02:40:04 +000026#include "llvm/Support/TargetSelect.h"
Lang Hamesdc4260d2015-04-20 20:41:45 +000027#include <memory>
28
29namespace llvm {
30
Lang Hamesd22bade2017-04-04 17:03:49 +000031class OrcNativeTarget {
Lang Hames130a7c42015-10-28 02:40:04 +000032public:
Lang Hamesd22bade2017-04-04 17:03:49 +000033 static void initialize() {
Lang Hames130a7c42015-10-28 02:40:04 +000034 if (!NativeTargetInitialized) {
35 InitializeNativeTarget();
36 InitializeNativeTargetAsmParser();
37 InitializeNativeTargetAsmPrinter();
38 NativeTargetInitialized = true;
39 }
Lang Hamesd22bade2017-04-04 17:03:49 +000040 }
41
42private:
43 static bool NativeTargetInitialized;
44};
45
46// Base class for Orc tests that will execute code.
47class OrcExecutionTest {
48public:
49
50 OrcExecutionTest() {
51
52 // Initialize the native target if it hasn't been done already.
53 OrcNativeTarget::initialize();
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000054
55 // Try to select a TargetMachine for the host.
56 TM.reset(EngineBuilder().selectTarget());
57
58 if (TM) {
59 // If we found a TargetMachine, check that it's one that Orc supports.
60 const Triple& TT = TM->getTargetTriple();
Lang Hames4f8194e2016-02-10 01:02:33 +000061
62 if ((TT.getArch() != Triple::x86_64 && TT.getArch() != Triple::x86) ||
63 TT.isOSWindows())
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000064 TM = nullptr;
65 }
Lang Hames130a7c42015-10-28 02:40:04 +000066 };
67
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000068protected:
Mehdi Amini03b42e42016-04-14 21:59:01 +000069 LLVMContext Context;
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000070 std::unique_ptr<TargetMachine> TM;
Lang Hames130a7c42015-10-28 02:40:04 +000071};
72
Lang Hames4a51e5d2015-10-27 17:45:48 +000073class ModuleBuilder {
74public:
75 ModuleBuilder(LLVMContext &Context, StringRef Triple,
76 StringRef Name);
Lang Hamesdc4260d2015-04-20 20:41:45 +000077
Lang Hames4a51e5d2015-10-27 17:45:48 +000078 template <typename FuncType>
Lang Hames130a7c42015-10-28 02:40:04 +000079 Function* createFunctionDecl(StringRef Name) {
Lang Hames4a51e5d2015-10-27 17:45:48 +000080 return Function::Create(
81 TypeBuilder<FuncType, false>::get(M->getContext()),
Lang Hames130a7c42015-10-28 02:40:04 +000082 GlobalValue::ExternalLinkage, Name, M.get());
Lang Hames4a51e5d2015-10-27 17:45:48 +000083 }
Lang Hamesdc4260d2015-04-20 20:41:45 +000084
Lang Hames4a51e5d2015-10-27 17:45:48 +000085 Module* getModule() { return M.get(); }
86 const Module* getModule() const { return M.get(); }
87 std::unique_ptr<Module> takeModule() { return std::move(M); }
Lang Hamesdc4260d2015-04-20 20:41:45 +000088
Lang Hames4a51e5d2015-10-27 17:45:48 +000089private:
90 std::unique_ptr<Module> M;
Lang Hames4a51e5d2015-10-27 17:45:48 +000091};
Lang Hamesdc4260d2015-04-20 20:41:45 +000092
Lang Hames4a51e5d2015-10-27 17:45:48 +000093// Dummy struct type.
94struct DummyStruct {
95 int X[256];
96};
Lang Hamesdc4260d2015-04-20 20:41:45 +000097
Lang Hames4a51e5d2015-10-27 17:45:48 +000098// TypeBuilder specialization for DummyStruct.
99template <bool XCompile>
100class TypeBuilder<DummyStruct, XCompile> {
101public:
102 static StructType *get(LLVMContext &Context) {
103 return StructType::get(
Serge Gueltone38003f2017-05-09 19:31:13 +0000104 TypeBuilder<types::i<32>[256], XCompile>::get(Context));
Lang Hames4a51e5d2015-10-27 17:45:48 +0000105 }
106};
Lang Hamesdc4260d2015-04-20 20:41:45 +0000107
Lang Hamesc0056562015-10-20 04:35:02 +0000108template <typename HandleT,
Lang Hamescd9d49b2017-06-23 23:25:28 +0000109 typename AddModuleFtor,
110 typename RemoveModuleFtor,
Lang Hamesc0056562015-10-20 04:35:02 +0000111 typename FindSymbolFtor,
112 typename FindSymbolInFtor>
113class MockBaseLayer {
114public:
115
Lang Hamescd9d49b2017-06-23 23:25:28 +0000116 typedef HandleT ModuleHandleT;
Lang Hamesc0056562015-10-20 04:35:02 +0000117
Lang Hamescd9d49b2017-06-23 23:25:28 +0000118 MockBaseLayer(AddModuleFtor &&AddModule,
119 RemoveModuleFtor &&RemoveModule,
Lang Hamesc0056562015-10-20 04:35:02 +0000120 FindSymbolFtor &&FindSymbol,
121 FindSymbolInFtor &&FindSymbolIn)
Lang Hames4ce98662017-07-07 02:59:13 +0000122 : AddModule(std::move(AddModule)),
123 RemoveModule(std::move(RemoveModule)),
124 FindSymbol(std::move(FindSymbol)),
125 FindSymbolIn(std::move(FindSymbolIn))
Lang Hamesc0056562015-10-20 04:35:02 +0000126 {}
127
Lang Hamescd9d49b2017-06-23 23:25:28 +0000128 template <typename ModuleT, typename MemoryManagerPtrT,
Lang Hamesc0056562015-10-20 04:35:02 +0000129 typename SymbolResolverPtrT>
Lang Hames4ce98662017-07-07 02:59:13 +0000130 Expected<ModuleHandleT> addModule(ModuleT Ms, MemoryManagerPtrT MemMgr,
131 SymbolResolverPtrT Resolver) {
Lang Hamescd9d49b2017-06-23 23:25:28 +0000132 return AddModule(std::move(Ms), std::move(MemMgr), std::move(Resolver));
Lang Hamesc0056562015-10-20 04:35:02 +0000133 }
134
Lang Hames4ce98662017-07-07 02:59:13 +0000135 Error removeModule(ModuleHandleT H) {
136 return RemoveModule(H);
Lang Hamesc0056562015-10-20 04:35:02 +0000137 }
138
Lang Hamesad4a9112016-08-01 20:49:11 +0000139 JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
Lang Hamesc0056562015-10-20 04:35:02 +0000140 return FindSymbol(Name, ExportedSymbolsOnly);
141 }
142
Lang Hamescd9d49b2017-06-23 23:25:28 +0000143 JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name,
Lang Hamesc0056562015-10-20 04:35:02 +0000144 bool ExportedSymbolsOnly) {
145 return FindSymbolIn(H, Name, ExportedSymbolsOnly);
146 }
147
148private:
Lang Hamescd9d49b2017-06-23 23:25:28 +0000149 AddModuleFtor AddModule;
150 RemoveModuleFtor RemoveModule;
Lang Hamesc0056562015-10-20 04:35:02 +0000151 FindSymbolFtor FindSymbol;
152 FindSymbolInFtor FindSymbolIn;
153};
154
Lang Hamescd9d49b2017-06-23 23:25:28 +0000155template <typename ModuleHandleT,
156 typename AddModuleFtor,
157 typename RemoveModuleFtor,
Lang Hamesc0056562015-10-20 04:35:02 +0000158 typename FindSymbolFtor,
159 typename FindSymbolInFtor>
Lang Hamescd9d49b2017-06-23 23:25:28 +0000160MockBaseLayer<ModuleHandleT, AddModuleFtor, RemoveModuleFtor,
Lang Hamesc0056562015-10-20 04:35:02 +0000161 FindSymbolFtor, FindSymbolInFtor>
Lang Hamescd9d49b2017-06-23 23:25:28 +0000162createMockBaseLayer(AddModuleFtor &&AddModule,
163 RemoveModuleFtor &&RemoveModule,
Lang Hamesc0056562015-10-20 04:35:02 +0000164 FindSymbolFtor &&FindSymbol,
165 FindSymbolInFtor &&FindSymbolIn) {
Lang Hamescd9d49b2017-06-23 23:25:28 +0000166 return MockBaseLayer<ModuleHandleT, AddModuleFtor, RemoveModuleFtor,
Lang Hamesc0056562015-10-20 04:35:02 +0000167 FindSymbolFtor, FindSymbolInFtor>(
Lang Hamescd9d49b2017-06-23 23:25:28 +0000168 std::forward<AddModuleFtor>(AddModule),
169 std::forward<RemoveModuleFtor>(RemoveModule),
Lang Hamesc0056562015-10-20 04:35:02 +0000170 std::forward<FindSymbolFtor>(FindSymbol),
171 std::forward<FindSymbolInFtor>(FindSymbolIn));
172}
173
Lang Hames4ce98662017-07-07 02:59:13 +0000174
175class ReturnNullJITSymbol {
176public:
177 template <typename... Args>
178 JITSymbol operator()(Args...) const {
179 return nullptr;
180 }
181};
182
Lang Hamesc0056562015-10-20 04:35:02 +0000183template <typename ReturnT>
184class DoNothingAndReturn {
185public:
Lang Hames4ce98662017-07-07 02:59:13 +0000186 DoNothingAndReturn(ReturnT Ret) : Ret(std::move(Ret)) {}
Lang Hamesc0056562015-10-20 04:35:02 +0000187
188 template <typename... Args>
Lang Hames4ce98662017-07-07 02:59:13 +0000189 void operator()(Args...) const { return Ret; }
Lang Hamesc0056562015-10-20 04:35:02 +0000190private:
Lang Hames4ce98662017-07-07 02:59:13 +0000191 ReturnT Ret;
Lang Hamesc0056562015-10-20 04:35:02 +0000192};
193
194template <>
195class DoNothingAndReturn<void> {
196public:
197 template <typename... Args>
198 void operator()(Args...) const { }
199};
Lang Hamesdc4260d2015-04-20 20:41:45 +0000200
201} // namespace llvm
202
203#endif