Skip to content

Commit b269d41

Browse files
committed
[Offload] Add olGetSymbolInfo[Size]
This mirrors the similar functions for other handles. The only implemented info at the moment is the symbol's kind.
1 parent 2183d13 commit b269d41

File tree

6 files changed

+214
-3
lines changed

6 files changed

+214
-3
lines changed

offload/liboffload/API/Symbol.td

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,57 @@ def : Function {
3232
];
3333
let returns = [];
3434
}
35+
36+
def : Enum {
37+
let name = "ol_symbol_info_t";
38+
let desc = "Supported symbol info.";
39+
let is_typed = 1;
40+
let etors = [
41+
TaggedEtor<"KIND", "ol_symbol_kind_t", "The kind of this symbol.">
42+
];
43+
}
44+
45+
def : Function {
46+
let name = "olGetSymbolInfo";
47+
let desc = "Queries the given property of the symbol.";
48+
let details = [
49+
"`olGetSymbolInfoSize` can be used to query the storage size "
50+
"required for the given query."
51+
];
52+
let params = [
53+
Param<"ol_symbol_handle_t", "Event", "handle of the symbol", PARAM_IN>,
54+
Param<"ol_symbol_info_t", "PropName", "type of the info to retrieve", PARAM_IN>,
55+
Param<"size_t", "PropSize", "the number of bytes pointed to by PropValue.", PARAM_IN>,
56+
TypeTaggedParam<"void*", "PropValue", "array of bytes holding the info. "
57+
"If PropSize is not equal to or greater to the real number of bytes needed to return the info "
58+
"then the OL_ERRC_INVALID_SIZE error is returned and PropValue is not used.", PARAM_OUT,
59+
TypeInfo<"PropName" , "PropSize">>
60+
];
61+
let returns = [
62+
Return<"OL_ERRC_INVALID_SIZE", [
63+
"`PropSize == 0`",
64+
"If `PropSize` is less than the real number of bytes needed to return the info."
65+
]>,
66+
Return<"OL_ERRC_SYMBOL_KIND", [
67+
"If the requested info isn't applicable to the type of symbol."
68+
]>,
69+
Return<"OL_ERRC_INVALID_SYMBOL">
70+
];
71+
}
72+
73+
def : Function {
74+
let name = "olGetSymbolInfoSize";
75+
let desc = "Returns the storage size of the given symbol query.";
76+
let details = [];
77+
let params = [
78+
Param<"ol_symbol_handle_t", "Event", "handle of the symbol", PARAM_IN>,
79+
Param<"ol_symbol_info_t", "PropName", "type of the info to query", PARAM_IN>,
80+
Param<"size_t*", "PropSizeRet", "pointer to the number of bytes required to store the query", PARAM_OUT>
81+
];
82+
let returns = [
83+
Return<"OL_ERRC_INVALID_SYMBOL">,
84+
Return<"OL_ERRC_SYMBOL_KIND", [
85+
"If the requested info isn't applicable to the type of symbol."
86+
]>,
87+
];
88+
}

offload/liboffload/src/OffloadImpl.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,5 +746,33 @@ Error olGetGlobalVariable_impl(ol_program_handle_t Program,
746746
return Error::success();
747747
}
748748

749+
Error olGetSymbolInfoImplDetail(ol_symbol_handle_t Symbol,
750+
ol_symbol_info_t PropName, size_t PropSize,
751+
void *PropValue, size_t *PropSizeRet) {
752+
InfoWriter Info(PropSize, PropValue, PropSizeRet);
753+
754+
switch (PropName) {
755+
case OL_SYMBOL_INFO_KIND:
756+
return Info.write<ol_symbol_kind_t>(Symbol->Kind);
757+
default:
758+
return createOffloadError(ErrorCode::INVALID_ENUMERATION,
759+
"olGetSymbolInfo enum '%i' is invalid", PropName);
760+
}
761+
762+
return Error::success();
763+
}
764+
765+
Error olGetSymbolInfo_impl(ol_symbol_handle_t Symbol, ol_symbol_info_t PropName,
766+
size_t PropSize, void *PropValue) {
767+
768+
return olGetSymbolInfoImplDetail(Symbol, PropName, PropSize, PropValue,
769+
nullptr);
770+
}
771+
772+
Error olGetSymbolInfoSize_impl(ol_symbol_handle_t Symbol,
773+
ol_symbol_info_t PropName, size_t *PropSizeRet) {
774+
return olGetSymbolInfoImplDetail(Symbol, PropName, 0, nullptr, PropSizeRet);
775+
}
776+
749777
} // namespace offload
750778
} // namespace llvm

offload/unittests/OffloadAPI/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@ add_offload_unittest("queue"
4343
queue/olGetQueueInfoSize.cpp)
4444

4545
add_offload_unittest("symbol"
46-
symbol/olGetGlobalVariable.cpp)
46+
symbol/olGetGlobalVariable.cpp
47+
symbol/olGetSymbolInfo.cpp
48+
symbol/olGetSymbolInfoSize.cpp)

offload/unittests/OffloadAPI/common/Fixtures.hpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,12 @@ struct OffloadPlatformTest : OffloadDeviceTest {
9191
// Fixture for a generic program test. If you want a different program, use
9292
// offloadQueueTest and create your own program handle with the binary you want.
9393
struct OffloadProgramTest : OffloadDeviceTest {
94-
void SetUp() override {
94+
void SetUp() override { SetUpWith("foo"); }
95+
96+
void SetUpWith(const char *ProgramName) {
9597
RETURN_ON_FATAL_FAILURE(OffloadDeviceTest::SetUp());
96-
ASSERT_TRUE(TestEnvironment::loadDeviceBinary("foo", Device, DeviceBin));
98+
ASSERT_TRUE(
99+
TestEnvironment::loadDeviceBinary(ProgramName, Device, DeviceBin));
97100
ASSERT_GE(DeviceBin->getBufferSize(), 0lu);
98101
ASSERT_SUCCESS(olCreateProgram(Device, DeviceBin->getBufferStart(),
99102
DeviceBin->getBufferSize(), &Program));
@@ -123,6 +126,19 @@ struct OffloadKernelTest : OffloadProgramTest {
123126
ol_symbol_handle_t Kernel = nullptr;
124127
};
125128

129+
struct OffloadGlobalTest : OffloadProgramTest {
130+
void SetUp() override {
131+
RETURN_ON_FATAL_FAILURE(OffloadProgramTest::SetUpWith("global"));
132+
ASSERT_SUCCESS(olGetGlobalVariable(Program, "global", &Global));
133+
}
134+
135+
void TearDown() override {
136+
RETURN_ON_FATAL_FAILURE(OffloadProgramTest::TearDown());
137+
}
138+
139+
ol_symbol_handle_t Global = nullptr;
140+
};
141+
126142
struct OffloadQueueTest : OffloadDeviceTest {
127143
void SetUp() override {
128144
RETURN_ON_FATAL_FAILURE(OffloadDeviceTest::SetUp());
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//===------- Offload API tests - olGetSymbolInfo --------------------------===//
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 <OffloadAPI.h>
10+
11+
#include "../common/Fixtures.hpp"
12+
13+
using olGetSymbolInfoKernelTest = OffloadKernelTest;
14+
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olGetSymbolInfoKernelTest);
15+
16+
using olGetSymbolInfoGlobalTest = OffloadGlobalTest;
17+
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olGetSymbolInfoGlobalTest);
18+
19+
TEST_P(olGetSymbolInfoKernelTest, SuccessKind) {
20+
ol_symbol_kind_t RetrievedKind;
21+
ASSERT_SUCCESS(olGetSymbolInfo(Kernel, OL_SYMBOL_INFO_KIND,
22+
sizeof(RetrievedKind), &RetrievedKind));
23+
ASSERT_EQ(RetrievedKind, OL_SYMBOL_KIND_KERNEL);
24+
}
25+
26+
TEST_P(olGetSymbolInfoGlobalTest, SuccessKind) {
27+
ol_symbol_kind_t RetrievedKind;
28+
ASSERT_SUCCESS(olGetSymbolInfo(Global, OL_SYMBOL_INFO_KIND,
29+
sizeof(RetrievedKind), &RetrievedKind));
30+
ASSERT_EQ(RetrievedKind, OL_SYMBOL_KIND_GLOBAL_VARIABLE);
31+
}
32+
33+
TEST_P(olGetSymbolInfoKernelTest, InvalidNullHandle) {
34+
ol_symbol_kind_t RetrievedKind;
35+
ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE,
36+
olGetSymbolInfo(nullptr, OL_SYMBOL_INFO_KIND,
37+
sizeof(RetrievedKind), &RetrievedKind));
38+
}
39+
40+
TEST_P(olGetSymbolInfoKernelTest, InvalidSymbolInfoEnumeration) {
41+
ol_symbol_kind_t RetrievedKind;
42+
ASSERT_ERROR(OL_ERRC_INVALID_ENUMERATION,
43+
olGetSymbolInfo(Kernel, OL_SYMBOL_INFO_FORCE_UINT32,
44+
sizeof(RetrievedKind), &RetrievedKind));
45+
}
46+
47+
TEST_P(olGetSymbolInfoKernelTest, InvalidSizeZero) {
48+
ol_symbol_kind_t RetrievedKind;
49+
ASSERT_ERROR(OL_ERRC_INVALID_SIZE,
50+
olGetSymbolInfo(Kernel, OL_SYMBOL_INFO_KIND, 0, &RetrievedKind));
51+
}
52+
53+
TEST_P(olGetSymbolInfoKernelTest, InvalidSizeSmall) {
54+
ol_symbol_kind_t RetrievedKind;
55+
ASSERT_ERROR(OL_ERRC_INVALID_SIZE,
56+
olGetSymbolInfo(Kernel, OL_SYMBOL_INFO_KIND,
57+
sizeof(RetrievedKind) - 1, &RetrievedKind));
58+
}
59+
60+
TEST_P(olGetSymbolInfoKernelTest, InvalidNullPointerPropValue) {
61+
ol_symbol_kind_t RetrievedKind;
62+
ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER,
63+
olGetSymbolInfo(Kernel, OL_SYMBOL_INFO_KIND,
64+
sizeof(RetrievedKind), nullptr));
65+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//===------- Offload API tests - olGetSymbolInfoSize ----------------------===//
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 <OffloadAPI.h>
10+
11+
#include "../common/Fixtures.hpp"
12+
13+
using olGetSymbolInfoSizeKernelTest = OffloadKernelTest;
14+
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olGetSymbolInfoSizeKernelTest);
15+
16+
using olGetSymbolInfoSizeGlobalTest = OffloadGlobalTest;
17+
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olGetSymbolInfoSizeGlobalTest);
18+
19+
TEST_P(olGetSymbolInfoSizeKernelTest, SuccessKind) {
20+
size_t Size = 0;
21+
ASSERT_SUCCESS(olGetSymbolInfoSize(Kernel, OL_SYMBOL_INFO_KIND, &Size));
22+
ASSERT_EQ(Size, sizeof(ol_symbol_kind_t));
23+
}
24+
25+
TEST_P(olGetSymbolInfoSizeGlobalTest, SuccessKind) {
26+
size_t Size = 0;
27+
ASSERT_SUCCESS(olGetSymbolInfoSize(Global, OL_SYMBOL_INFO_KIND, &Size));
28+
ASSERT_EQ(Size, sizeof(ol_symbol_kind_t));
29+
}
30+
31+
TEST_P(olGetSymbolInfoSizeKernelTest, InvalidNullHandle) {
32+
size_t Size = 0;
33+
ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE,
34+
olGetSymbolInfoSize(nullptr, OL_SYMBOL_INFO_KIND, &Size));
35+
}
36+
37+
TEST_P(olGetSymbolInfoSizeKernelTest, InvalidSymbolInfoEnumeration) {
38+
size_t Size = 0;
39+
ASSERT_ERROR(OL_ERRC_INVALID_ENUMERATION,
40+
olGetSymbolInfoSize(Kernel, OL_SYMBOL_INFO_FORCE_UINT32, &Size));
41+
}
42+
43+
TEST_P(olGetSymbolInfoSizeKernelTest, InvalidNullPointer) {
44+
ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER,
45+
olGetSymbolInfoSize(Kernel, OL_SYMBOL_INFO_KIND, nullptr));
46+
}

0 commit comments

Comments
 (0)