• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/ADT/SmallString.h"
12 #include "llvm/Support/Endian.h"
13 #include "gtest/gtest.h"
14 #include <string>
15 
16 using namespace llvm;
17 
18 namespace {
19 
TEST(StringTableBuilderTest,BasicELF)20 TEST(StringTableBuilderTest, BasicELF) {
21   StringTableBuilder B(StringTableBuilder::ELF);
22 
23   B.add("foo");
24   B.add("bar");
25   B.add("foobar");
26 
27   B.finalize();
28 
29   std::string Expected;
30   Expected += '\x00';
31   Expected += "foobar";
32   Expected += '\x00';
33   Expected += "foo";
34   Expected += '\x00';
35 
36   SmallString<64> Data;
37   raw_svector_ostream OS(Data);
38   B.write(OS);
39 
40   EXPECT_EQ(Expected, Data);
41   EXPECT_EQ(1U, B.getOffset("foobar"));
42   EXPECT_EQ(4U, B.getOffset("bar"));
43   EXPECT_EQ(8U, B.getOffset("foo"));
44 }
45 
TEST(StringTableBuilderTest,BasicWinCOFF)46 TEST(StringTableBuilderTest, BasicWinCOFF) {
47   StringTableBuilder B(StringTableBuilder::WinCOFF);
48 
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 
54   B.finalize();
55 
56   // size_field + "pygmy hippopotamus\0" + "river horse\0"
57   uint32_t ExpectedSize = 4 + 19 + 12;
58   EXPECT_EQ(ExpectedSize, B.getSize());
59 
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 
70   SmallString<64> Data;
71   raw_svector_ostream OS(Data);
72   B.write(OS);
73 
74   EXPECT_EQ(Expected, Data);
75   EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
76   EXPECT_EQ(10U, B.getOffset("hippopotamus"));
77   EXPECT_EQ(23U, B.getOffset("river horse"));
78 }
79 
TEST(StringTableBuilderTest,ELFInOrder)80 TEST(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 
97   SmallString<64> Data;
98   raw_svector_ostream OS(Data);
99   B.write(OS);
100 
101   EXPECT_EQ(Expected, Data);
102   EXPECT_EQ(1U, B.getOffset("foo"));
103   EXPECT_EQ(5U, B.getOffset("bar"));
104   EXPECT_EQ(9U, B.getOffset("foobar"));
105 }
106 
107 }
108