brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 44a985b Raw
240 lines · cpp
1//===----------- StringTableBuilderTest.cpp -------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/MC/StringTableBuilder.h"10#include "llvm/ADT/SmallString.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  SmallString<64> Data;36  raw_svector_ostream OS(Data);37  B.write(OS);38 39  EXPECT_EQ(Expected, Data);40  EXPECT_EQ(1U, B.getOffset("foobar"));41  EXPECT_EQ(4U, B.getOffset("bar"));42  EXPECT_EQ(8U, B.getOffset("foo"));43}44 45TEST(StringTableBuilderTest, BasicWinCOFF) {46  StringTableBuilder B(StringTableBuilder::WinCOFF);47 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 53  B.finalize();54 55  // size_field + "pygmy hippopotamus\0" + "river horse\0"56  uint32_t ExpectedSize = 4 + 19 + 12;57  EXPECT_EQ(ExpectedSize, B.getSize());58 59  std::string Expected;60 61  ExpectedSize = support::endian::byte_swap<uint32_t>(ExpectedSize,62                                                      llvm::endianness::little);63  Expected.append((const char*)&ExpectedSize, 4);64  Expected += "pygmy hippopotamus";65  Expected += '\x00';66  Expected += "river horse";67  Expected += '\x00';68 69  SmallString<64> Data;70  raw_svector_ostream OS(Data);71  B.write(OS);72 73  EXPECT_EQ(Expected, Data);74  EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));75  EXPECT_EQ(10U, B.getOffset("hippopotamus"));76  EXPECT_EQ(23U, B.getOffset("river horse"));77}78 79TEST(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 96  SmallString<64> Data;97  raw_svector_ostream OS(Data);98  B.write(OS);99 100  EXPECT_EQ(Expected, Data);101  EXPECT_EQ(1U, B.getOffset("foo"));102  EXPECT_EQ(5U, B.getOffset("bar"));103  EXPECT_EQ(9U, B.getOffset("foobar"));104}105 106TEST(StringTableBuilderTest, MachOInOrder) {107  StringTableBuilder B(StringTableBuilder::MachO);108 109  B.add("foo");110  B.add("bar");111  B.add("fooba");112 113  B.finalizeInOrder();114 115  std::string Expected;116  Expected += '\x00';117  Expected += "foo";118  Expected += '\x00';119  Expected += "bar";120  Expected += '\x00';121  Expected += "fooba";122  Expected += '\x00';123 124  // Mach-O pads to 4 bytes125  Expected += '\x00';126 127  SmallString<64> Data;128  raw_svector_ostream OS(Data);129  B.write(OS);130 131  EXPECT_EQ(Expected, Data);132  EXPECT_EQ(1U, B.getOffset("foo"));133  EXPECT_EQ(5U, B.getOffset("bar"));134  EXPECT_EQ(9U, B.getOffset("fooba"));135}136 137TEST(StringTableBuilderTest, MachO64InOrder) {138  StringTableBuilder B(StringTableBuilder::MachO64);139 140  B.add("foo");141  B.add("bar");142  B.add("f");143 144  B.finalizeInOrder();145 146  std::string Expected;147  Expected += '\x00';148  Expected += "foo";149  Expected += '\x00';150  Expected += "bar";151  Expected += '\x00';152  Expected += "f";153  Expected += '\x00';154 155  // 64 bit Mach-O pads to 8 bytes156  Expected += '\x00';157  Expected += '\x00';158  Expected += '\x00';159  Expected += '\x00';160  Expected += '\x00';161 162  SmallString<64> Data;163  raw_svector_ostream OS(Data);164  B.write(OS);165 166  EXPECT_EQ(Expected, Data);167  EXPECT_EQ(1U, B.getOffset("foo"));168  EXPECT_EQ(5U, B.getOffset("bar"));169  EXPECT_EQ(9U, B.getOffset("f"));170}171 172TEST(StringTableBuilderTest, MachOLinkedInOrder) {173  StringTableBuilder B(StringTableBuilder::MachOLinked);174 175  B.add("foo");176  B.add("bar");177  B.add("foob");178 179  B.finalizeInOrder();180 181  std::string Expected;182  Expected += ' ';183  Expected += '\x00';184  Expected += "foo";185  Expected += '\x00';186  Expected += "bar";187  Expected += '\x00';188  Expected += "foob";189  Expected += '\x00';190 191  // Mach-O pads to 4 bytes192  Expected += '\x00';193 194  SmallString<64> Data;195  raw_svector_ostream OS(Data);196  B.write(OS);197 198  EXPECT_EQ(Expected, Data);199  EXPECT_EQ(2U, B.getOffset("foo"));200  EXPECT_EQ(6U, B.getOffset("bar"));201  EXPECT_EQ(10U, B.getOffset("foob"));202}203 204TEST(StringTableBuilderTest, MachO64LinkedInOrder) {205  StringTableBuilder B(StringTableBuilder::MachO64Linked);206 207  B.add("foo");208  B.add("ba");209  B.add("f");210 211  B.finalizeInOrder();212 213  std::string Expected;214  Expected += ' ';215  Expected += '\x00';216  Expected += "foo";217  Expected += '\x00';218  Expected += "ba";219  Expected += '\x00';220  Expected += "f";221  Expected += '\x00';222 223  // 64 bit Mach-O pads to 8 bytes224  Expected += '\x00';225  Expected += '\x00';226  Expected += '\x00';227  Expected += '\x00';228  Expected += '\x00';229 230  SmallString<64> Data;231  raw_svector_ostream OS(Data);232  B.write(OS);233 234  EXPECT_EQ(Expected, Data);235  EXPECT_EQ(2U, B.getOffset("foo"));236  EXPECT_EQ(6U, B.getOffset("ba"));237  EXPECT_EQ(9U, B.getOffset("f"));238}239}240