1*9e3b08aeSAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2*9e3b08aeSAndroid Build Coastguard Worker // -*- mode: C++ -*-
3*9e3b08aeSAndroid Build Coastguard Worker //
4*9e3b08aeSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
5*9e3b08aeSAndroid Build Coastguard Worker //
6*9e3b08aeSAndroid Build Coastguard Worker // Licensed under the Apache License v2.0 with LLVM Exceptions (the
7*9e3b08aeSAndroid Build Coastguard Worker // "License"); you may not use this file except in compliance with the
8*9e3b08aeSAndroid Build Coastguard Worker // License. You may obtain a copy of the License at
9*9e3b08aeSAndroid Build Coastguard Worker //
10*9e3b08aeSAndroid Build Coastguard Worker // https://llvm.org/LICENSE.txt
11*9e3b08aeSAndroid Build Coastguard Worker //
12*9e3b08aeSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
13*9e3b08aeSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
14*9e3b08aeSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*9e3b08aeSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
16*9e3b08aeSAndroid Build Coastguard Worker // limitations under the License.
17*9e3b08aeSAndroid Build Coastguard Worker //
18*9e3b08aeSAndroid Build Coastguard Worker // Author: Aleksei Vetrov
19*9e3b08aeSAndroid Build Coastguard Worker
20*9e3b08aeSAndroid Build Coastguard Worker #include <string_view>
21*9e3b08aeSAndroid Build Coastguard Worker
22*9e3b08aeSAndroid Build Coastguard Worker #include <catch2/catch.hpp>
23*9e3b08aeSAndroid Build Coastguard Worker #include "elf_loader.h"
24*9e3b08aeSAndroid Build Coastguard Worker #include "elf_reader.h"
25*9e3b08aeSAndroid Build Coastguard Worker
26*9e3b08aeSAndroid Build Coastguard Worker namespace Test {
27*9e3b08aeSAndroid Build Coastguard Worker
28*9e3b08aeSAndroid Build Coastguard Worker using SymbolTable = stg::elf::internal::SymbolTable;
29*9e3b08aeSAndroid Build Coastguard Worker using SymbolTableEntry = stg::elf::SymbolTableEntry;
30*9e3b08aeSAndroid Build Coastguard Worker
MakeSymbol(std::string_view name)31*9e3b08aeSAndroid Build Coastguard Worker SymbolTableEntry MakeSymbol(std::string_view name) {
32*9e3b08aeSAndroid Build Coastguard Worker return {
33*9e3b08aeSAndroid Build Coastguard Worker .name = name,
34*9e3b08aeSAndroid Build Coastguard Worker .value = 0,
35*9e3b08aeSAndroid Build Coastguard Worker .size = 0,
36*9e3b08aeSAndroid Build Coastguard Worker .symbol_type = SymbolTableEntry::SymbolType::OBJECT,
37*9e3b08aeSAndroid Build Coastguard Worker .binding = SymbolTableEntry::Binding::GLOBAL,
38*9e3b08aeSAndroid Build Coastguard Worker .visibility = SymbolTableEntry::Visibility::DEFAULT,
39*9e3b08aeSAndroid Build Coastguard Worker .section_index = 0,
40*9e3b08aeSAndroid Build Coastguard Worker .value_type = SymbolTableEntry::ValueType::RELATIVE_TO_SECTION,
41*9e3b08aeSAndroid Build Coastguard Worker };
42*9e3b08aeSAndroid Build Coastguard Worker }
43*9e3b08aeSAndroid Build Coastguard Worker
44*9e3b08aeSAndroid Build Coastguard Worker
45*9e3b08aeSAndroid Build Coastguard Worker TEST_CASE("GetKsymtabSymbols") {
46*9e3b08aeSAndroid Build Coastguard Worker const SymbolTable all_symbols = {
47*9e3b08aeSAndroid Build Coastguard Worker MakeSymbol("foo"),
48*9e3b08aeSAndroid Build Coastguard Worker MakeSymbol("__ksymtab_foo"),
49*9e3b08aeSAndroid Build Coastguard Worker MakeSymbol("bar"),
50*9e3b08aeSAndroid Build Coastguard Worker };
51*9e3b08aeSAndroid Build Coastguard Worker const auto ksymtab = stg::elf::internal::GetKsymtabSymbols(all_symbols);
52*9e3b08aeSAndroid Build Coastguard Worker REQUIRE(ksymtab.size() == 1);
53*9e3b08aeSAndroid Build Coastguard Worker CHECK(*ksymtab.begin() == "foo");
54*9e3b08aeSAndroid Build Coastguard Worker }
55*9e3b08aeSAndroid Build Coastguard Worker
56*9e3b08aeSAndroid Build Coastguard Worker } // namespace Test
57