xref: /llvm-project/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.cpp (revision 4eaff6c58ae2f130ac8d63cf2c87bbb483114876)
1 //===------- JITLinkTestUtils.cpp - Utilities for JITLink unit tests ------===//
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 #include "JITLinkTestUtils.h"
10 #include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"
11 
12 #include "llvm/Testing/Support/Error.h"
13 #include "gtest/gtest.h"
14 
15 using namespace llvm;
16 using namespace llvm::orc;
17 using namespace llvm::jitlink;
18 
19 static const char BlockContentBytes[] = {
20     0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6d, 0x6f,
21     0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68,
22     0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x66,
23     0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20,
24     0x68, 0x61, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x61,
25     0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x54, 0x68, 0x61, 0x74, 0x20, 0x74,
26     0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d,
27     0x20, 0x4f, 0x6c, 0x64, 0x20, 0x52, 0x65, 0x67, 0x72, 0x65, 0x74, 0x20,
28     0x68, 0x61, 0x64, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x61, 0x77, 0x61, 0x79,
29     0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x64, 0x20, 0x6a, 0x6f,
30     0x69, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6c,
31     0x64, 0x20, 0x62, 0x75, 0x73, 0x68, 0x20, 0x68, 0x6f, 0x72, 0x73, 0x65,
32     0x73, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20,
33     0x77, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x61, 0x20, 0x74, 0x68, 0x6f, 0x75,
34     0x73, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a,
35     0x53, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
36     0x72, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x68, 0x61, 0x64, 0x20, 0x67, 0x61,
37     0x74, 0x68, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
38     0x65, 0x20, 0x66, 0x72, 0x61, 0x79, 0x2e, 0x0a, 0x41, 0x6c, 0x6c, 0x20,
39     0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e,
40     0x64, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x72, 0x69, 0x64, 0x65,
41     0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20,
42     0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x65, 0x61,
43     0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x61, 0x72, 0x0a, 0x48, 0x61,
44     0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61,
45     0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x74,
46     0x65, 0x61, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x69, 0x67, 0x68,
47     0x74, 0x2c, 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62,
48     0x75, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20,
49     0x68, 0x61, 0x72, 0x64, 0x20, 0x72, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20,
50     0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69,
51     0x6c, 0x64, 0x20, 0x62, 0x75, 0x73, 0x68, 0x20, 0x68, 0x6f, 0x72, 0x73,
52     0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20,
53     0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x63, 0x6b, 0x2d, 0x68, 0x6f,
54     0x72, 0x73, 0x65, 0x20, 0x73, 0x6e, 0x75, 0x66, 0x66, 0x73, 0x20, 0x74,
55     0x68, 0x65, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x77, 0x69,
56     0x74, 0x68, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x00};
57 
58 ArrayRef<char> BlockContent(BlockContentBytes);
59 
60 void lookupResolveEverythingToNull(
61     const llvm::jitlink::JITLinkContext::LookupMap &Symbols,
62     std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation> LC) {
63   llvm::orc::ExecutorAddr Null;
64   llvm::jitlink::AsyncLookupResult Result;
65   for (auto &KV : Symbols)
66     Result[KV.first] = {Null, llvm::JITSymbolFlags::Exported};
67   LC->run(std::move(Result));
68 }
69 
70 void lookupErrorOut(
71     const llvm::jitlink::JITLinkContext::LookupMap &Symbols,
72     std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation> LC) {
73   LC->run(llvm::make_error<llvm::StringError>("Lookup failed",
74                                               llvm::inconvertibleErrorCode()));
75 }
76 
77 std::unique_ptr<MockJITLinkContext> makeMockContext(
78     llvm::unique_function<void(llvm::Error)> HandleFailed,
79     llvm::unique_function<void(MockJITLinkMemoryManager &)> SetupMemMgr,
80     llvm::unique_function<void(MockJITLinkContext &)> SetupContext) {
81   auto MemMgr = std::make_unique<MockJITLinkMemoryManager>();
82   SetupMemMgr(*MemMgr);
83   auto Ctx = std::make_unique<MockJITLinkContext>(std::move(MemMgr),
84                                                   std::move(HandleFailed));
85   SetupContext(*Ctx);
86   return Ctx;
87 }
88 
89 void defaultMemMgrSetup(MockJITLinkMemoryManager &) {}
90 void defaultCtxSetup(MockJITLinkContext &) {}
91 
92 TEST(JITLinkMocks, SmokeTest) {
93   // Check that the testing infrastructure defaults can "link" a graph
94   // successfully.
95   auto G = std::make_unique<LinkGraph>(
96       "foo", std::make_shared<orc::SymbolStringPool>(),
97       Triple("x86_64-apple-darwin"), SubtargetFeatures(),
98       getGenericEdgeKindName);
99 
100   ArrayRef<char> Content = "hello, world!";
101   auto &Sec =
102       G->createSection("__data", orc::MemProt::Read | orc::MemProt::Write);
103   orc::ExecutorAddr B1Addr(0x1000);
104   auto &B = G->createContentBlock(Sec, Content, B1Addr, 8, 0);
105   G->addDefinedSymbol(B, 4, "S", 4, Linkage::Strong, Scope::Default, false,
106                       false);
107 
108   Error Err = Error::success();
109   auto Ctx =
110       makeMockContext(JoinErrorsInto(Err), defaultMemMgrSetup, defaultCtxSetup);
111 
112   link_MachO_x86_64(std::move(G), std::move(Ctx));
113 
114   EXPECT_THAT_ERROR(std::move(Err), Succeeded());
115 }
116