| //===------- Offload API tests - olIterateSymbols -------------------------===// |
| // |
| // 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 "../common/Fixtures.hpp" |
| #include <OffloadAPI.h> |
| #include <gtest/gtest.h> |
| |
| // The 'global' program contains the 'read' and 'write' kernels as well as the |
| // 'global' global variable. |
| struct olIterateSymbolsTest : OffloadProgramTest { |
| void SetUp() override { SetUpWith("global"); } |
| }; |
| OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olIterateSymbolsTest); |
| |
| using SymbolVecT = std::vector<ol_symbol_handle_t>; |
| |
| static bool collectSymbol(ol_symbol_handle_t Symbol, void *Data) { |
| static_cast<SymbolVecT *>(Data)->push_back(Symbol); |
| return true; |
| } |
| |
| static std::string getName(ol_symbol_handle_t Symbol) { |
| size_t Size = 0; |
| if (olGetSymbolInfoSize(Symbol, OL_SYMBOL_INFO_NAME, &Size)) |
| return {}; |
| std::vector<char> Name(Size); |
| if (olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_NAME, Size, Name.data())) |
| return {}; |
| return std::string{Name.data()}; |
| } |
| |
| static std::vector<std::string> getNames(const SymbolVecT &Symbols, |
| ol_symbol_kind_t Expected) { |
| std::vector<std::string> Names; |
| for (auto *Symbol : Symbols) { |
| ol_symbol_kind_t Kind; |
| if (olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_KIND, sizeof(Kind), &Kind)) |
| return {}; |
| EXPECT_EQ(Kind, Expected); |
| Names.push_back(getName(Symbol)); |
| } |
| return Names; |
| } |
| |
| static bool contains(const std::vector<std::string> &Names, |
| const std::string &Name) { |
| return std::find(Names.begin(), Names.end(), Name) != Names.end(); |
| } |
| |
| TEST_P(olIterateSymbolsTest, SuccessKernels) { |
| SymbolVecT Symbols; |
| ASSERT_SUCCESS(olIterateSymbols(Program, OL_SYMBOL_KIND_KERNEL, collectSymbol, |
| &Symbols)); |
| |
| auto Names = getNames(Symbols, OL_SYMBOL_KIND_KERNEL); |
| ASSERT_TRUE(contains(Names, "read")); |
| ASSERT_TRUE(contains(Names, "write")); |
| } |
| |
| TEST_P(olIterateSymbolsTest, SuccessGlobals) { |
| SymbolVecT Symbols; |
| ASSERT_SUCCESS_OR_UNSUPPORTED(olIterateSymbols( |
| Program, OL_SYMBOL_KIND_GLOBAL_VARIABLE, collectSymbol, &Symbols)); |
| |
| auto Names = getNames(Symbols, OL_SYMBOL_KIND_GLOBAL_VARIABLE); |
| ASSERT_TRUE(contains(Names, "global")); |
| } |
| |
| TEST_P(olIterateSymbolsTest, SuccessSameSymbol) { |
| SymbolVecT Symbols; |
| ASSERT_SUCCESS(olIterateSymbols(Program, OL_SYMBOL_KIND_KERNEL, collectSymbol, |
| &Symbols)); |
| ASSERT_FALSE(Symbols.empty()); |
| |
| for (auto *Symbol : Symbols) { |
| ol_symbol_handle_t Looked = nullptr; |
| ASSERT_SUCCESS(olGetSymbol(Program, getName(Symbol).c_str(), |
| OL_SYMBOL_KIND_KERNEL, &Looked)); |
| ASSERT_EQ(Symbol, Looked); |
| } |
| } |
| |
| TEST_P(olIterateSymbolsTest, SuccessStopIteration) { |
| size_t Count = 0; |
| ASSERT_SUCCESS(olIterateSymbols( |
| Program, OL_SYMBOL_KIND_KERNEL, |
| [](ol_symbol_handle_t, void *Data) { |
| (*static_cast<size_t *>(Data))++; |
| return false; |
| }, |
| &Count)); |
| ASSERT_EQ(Count, 1u); |
| } |
| |
| TEST_P(olIterateSymbolsTest, InvalidNullProgram) { |
| SymbolVecT Symbols; |
| ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE, |
| olIterateSymbols(nullptr, OL_SYMBOL_KIND_KERNEL, collectSymbol, |
| &Symbols)); |
| } |
| |
| TEST_P(olIterateSymbolsTest, InvalidNullCallback) { |
| ASSERT_ERROR( |
| OL_ERRC_INVALID_NULL_POINTER, |
| olIterateSymbols(Program, OL_SYMBOL_KIND_KERNEL, nullptr, nullptr)); |
| } |
| |
| TEST_P(olIterateSymbolsTest, InvalidKind) { |
| SymbolVecT Symbols; |
| ASSERT_ERROR(OL_ERRC_INVALID_ENUMERATION, |
| olIterateSymbols(Program, OL_SYMBOL_KIND_FORCE_UINT32, |
| collectSymbol, &Symbols)); |
| } |