1c0d88999SLang Hames //===--------- ExecutorAddrTest.cpp - Unit tests for ExecutorAddr ---------===//
2c0d88999SLang Hames //
3c0d88999SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c0d88999SLang Hames // See https://llvm.org/LICENSE.txt for license information.
5c0d88999SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c0d88999SLang Hames //
7c0d88999SLang Hames //===----------------------------------------------------------------------===//
8c0d88999SLang Hames 
9c0d88999SLang Hames #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
10c0d88999SLang Hames #include "OrcTestCommon.h"
11c0d88999SLang Hames 
12c0d88999SLang Hames using namespace llvm;
13c0d88999SLang Hames using namespace llvm::orc;
14c0d88999SLang Hames 
15c0d88999SLang Hames namespace {
16c0d88999SLang Hames 
TEST(ExecutorAddrTest,DefaultAndNull)17c0d88999SLang Hames TEST(ExecutorAddrTest, DefaultAndNull) {
18c0d88999SLang Hames   // Check that default constructed values and isNull behave as expected.
19c0d88999SLang Hames 
20c0d88999SLang Hames   ExecutorAddr Default;
21c0d88999SLang Hames   ExecutorAddr Null(0);
22c0d88999SLang Hames   ExecutorAddr NonNull(1);
23c0d88999SLang Hames 
24c0d88999SLang Hames   EXPECT_TRUE(Null.isNull());
25c0d88999SLang Hames   EXPECT_EQ(Default, Null);
26c0d88999SLang Hames 
27c0d88999SLang Hames   EXPECT_FALSE(NonNull.isNull());
28c0d88999SLang Hames   EXPECT_NE(Default, NonNull);
29c0d88999SLang Hames }
30c0d88999SLang Hames 
TEST(ExecutorAddrTest,Ordering)31c0d88999SLang Hames TEST(ExecutorAddrTest, Ordering) {
32c0d88999SLang Hames   // Check that ordering operations.
33c0d88999SLang Hames   ExecutorAddr A1(1), A2(2);
34c0d88999SLang Hames 
35c0d88999SLang Hames   EXPECT_LE(A1, A1);
36c0d88999SLang Hames   EXPECT_LT(A1, A2);
37c0d88999SLang Hames   EXPECT_GT(A2, A1);
38c0d88999SLang Hames   EXPECT_GE(A2, A2);
39c0d88999SLang Hames }
40c0d88999SLang Hames 
TEST(ExecutorAddrTest,PtrConversion)41c0d88999SLang Hames TEST(ExecutorAddrTest, PtrConversion) {
42c0d88999SLang Hames   // Test toPtr / fromPtr round-tripping.
43c0d88999SLang Hames   int X = 0;
44c0d88999SLang Hames   auto XAddr = ExecutorAddr::fromPtr(&X);
45c0d88999SLang Hames   int *XPtr = XAddr.toPtr<int *>();
46c0d88999SLang Hames 
47c0d88999SLang Hames   EXPECT_EQ(XPtr, &X);
48c0d88999SLang Hames }
49c0d88999SLang Hames 
F()50*98616cfcSLang Hames static void F() {}
51*98616cfcSLang Hames 
TEST(ExecutorAddrTest,PtrConversionWithFunctionType)52*98616cfcSLang Hames TEST(ExecutorAddrTest, PtrConversionWithFunctionType) {
53*98616cfcSLang Hames   // Test that function types (as opposed to function pointer types) can be
54*98616cfcSLang Hames   // used with toPtr.
55*98616cfcSLang Hames   auto FAddr = ExecutorAddr::fromPtr(F);
56*98616cfcSLang Hames   void (*FPtr)() = FAddr.toPtr<void()>();
57*98616cfcSLang Hames 
58*98616cfcSLang Hames   EXPECT_EQ(FPtr, &F);
59*98616cfcSLang Hames }
60*98616cfcSLang Hames 
TEST(ExecutorAddrTest,AddrRanges)61c0d88999SLang Hames TEST(ExecutorAddrTest, AddrRanges) {
62c0d88999SLang Hames   ExecutorAddr A0(0), A1(1), A2(2), A3(3);
63c0d88999SLang Hames   ExecutorAddrRange R0(A0, A1), R1(A1, A2), R2(A2, A3), R3(A0, A2), R4(A1, A3);
64c0d88999SLang Hames   //     012
65c0d88999SLang Hames   // R0: #      -- Before R1
66c0d88999SLang Hames   // R1:  #     --
67c0d88999SLang Hames   // R2:   #    -- After R1
68c0d88999SLang Hames   // R3: ##     -- Overlaps R1 start
69c0d88999SLang Hames   // R4:  ##    -- Overlaps R1 end
70c0d88999SLang Hames 
71c0d88999SLang Hames   EXPECT_EQ(R1, ExecutorAddrRange(A1, A2));
7237f1b7a3SLang Hames   EXPECT_EQ(R1, ExecutorAddrRange(A1, ExecutorAddrDiff(1)));
73c0d88999SLang Hames   EXPECT_NE(R1, R2);
74c0d88999SLang Hames 
75c0d88999SLang Hames   EXPECT_TRUE(R1.contains(A1));
76c0d88999SLang Hames   EXPECT_FALSE(R1.contains(A0));
77c0d88999SLang Hames   EXPECT_FALSE(R1.contains(A2));
78c0d88999SLang Hames 
79c0d88999SLang Hames   EXPECT_FALSE(R1.overlaps(R0));
80c0d88999SLang Hames   EXPECT_FALSE(R1.overlaps(R2));
81c0d88999SLang Hames   EXPECT_TRUE(R1.overlaps(R3));
82c0d88999SLang Hames   EXPECT_TRUE(R1.overlaps(R4));
83c0d88999SLang Hames }
84c0d88999SLang Hames 
85c0d88999SLang Hames } // namespace
86