1//===----------- 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
10#include "llvm/MC/StringTableBuilder.h"
11#include "llvm/Support/Endian.h"
12#include "gtest/gtest.h"
13#include <string>
14
15using namespace llvm;
16
17namespace {
18
19TEST(StringTableBuilderTest, BasicELF) {
20  StringTableBuilder B(StringTableBuilder::ELF);
21
22  B.add("foo");
23  B.add("bar");
24  B.add("foobar");
25
26  B.finalize();
27
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
41TEST(StringTableBuilderTest, BasicWinCOFF) {
42  StringTableBuilder B(StringTableBuilder::WinCOFF);
43
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
49  B.finalize();
50
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
71TEST(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
94}
95