blob: 517ada5ed963365939e6896433c7630b53e9910d [file] [log] [blame]
Hans Wennborg83e6e1e2014-04-30 16:25:02 +00001//===----------- StringTableBuilderTest.cpp -------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Rafael Espindola97de4742014-07-03 02:01:39 +000010#include "llvm/MC/StringTableBuilder.h"
Hans Wennborgf26bfc12014-09-29 22:43:20 +000011#include "llvm/Support/Endian.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000012#include "gtest/gtest.h"
Hans Wennborg83e6e1e2014-04-30 16:25:02 +000013#include <string>
14
15using namespace llvm;
16
17namespace {
18
Hans Wennborgf26bfc12014-09-29 22:43:20 +000019TEST(StringTableBuilderTest, BasicELF) {
Rafael Espindola21956e42015-10-23 21:48:05 +000020 StringTableBuilder B(StringTableBuilder::ELF);
Hans Wennborg83e6e1e2014-04-30 16:25:02 +000021
22 B.add("foo");
23 B.add("bar");
24 B.add("foobar");
25
Rafael Espindola21956e42015-10-23 21:48:05 +000026 B.finalize();
Hans Wennborg83e6e1e2014-04-30 16:25:02 +000027
28 std::string Expected;
29 Expected += '\x00';
30 Expected += "foobar";
31 Expected += '\x00';
32 Expected += "foo";
33 Expected += '\x00';
34
Rafael Espindola39751af2016-10-04 22:43:25 +000035 SmallString<64> Data;
36 raw_svector_ostream OS(Data);
37 B.write(OS);
38
39 EXPECT_EQ(Expected, Data);
Hans Wennborg83e6e1e2014-04-30 16:25:02 +000040 EXPECT_EQ(1U, B.getOffset("foobar"));
41 EXPECT_EQ(4U, B.getOffset("bar"));
42 EXPECT_EQ(8U, B.getOffset("foo"));
43}
44
Hans Wennborgf26bfc12014-09-29 22:43:20 +000045TEST(StringTableBuilderTest, BasicWinCOFF) {
Rafael Espindola21956e42015-10-23 21:48:05 +000046 StringTableBuilder B(StringTableBuilder::WinCOFF);
Hans Wennborgf26bfc12014-09-29 22:43:20 +000047
48 // Strings must be 9 chars or longer to go in the table.
49 B.add("hippopotamus");
50 B.add("pygmy hippopotamus");
51 B.add("river horse");
52
Rafael Espindola21956e42015-10-23 21:48:05 +000053 B.finalize();
Hans Wennborgf26bfc12014-09-29 22:43:20 +000054
55 // size_field + "pygmy hippopotamus\0" + "river horse\0"
56 uint32_t ExpectedSize = 4 + 19 + 12;
Rafael Espindola39751af2016-10-04 22:43:25 +000057 EXPECT_EQ(ExpectedSize, B.getSize());
Hans Wennborgf26bfc12014-09-29 22:43:20 +000058
59 std::string Expected;
60
61 ExpectedSize =
62 support::endian::byte_swap<uint32_t, support::little>(ExpectedSize);
63 Expected.append((const char*)&ExpectedSize, 4);
64 Expected += "pygmy hippopotamus";
65 Expected += '\x00';
66 Expected += "river horse";
67 Expected += '\x00';
68
Rafael Espindola39751af2016-10-04 22:43:25 +000069 SmallString<64> Data;
70 raw_svector_ostream OS(Data);
71 B.write(OS);
72
73 EXPECT_EQ(Expected, Data);
Hans Wennborgf26bfc12014-09-29 22:43:20 +000074 EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
75 EXPECT_EQ(10U, B.getOffset("hippopotamus"));
76 EXPECT_EQ(23U, B.getOffset("river horse"));
77}
78
Reid Kleckner2214ed82016-01-29 00:49:42 +000079TEST(StringTableBuilderTest, ELFInOrder) {
80 StringTableBuilder B(StringTableBuilder::ELF);
81 EXPECT_EQ(1U, B.add("foo"));
82 EXPECT_EQ(5U, B.add("bar"));
83 EXPECT_EQ(9U, B.add("foobar"));
84
85 B.finalizeInOrder();
86
87 std::string Expected;
88 Expected += '\x00';
89 Expected += "foo";
90 Expected += '\x00';
91 Expected += "bar";
92 Expected += '\x00';
93 Expected += "foobar";
94 Expected += '\x00';
95
Rafael Espindola39751af2016-10-04 22:43:25 +000096 SmallString<64> Data;
97 raw_svector_ostream OS(Data);
98 B.write(OS);
99
100 EXPECT_EQ(Expected, Data);
Reid Kleckner2214ed82016-01-29 00:49:42 +0000101 EXPECT_EQ(1U, B.getOffset("foo"));
102 EXPECT_EQ(5U, B.getOffset("bar"));
103 EXPECT_EQ(9U, B.getOffset("foobar"));
104}
105
Hans Wennborg83e6e1e2014-04-30 16:25:02 +0000106}