From c0d889995e708f8bcb0fd688f63d031ee06b5874 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Fri, 24 Sep 2021 11:35:03 -0700 Subject: [PATCH] [ORC] Add 'contains' and 'overlaps' operations to ExecutorAddrRange. Also includes unit tests for not-yet tested operations like comparison and to/from pointer conversion. --- .../ExecutionEngine/Orc/Shared/ExecutorAddress.h | 15 +++++ llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt | 1 + .../ExecutionEngine/Orc/ExecutorAddressTest.cpp | 73 ++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 llvm/unittests/ExecutionEngine/Orc/ExecutorAddressTest.cpp diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h index 01d8aaf..01cc963 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h @@ -37,6 +37,8 @@ private: class ExecutorAddr { public: ExecutorAddr() = default; + + /// Create an ExecutorAddr from the given value. explicit ExecutorAddr(uint64_t Addr) : Addr(Addr) {} /// Create an ExecutorAddr from the given pointer. @@ -137,6 +139,19 @@ struct ExecutorAddrRange { bool empty() const { return Start == End; } ExecutorAddrDiff size() const { return End - Start; } + friend bool operator==(const ExecutorAddrRange &LHS, + const ExecutorAddrRange &RHS) { + return LHS.Start == RHS.Start && LHS.End == RHS.End; + } + friend bool operator!=(const ExecutorAddrRange &LHS, + const ExecutorAddrRange &RHS) { + return !(LHS == RHS); + } + bool contains(ExecutorAddr Addr) const { return Start <= Addr && Addr < End; } + bool overlaps(const ExecutorAddrRange &Other) { + return !(Other.End <= Start || End <= Other.Start); + } + ExecutorAddr Start; ExecutorAddr End; }; diff --git a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt index 7f6796b..e9112d3 100644 --- a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt +++ b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt @@ -16,6 +16,7 @@ set(LLVM_LINK_COMPONENTS add_llvm_unittest(OrcJITTests CoreAPIsTest.cpp + ExecutorAddressTest.cpp ExecutionSessionWrapperFunctionCallsTest.cpp EPCGenericJITLinkMemoryManagerTest.cpp EPCGenericMemoryAccessTest.cpp diff --git a/llvm/unittests/ExecutionEngine/Orc/ExecutorAddressTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ExecutorAddressTest.cpp new file mode 100644 index 0000000..f9ba861 --- /dev/null +++ b/llvm/unittests/ExecutionEngine/Orc/ExecutorAddressTest.cpp @@ -0,0 +1,73 @@ +//===--------- ExecutorAddrTest.cpp - Unit tests for ExecutorAddr ---------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" +#include "OrcTestCommon.h" + +using namespace llvm; +using namespace llvm::orc; + +namespace { + +TEST(ExecutorAddrTest, DefaultAndNull) { + // Check that default constructed values and isNull behave as expected. + + ExecutorAddr Default; + ExecutorAddr Null(0); + ExecutorAddr NonNull(1); + + EXPECT_TRUE(Null.isNull()); + EXPECT_EQ(Default, Null); + + EXPECT_FALSE(NonNull.isNull()); + EXPECT_NE(Default, NonNull); +} + +TEST(ExecutorAddrTest, Ordering) { + // Check that ordering operations. + ExecutorAddr A1(1), A2(2); + + EXPECT_LE(A1, A1); + EXPECT_LT(A1, A2); + EXPECT_GT(A2, A1); + EXPECT_GE(A2, A2); +} + +TEST(ExecutorAddrTest, PtrConversion) { + // Test toPtr / fromPtr round-tripping. + int X = 0; + auto XAddr = ExecutorAddr::fromPtr(&X); + int *XPtr = XAddr.toPtr(); + + EXPECT_EQ(XPtr, &X); +} + +TEST(ExecutorAddrTest, AddrRanges) { + ExecutorAddr A0(0), A1(1), A2(2), A3(3); + ExecutorAddrRange R0(A0, A1), R1(A1, A2), R2(A2, A3), R3(A0, A2), R4(A1, A3); + // 012 + // R0: # -- Before R1 + // R1: # -- + // R2: # -- After R1 + // R3: ## -- Overlaps R1 start + // R4: ## -- Overlaps R1 end + + EXPECT_EQ(R1, ExecutorAddrRange(A1, A2)); + EXPECT_NE(R1, R2); + + EXPECT_TRUE(R1.contains(A1)); + EXPECT_FALSE(R1.contains(A0)); + EXPECT_FALSE(R1.contains(A2)); + + EXPECT_FALSE(R1.overlaps(R0)); + EXPECT_FALSE(R1.overlaps(R2)); + EXPECT_TRUE(R1.overlaps(R3)); + EXPECT_TRUE(R1.overlaps(R4)); +} + +} // namespace -- 2.7.4