• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- NamePoolTest.cpp ---------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #include "NamePoolTest.h"
10 #include <mcld/LD/NamePool.h>
11 #include <mcld/LD/Resolver.h>
12 #include <mcld/LD/StaticResolver.h>
13 #include <mcld/LD/ResolveInfo.h>
14 #include <mcld/LD/LDSymbol.h>
15 #include <llvm/ADT/StringRef.h>
16 #include <string>
17 #include <cstdio>
18 
19 using namespace mcld;
20 using namespace mcldtest;
21 
22 
23 // Constructor can do set-up work for all test here.
NamePoolTest()24 NamePoolTest::NamePoolTest()
25 {
26   // create testee. modify it if need
27   StaticResolver resolver;
28   m_pTestee = new NamePool(resolver, 10);
29 }
30 
31 // Destructor can do clean-up work that doesn't throw exceptions here.
~NamePoolTest()32 NamePoolTest::~NamePoolTest()
33 {
34   delete m_pTestee;
35 }
36 
37 // SetUp() will be called immediately before each test.
SetUp()38 void NamePoolTest::SetUp()
39 {
40 }
41 
42 // TearDown() will be called immediately after each test.
TearDown()43 void NamePoolTest::TearDown()
44 {
45 }
46 
47 //==========================================================================//
48 // Testcases
49 //
50 
51 
TEST_F(NamePoolTest,insertString)52 TEST_F( NamePoolTest, insertString ) {
53   const char *s1 = "Hello MCLinker";
54   llvm::StringRef result1 = m_pTestee->insertString(s1);
55   EXPECT_NE(s1, result1.data());
56   EXPECT_STREQ(s1, result1.data());
57 }
58 
TEST_F(NamePoolTest,insertSameString)59 TEST_F( NamePoolTest, insertSameString ) {
60   const char *s1 = "Hello MCLinker";
61   std::string s2(s1);
62   llvm::StringRef result1 = m_pTestee->insertString(s1);
63   llvm::StringRef result2 = m_pTestee->insertString(s2.c_str());
64   EXPECT_STREQ(s1, result1.data());
65   EXPECT_STREQ(s2.c_str(), result2.data());
66   EXPECT_EQ(result1.data(), result2.data());
67 }
68 
TEST_F(NamePoolTest,insert_local_defined_Symbol)69 TEST_F( NamePoolTest, insert_local_defined_Symbol ) {
70   const char *name = "Hello MCLinker";
71   bool isDyn = false;
72   ResolveInfo::Type type = ResolveInfo::Function;
73   ResolveInfo::Desc desc = ResolveInfo::Define;
74   ResolveInfo::Binding binding = ResolveInfo::Local;
75   uint64_t value = 0;
76   uint64_t size = 0;
77   ResolveInfo::Visibility other = ResolveInfo::Default;
78   Resolver::Result result1;
79   m_pTestee->insertSymbol(name,
80                           isDyn,
81                           type,
82                           desc,
83                           binding,
84                           size,
85                           other,
86                           NULL,
87                           result1);
88 
89   EXPECT_NE(name, result1.info->name());
90   EXPECT_STREQ(name, result1.info->name());
91   EXPECT_EQ(isDyn, result1.info->isDyn());
92   EXPECT_EQ(type, result1.info->type());
93   EXPECT_EQ(desc, result1.info->desc());
94   EXPECT_EQ(binding, result1.info->binding());
95   EXPECT_EQ(size, result1.info->size());
96   EXPECT_EQ(other, result1.info->visibility());
97 
98   Resolver::Result result2;
99   m_pTestee->insertSymbol(name,
100                           isDyn,
101                           type,
102                           desc,
103                           binding,
104                           size,
105                           other,
106                           NULL,
107                           result2);
108 
109   EXPECT_NE(name, result1.info->name());
110   EXPECT_STREQ(name, result1.info->name());
111   EXPECT_EQ(isDyn, result1.info->isDyn());
112   EXPECT_EQ(type, result1.info->type());
113   EXPECT_EQ(desc, result1.info->desc());
114   EXPECT_EQ(binding, result1.info->binding());
115   EXPECT_EQ(size, result1.info->size());
116   EXPECT_EQ(other, result1.info->visibility());
117 
118   EXPECT_NE(result1.existent, result2.existent);
119 }
120 
TEST_F(NamePoolTest,insert_global_reference_Symbol)121 TEST_F( NamePoolTest, insert_global_reference_Symbol ) {
122   const char *name = "Hello MCLinker";
123   bool isDyn = false;
124   ResolveInfo::Type type = ResolveInfo::NoType;
125   ResolveInfo::Desc desc = ResolveInfo::Undefined;
126   ResolveInfo::Binding binding = ResolveInfo::Global;
127   uint64_t size = 0;
128   ResolveInfo::Visibility other = ResolveInfo::Default;
129   Resolver::Result result1;
130   m_pTestee->insertSymbol(name,
131                           isDyn,
132                           type,
133                           desc,
134                           binding,
135                           size,
136                           other,
137                           NULL,
138                           result1);
139 
140   EXPECT_NE(name, result1.info->name());
141   EXPECT_STREQ(name, result1.info->name());
142   EXPECT_EQ(isDyn, result1.info->isDyn());
143   EXPECT_EQ(type, result1.info->type());
144   EXPECT_EQ(desc, result1.info->desc());
145   EXPECT_EQ(binding, result1.info->binding());
146   EXPECT_EQ(size, result1.info->size());
147   EXPECT_EQ(other, result1.info->visibility());
148 
149   Resolver::Result result2;
150   m_pTestee->insertSymbol(name,
151                           isDyn,
152                           type,
153                           desc,
154                           binding,
155                           size,
156                           other,
157                           NULL,
158                           result2);
159 
160   EXPECT_EQ(result1.info, result2.info);
161 
162   Resolver::Result result3;
163   m_pTestee->insertSymbol("Different Symbol",
164                           isDyn,
165                           type,
166                           desc,
167                           binding,
168                           size,
169                           other,
170                           NULL,
171                           result3);
172 
173 
174   EXPECT_NE(result1.info, result3.info);
175 }
176 
177 
TEST_F(NamePoolTest,insertSymbol_after_insert_same_string)178 TEST_F( NamePoolTest, insertSymbol_after_insert_same_string ) {
179   const char *name = "Hello MCLinker";
180   bool isDyn = false;
181   LDSymbol::Type type = LDSymbol::Defined;
182   LDSymbol::Binding binding = LDSymbol::Global;
183   const llvm::MCSectionData *section = 0;
184   uint64_t value = 0;
185   uint64_t size = 0;
186   uint8_t other = 0;
187 
188   const char *result1 =  m_pTestee->insertString(name);
189   LDSymbol *sym =  m_pTestee->insertSymbol(name,
190                                            isDyn,
191                                            type,
192                                            binding,
193                                            section,
194                                            value,
195                                            size,
196                                            other);
197 
198   EXPECT_STREQ(name, sym->name());
199   EXPECT_EQ(result1, sym->name());
200 
201   char s[16];
202   strcpy(s, result1);
203   const char *result2 = m_pTestee->insertString(result1);
204   const char *result3 = m_pTestee->insertString(s);
205 
206   EXPECT_EQ(result1, result2);
207   EXPECT_EQ(result1, result3);
208 }
209 
210 
TEST_F(NamePoolTest,insert_16384_weak_reference_symbols)211 TEST_F( NamePoolTest, insert_16384_weak_reference_symbols ) {
212   char name[16];
213   bool isDyn = false;
214   LDSymbol::Type type = LDSymbol::Reference;
215   LDSymbol::Binding binding = LDSymbol::Weak;
216   const llvm::MCSectionData *section = 0;
217   uint64_t value = 0;
218   uint64_t size = 0;
219   uint8_t other = 0;
220   strcpy(name, "Hello MCLinker");
221   LDSymbol *syms[128][128];
222   for(int i=0; i<128 ;++i) {
223     name[0] = i;
224     for(int j=0; j<128 ;++j) {
225       name[1] = j;
226       syms[i][j] =  m_pTestee->insertSymbol(name,
227                                             isDyn,
228                                             type,
229                                             binding,
230                                             section,
231                                             value,
232                                             size,
233                                             other);
234 
235       ASSERT_STREQ(name, syms[i][j]->name());
236     }
237   }
238   for(int i=127; i>=0 ;--i) {
239     name[0] = i;
240     for(int j=0; j<128 ;++j) {
241       name[1] = j;
242       LDSymbol *sym =  m_pTestee->insertSymbol(name,
243                                                isDyn,
244                                                type,
245                                                binding,
246                                                section,
247                                                value,
248                                                size,
249                                                other);
250       ASSERT_EQ(sym, syms[i][j]);
251     }
252   }
253   for(int i=0; i<128 ;++i) {
254     name[0] = i;
255     for(int j=0; j<128 ;++j) {
256       name[1] = j;
257       LDSymbol *sym =  m_pTestee->insertSymbol(name,
258                                                isDyn,
259                                                type,
260                                                binding,
261                                                section,
262                                                value,
263                                                size,
264                                                other);
265       ASSERT_EQ(sym, syms[i][j]);
266     }
267   }
268 }
269