blob: b547f934b02c88e674d837fef06eccfcfa49ec09 [file] [log] [blame]
Hans Wennborga8febf22014-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 Espindola7413fef2014-07-03 02:01:39 +000010#include "llvm/MC/StringTableBuilder.h"
Chandler Carruth3c0d6072017-06-06 11:06:56 +000011#include "llvm/ADT/SmallString.h"
Hans Wennborg4edcbae2014-09-29 22:43:20 +000012#include "llvm/Support/Endian.h"
Chandler Carruth1b279142015-01-14 11:23:27 +000013#include "gtest/gtest.h"
Hans Wennborga8febf22014-04-30 16:25:02 +000014#include <string>
15
16using namespace llvm;
17
18namespace {
19
Hans Wennborg4edcbae2014-09-29 22:43:20 +000020TEST(StringTableBuilderTest, BasicELF) {
Rafael Espindola715bcca2015-10-23 21:48:05 +000021 StringTableBuilder B(StringTableBuilder::ELF);
Hans Wennborga8febf22014-04-30 16:25:02 +000022
23 B.add("foo");
24 B.add("bar");
25 B.add("foobar");
26
Rafael Espindola715bcca2015-10-23 21:48:05 +000027 B.finalize();
Hans Wennborga8febf22014-04-30 16:25:02 +000028
29 std::string Expected;
30 Expected += '\x00';
31 Expected += "foobar";
32 Expected += '\x00';
33 Expected += "foo";
34 Expected += '\x00';
35
Rafael Espindola2638e452016-10-04 22:43:25 +000036 SmallString<64> Data;
37 raw_svector_ostream OS(Data);
38 B.write(OS);
39
40 EXPECT_EQ(Expected, Data);
Hans Wennborga8febf22014-04-30 16:25:02 +000041 EXPECT_EQ(1U, B.getOffset("foobar"));
42 EXPECT_EQ(4U, B.getOffset("bar"));
43 EXPECT_EQ(8U, B.getOffset("foo"));
44}
45
Hans Wennborg4edcbae2014-09-29 22:43:20 +000046TEST(StringTableBuilderTest, BasicWinCOFF) {
Rafael Espindola715bcca2015-10-23 21:48:05 +000047 StringTableBuilder B(StringTableBuilder::WinCOFF);
Hans Wennborg4edcbae2014-09-29 22:43:20 +000048
49 // Strings must be 9 chars or longer to go in the table.
50 B.add("hippopotamus");
51 B.add("pygmy hippopotamus");
52 B.add("river horse");
53
Rafael Espindola715bcca2015-10-23 21:48:05 +000054 B.finalize();
Hans Wennborg4edcbae2014-09-29 22:43:20 +000055
56 // size_field + "pygmy hippopotamus\0" + "river horse\0"
57 uint32_t ExpectedSize = 4 + 19 + 12;
Rafael Espindola2638e452016-10-04 22:43:25 +000058 EXPECT_EQ(ExpectedSize, B.getSize());
Hans Wennborg4edcbae2014-09-29 22:43:20 +000059
60 std::string Expected;
61
62 ExpectedSize =
63 support::endian::byte_swap<uint32_t, support::little>(ExpectedSize);
64 Expected.append((const char*)&ExpectedSize, 4);
65 Expected += "pygmy hippopotamus";
66 Expected += '\x00';
67 Expected += "river horse";
68 Expected += '\x00';
69
Rafael Espindola2638e452016-10-04 22:43:25 +000070 SmallString<64> Data;
71 raw_svector_ostream OS(Data);
72 B.write(OS);
73
74 EXPECT_EQ(Expected, Data);
Hans Wennborg4edcbae2014-09-29 22:43:20 +000075 EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
76 EXPECT_EQ(10U, B.getOffset("hippopotamus"));
77 EXPECT_EQ(23U, B.getOffset("river horse"));
78}
79
Reid Kleckner1689efb2016-01-29 00:49:42 +000080TEST(StringTableBuilderTest, ELFInOrder) {
81 StringTableBuilder B(StringTableBuilder::ELF);
82 EXPECT_EQ(1U, B.add("foo"));
83 EXPECT_EQ(5U, B.add("bar"));
84 EXPECT_EQ(9U, B.add("foobar"));
85
86 B.finalizeInOrder();
87
88 std::string Expected;
89 Expected += '\x00';
90 Expected += "foo";
91 Expected += '\x00';
92 Expected += "bar";
93 Expected += '\x00';
94 Expected += "foobar";
95 Expected += '\x00';
96
Rafael Espindola2638e452016-10-04 22:43:25 +000097 SmallString<64> Data;
98 raw_svector_ostream OS(Data);
99 B.write(OS);
100
101 EXPECT_EQ(Expected, Data);
Reid Kleckner1689efb2016-01-29 00:49:42 +0000102 EXPECT_EQ(1U, B.getOffset("foo"));
103 EXPECT_EQ(5U, B.getOffset("bar"));
104 EXPECT_EQ(9U, B.getOffset("foobar"));
105}
106
Hans Wennborga8febf22014-04-30 16:25:02 +0000107}