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