xref: /aosp_15_r20/external/llvm/unittests/MC/StringTableBuilderTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===----------- StringTableBuilderTest.cpp -------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/StringTableBuilder.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Endian.h"
12*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*9880d681SAndroid Build Coastguard Worker #include <string>
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker 
TEST(StringTableBuilderTest,BasicELF)19*9880d681SAndroid Build Coastguard Worker TEST(StringTableBuilderTest, BasicELF) {
20*9880d681SAndroid Build Coastguard Worker   StringTableBuilder B(StringTableBuilder::ELF);
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker   B.add("foo");
23*9880d681SAndroid Build Coastguard Worker   B.add("bar");
24*9880d681SAndroid Build Coastguard Worker   B.add("foobar");
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker   B.finalize();
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker   std::string Expected;
29*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
30*9880d681SAndroid Build Coastguard Worker   Expected += "foobar";
31*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
32*9880d681SAndroid Build Coastguard Worker   Expected += "foo";
33*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Expected, B.data());
36*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1U, B.getOffset("foobar"));
37*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(4U, B.getOffset("bar"));
38*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(8U, B.getOffset("foo"));
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker 
TEST(StringTableBuilderTest,BasicWinCOFF)41*9880d681SAndroid Build Coastguard Worker TEST(StringTableBuilderTest, BasicWinCOFF) {
42*9880d681SAndroid Build Coastguard Worker   StringTableBuilder B(StringTableBuilder::WinCOFF);
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker   // Strings must be 9 chars or longer to go in the table.
45*9880d681SAndroid Build Coastguard Worker   B.add("hippopotamus");
46*9880d681SAndroid Build Coastguard Worker   B.add("pygmy hippopotamus");
47*9880d681SAndroid Build Coastguard Worker   B.add("river horse");
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker   B.finalize();
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker   // size_field + "pygmy hippopotamus\0" + "river horse\0"
52*9880d681SAndroid Build Coastguard Worker   uint32_t ExpectedSize = 4 + 19 + 12;
53*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ExpectedSize, B.data().size());
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker   std::string Expected;
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker   ExpectedSize =
58*9880d681SAndroid Build Coastguard Worker       support::endian::byte_swap<uint32_t, support::little>(ExpectedSize);
59*9880d681SAndroid Build Coastguard Worker   Expected.append((const char*)&ExpectedSize, 4);
60*9880d681SAndroid Build Coastguard Worker   Expected += "pygmy hippopotamus";
61*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
62*9880d681SAndroid Build Coastguard Worker   Expected += "river horse";
63*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Expected, B.data());
66*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
67*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(10U, B.getOffset("hippopotamus"));
68*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(23U, B.getOffset("river horse"));
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker 
TEST(StringTableBuilderTest,ELFInOrder)71*9880d681SAndroid Build Coastguard Worker TEST(StringTableBuilderTest, ELFInOrder) {
72*9880d681SAndroid Build Coastguard Worker   StringTableBuilder B(StringTableBuilder::ELF);
73*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1U, B.add("foo"));
74*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(5U, B.add("bar"));
75*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(9U, B.add("foobar"));
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker   B.finalizeInOrder();
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker   std::string Expected;
80*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
81*9880d681SAndroid Build Coastguard Worker   Expected += "foo";
82*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
83*9880d681SAndroid Build Coastguard Worker   Expected += "bar";
84*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
85*9880d681SAndroid Build Coastguard Worker   Expected += "foobar";
86*9880d681SAndroid Build Coastguard Worker   Expected += '\x00';
87*9880d681SAndroid Build Coastguard Worker 
88*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Expected, B.data());
89*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1U, B.getOffset("foo"));
90*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(5U, B.getOffset("bar"));
91*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(9U, B.getOffset("foobar"));
92*9880d681SAndroid Build Coastguard Worker }
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker }
95