Skip to content

Commit 84e15d0

Browse files
authored
[Offload] Add olGetSymbolInfo[Size] (#147962)
This mirrors the similar functions for other handles. The only implemented info at the moment is the symbol's kind.
1 parent a386d0e commit 84e15d0

File tree

6 files changed

+215
-3
lines changed

6 files changed

+215
-3
lines changed

offload/liboffload/API/Symbol.td

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

offload/liboffload/src/OffloadImpl.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,5 +748,33 @@ Error olGetSymbol_impl(ol_program_handle_t Program, const char *Name,
748748
}
749749
}
750750

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

offload/unittests/OffloadAPI/CMakeLists.txt

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

4444
add_offload_unittest("symbol"
45-
symbol/olGetSymbol.cpp)
45+
symbol/olGetSymbol.cpp
46+
symbol/olGetSymbolInfo.cpp
47+
symbol/olGetSymbolInfoSize.cpp)

offload/unittests/OffloadAPI/common/Fixtures.hpp

Lines changed: 19 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,20 @@ 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(olGetSymbol(Program, "global",
133+
OL_SYMBOL_KIND_GLOBAL_VARIABLE, &Global));
134+
}
135+
136+
void TearDown() override {
137+
RETURN_ON_FATAL_FAILURE(OffloadProgramTest::TearDown());
138+
}
139+
140+
ol_symbol_handle_t Global = nullptr;
141+
};
142+
126143
struct OffloadQueueTest : OffloadDeviceTest {
127144
void SetUp() override {
128145
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)