blob: f78d3588ffffd47db1ff0b2ef91a924512523093 [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
35 EXPECT_EQ(Expected, B.data());
36 EXPECT_EQ(1U, B.getOffset("foobar"));
37 EXPECT_EQ(4U, B.getOffset("bar"));
38 EXPECT_EQ(8U, B.getOffset("foo"));
39}
40
Hans Wennborgf26bfc12014-09-29 22:43:20 +000041TEST(StringTableBuilderTest, BasicWinCOFF) {
Rafael Espindola21956e42015-10-23 21:48:05 +000042 StringTableBuilder B(StringTableBuilder::WinCOFF);
Hans Wennborgf26bfc12014-09-29 22:43:20 +000043
44 // Strings must be 9 chars or longer to go in the table.
45 B.add("hippopotamus");
46 B.add("pygmy hippopotamus");
47 B.add("river horse");
48
Rafael Espindola21956e42015-10-23 21:48:05 +000049 B.finalize();
Hans Wennborgf26bfc12014-09-29 22:43:20 +000050
51 // size_field + "pygmy hippopotamus\0" + "river horse\0"
52 uint32_t ExpectedSize = 4 + 19 + 12;
53 EXPECT_EQ(ExpectedSize, B.data().size());
54
55 std::string Expected;
56
57 ExpectedSize =
58 support::endian::byte_swap<uint32_t, support::little>(ExpectedSize);
59 Expected.append((const char*)&ExpectedSize, 4);
60 Expected += "pygmy hippopotamus";
61 Expected += '\x00';
62 Expected += "river horse";
63 Expected += '\x00';
64
65 EXPECT_EQ(Expected, B.data());
66 EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
67 EXPECT_EQ(10U, B.getOffset("hippopotamus"));
68 EXPECT_EQ(23U, B.getOffset("river horse"));
69}
70
Reid Kleckner2214ed82016-01-29 00:49:42 +000071TEST(StringTableBuilderTest, ELFInOrder) {
72 StringTableBuilder B(StringTableBuilder::ELF);
73 EXPECT_EQ(1U, B.add("foo"));
74 EXPECT_EQ(5U, B.add("bar"));
75 EXPECT_EQ(9U, B.add("foobar"));
76
77 B.finalizeInOrder();
78
79 std::string Expected;
80 Expected += '\x00';
81 Expected += "foo";
82 Expected += '\x00';
83 Expected += "bar";
84 Expected += '\x00';
85 Expected += "foobar";
86 Expected += '\x00';
87
88 EXPECT_EQ(Expected, B.data());
89 EXPECT_EQ(1U, B.getOffset("foo"));
90 EXPECT_EQ(5U, B.getOffset("bar"));
91 EXPECT_EQ(9U, B.getOffset("foobar"));
92}
93
Hans Wennborg83e6e1e2014-04-30 16:25:02 +000094}