1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- NamePoolTest.cpp ---------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "NamePoolTest.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/NamePool.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Resolver.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/StaticResolver.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h"
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <string>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstdio>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld;
20affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcldtest;
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Constructor can do set-up work for all test here.
2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesNamePoolTest::NamePoolTest() {
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // create testee. modify it if need
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StaticResolver resolver;
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_pTestee = new NamePool(resolver, 10);
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Destructor can do clean-up work that doesn't throw exceptions here.
3037b74a387bb3993387029859c2d9d051c41c724eStephen HinesNamePoolTest::~NamePoolTest() {
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  delete m_pTestee;
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// SetUp() will be called immediately before each test.
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid NamePoolTest::SetUp() {
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// TearDown() will be called immediately after each test.
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid NamePoolTest::TearDown() {
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//==========================================================================//
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Testcases
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4637b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insertString) {
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* s1 = "Hello MCLinker";
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef result1 = m_pTestee->insertString(s1);
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(s1, result1.data());
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(s1, result1.data());
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insertSameString) {
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* s1 = "Hello MCLinker";
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  std::string s2(s1);
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef result1 = m_pTestee->insertString(s1);
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef result2 = m_pTestee->insertString(s2.c_str());
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(s1, result1.data());
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(s2.c_str(), result2.data());
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(result1.data(), result2.data());
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insert_local_defined_Symbol) {
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* name = "Hello MCLinker";
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isDyn = false;
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Type type = ResolveInfo::Function;
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Desc desc = ResolveInfo::Define;
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Binding binding = ResolveInfo::Local;
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t value = 0;
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t size = 0;
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Visibility other = ResolveInfo::Default;
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Resolver::Result result1;
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pTestee->insertSymbol(
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      name, isDyn, type, desc, binding, size, other, NULL, result1);
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(name, result1.info->name());
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(name, result1.info->name());
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(isDyn, result1.info->isDyn());
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(type, result1.info->type());
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(desc, result1.info->desc());
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(binding, result1.info->binding());
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(size, result1.info->size());
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(other, result1.info->visibility());
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Resolver::Result result2;
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pTestee->insertSymbol(
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      name, isDyn, type, desc, binding, size, other, NULL, result2);
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(name, result1.info->name());
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(name, result1.info->name());
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(isDyn, result1.info->isDyn());
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(type, result1.info->type());
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(desc, result1.info->desc());
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(binding, result1.info->binding());
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(size, result1.info->size());
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(other, result1.info->visibility());
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(result1.existent, result2.existent);
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10137b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insert_global_reference_Symbol) {
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* name = "Hello MCLinker";
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isDyn = false;
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Type type = ResolveInfo::NoType;
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Desc desc = ResolveInfo::Undefined;
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Binding binding = ResolveInfo::Global;
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t size = 0;
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ResolveInfo::Visibility other = ResolveInfo::Default;
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Resolver::Result result1;
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pTestee->insertSymbol(
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      name, isDyn, type, desc, binding, size, other, NULL, result1);
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(name, result1.info->name());
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(name, result1.info->name());
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(isDyn, result1.info->isDyn());
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(type, result1.info->type());
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(desc, result1.info->desc());
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(binding, result1.info->binding());
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(size, result1.info->size());
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(other, result1.info->visibility());
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Resolver::Result result2;
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pTestee->insertSymbol(
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      name, isDyn, type, desc, binding, size, other, NULL, result2);
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(result1.info, result2.info);
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Resolver::Result result3;
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_pTestee->insertSymbol("Different Symbol",
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          isDyn,
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          type,
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          desc,
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          binding,
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          size,
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          other,
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          NULL,
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          result3);
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_NE(result1.info, result3.info);
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14237b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insertSymbol_after_insert_same_string) {
14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* name = "Hello MCLinker";
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isDyn = false;
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol::Type type = LDSymbol::Defined;
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol::Binding binding = LDSymbol::Global;
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const llvm::MCSectionData* section = 0;
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t value = 0;
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t size = 0;
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint8_t other = 0;
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* result1 = m_pTestee->insertString(name);
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSymbol* sym = m_pTestee->insertSymbol(
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      name, isDyn, type, binding, section, value, size, other);
155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_STREQ(name, sym->name());
157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(result1, sym->name());
158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
159affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  char s[16];
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  strcpy(s, result1);
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* result2 = m_pTestee->insertString(result1);
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* result3 = m_pTestee->insertString(s);
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(result1, result2);
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EXPECT_EQ(result1, result3);
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
16837b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(NamePoolTest, insert_16384_weak_reference_symbols) {
169affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  char name[16];
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isDyn = false;
171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol::Type type = LDSymbol::Reference;
172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSymbol::Binding binding = LDSymbol::Weak;
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const llvm::MCSectionData* section = 0;
174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t value = 0;
175affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint64_t size = 0;
176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint8_t other = 0;
177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  strcpy(name, "Hello MCLinker");
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSymbol* syms[128][128];
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 128; ++i) {
180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    name[0] = i;
18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    for (int j = 0; j < 128; ++j) {
182affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      name[1] = j;
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      syms[i][j] = m_pTestee->insertSymbol(
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hines          name, isDyn, type, binding, section, value, size, other);
185affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      ASSERT_STREQ(name, syms[i][j]->name());
187affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
188affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 127; i >= 0; --i) {
190affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    name[0] = i;
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    for (int j = 0; j < 128; ++j) {
192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      name[1] = j;
19337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDSymbol* sym = m_pTestee->insertSymbol(
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines          name, isDyn, type, binding, section, value, size, other);
195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      ASSERT_EQ(sym, syms[i][j]);
196affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
197affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
19837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 128; ++i) {
199affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    name[0] = i;
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    for (int j = 0; j < 128; ++j) {
201affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      name[1] = j;
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDSymbol* sym = m_pTestee->insertSymbol(
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          name, isDyn, type, binding, section, value, size, other);
204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      ASSERT_EQ(sym, syms[i][j]);
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    }
206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
207affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
208