|
|
|
|
@@ -48,7 +48,7 @@ using namespace gem5;
|
|
|
|
|
* @return The error string, if any.
|
|
|
|
|
*/
|
|
|
|
|
std::string
|
|
|
|
|
getSymbolError(const Loader::Symbol& symbol, const Loader::Symbol& expected)
|
|
|
|
|
getSymbolError(const loader::Symbol& symbol, const loader::Symbol& expected)
|
|
|
|
|
{
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
|
|
@@ -83,7 +83,7 @@ getSymbolError(const Loader::Symbol& symbol, const Loader::Symbol& expected)
|
|
|
|
|
*/
|
|
|
|
|
::testing::AssertionResult
|
|
|
|
|
checkSymbol(const char* m_symbol, const char* m_expected,
|
|
|
|
|
const Loader::Symbol& symbol, const Loader::Symbol& expected)
|
|
|
|
|
const loader::Symbol& symbol, const loader::Symbol& expected)
|
|
|
|
|
{
|
|
|
|
|
const std::string error = getSymbolError(symbol, expected);
|
|
|
|
|
if (!error.empty()) {
|
|
|
|
|
@@ -101,8 +101,8 @@ checkSymbol(const char* m_symbol, const char* m_expected,
|
|
|
|
|
* @return A GTest's assertion result, with error message on failure.
|
|
|
|
|
*/
|
|
|
|
|
::testing::AssertionResult
|
|
|
|
|
checkTable(const Loader::SymbolTable& symtab,
|
|
|
|
|
const std::initializer_list<Loader::Symbol>& expected)
|
|
|
|
|
checkTable(const loader::SymbolTable& symtab,
|
|
|
|
|
const std::initializer_list<loader::Symbol>& expected)
|
|
|
|
|
{
|
|
|
|
|
if (expected.size() != (symtab.end() - symtab.begin())) {
|
|
|
|
|
return ::testing::AssertionFailure() << "the number of symbols in "
|
|
|
|
|
@@ -126,7 +126,7 @@ checkTable(const Loader::SymbolTable& symtab,
|
|
|
|
|
/** Test that the constructor creates an empty table. */
|
|
|
|
|
TEST(LoaderSymtabTest, EmptyConstruction)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
ASSERT_TRUE(symtab.empty());
|
|
|
|
|
ASSERT_TRUE(checkTable(symtab, {}));
|
|
|
|
|
}
|
|
|
|
|
@@ -134,9 +134,9 @@ TEST(LoaderSymtabTest, EmptyConstruction)
|
|
|
|
|
/** Test that the insertion of a symbol with no name fails. */
|
|
|
|
|
TEST(LoaderSymtabTest, InsertSymbolNoName)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "", 0x10};
|
|
|
|
|
ASSERT_FALSE(symtab.insert(symbol));
|
|
|
|
|
ASSERT_TRUE(checkTable(symtab, {}));
|
|
|
|
|
}
|
|
|
|
|
@@ -144,9 +144,9 @@ TEST(LoaderSymtabTest, InsertSymbolNoName)
|
|
|
|
|
/** Test that the insertion of one symbol in an empty table works. */
|
|
|
|
|
TEST(LoaderSymtabTest, InsertOneSymbol)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
ASSERT_FALSE(symtab.empty());
|
|
|
|
|
@@ -156,12 +156,12 @@ TEST(LoaderSymtabTest, InsertOneSymbol)
|
|
|
|
|
/** Test that the insertion of a symbol with an existing name fails. */
|
|
|
|
|
TEST(LoaderSymtabTest, InsertSymbolExistingName)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
const std::string name = "symbol";
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, name, 0x20},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x20},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
ASSERT_FALSE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -173,12 +173,12 @@ TEST(LoaderSymtabTest, InsertSymbolExistingName)
|
|
|
|
|
/** Test that the insertion of a symbol with an existing address works. */
|
|
|
|
|
TEST(LoaderSymtabTest, InsertSymbolExistingAddress)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
const Addr addr = 0x10;
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", addr},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -190,12 +190,12 @@ TEST(LoaderSymtabTest, InsertSymbolExistingAddress)
|
|
|
|
|
/** Test that the insertion of one symbol in a non-empty table works. */
|
|
|
|
|
TEST(LoaderSymtabTest, InsertMultipleSymbols)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -209,12 +209,12 @@ TEST(LoaderSymtabTest, InsertMultipleSymbols)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, ClearMultiple)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -231,12 +231,12 @@ TEST(LoaderSymtabTest, ClearMultiple)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Offset)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -249,7 +249,7 @@ TEST(LoaderSymtabTest, Offset)
|
|
|
|
|
ASSERT_TRUE(checkTable(symtab, {symbols[0], symbols[1], symbols[2]}));
|
|
|
|
|
|
|
|
|
|
// Check that the new table is offset
|
|
|
|
|
Loader::Symbol expected_symbols[] = {
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name, symbols[0].address + offset},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address + offset},
|
|
|
|
|
{symbols[2].binding, symbols[2].name, symbols[2].address + offset},
|
|
|
|
|
@@ -264,13 +264,13 @@ TEST(LoaderSymtabTest, Offset)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Mask)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x1310},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x2810},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x2920},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol4", 0x3C20},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x1310},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x2810},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x2920},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x3C20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -285,7 +285,7 @@ TEST(LoaderSymtabTest, Mask)
|
|
|
|
|
symbols[3]}));
|
|
|
|
|
|
|
|
|
|
// Check that the new table is masked
|
|
|
|
|
Loader::Symbol expected_symbols[] = {
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name, symbols[0].address & mask},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address & mask},
|
|
|
|
|
{symbols[2].binding, symbols[2].name, symbols[2].address & mask},
|
|
|
|
|
@@ -301,13 +301,13 @@ TEST(LoaderSymtabTest, Mask)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Rename)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -322,7 +322,7 @@ TEST(LoaderSymtabTest, Rename)
|
|
|
|
|
symbols[3]}));
|
|
|
|
|
|
|
|
|
|
// Check that the new table's symbols have been renamed
|
|
|
|
|
Loader::Symbol expected_symbols[] = {
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name + "_suffix", symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].name + "_suffix", symbols[1].address},
|
|
|
|
|
{symbols[2].binding, symbols[2].name + "_suffix", symbols[2].address},
|
|
|
|
|
@@ -338,13 +338,13 @@ TEST(LoaderSymtabTest, Rename)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, RenameNonUnique)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -365,7 +365,7 @@ TEST(LoaderSymtabTest, RenameNonUnique)
|
|
|
|
|
|
|
|
|
|
// Check that the new table's symbols have been renamed, yet it does not
|
|
|
|
|
// contain the symbols with duplicated names
|
|
|
|
|
Loader::Symbol expected_symbols[] = {
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, "NonUniqueName", symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address},
|
|
|
|
|
{symbols[3].binding, symbols[3].name, symbols[3].address},
|
|
|
|
|
@@ -380,14 +380,14 @@ TEST(LoaderSymtabTest, RenameNonUnique)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Globals)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -411,14 +411,14 @@ TEST(LoaderSymtabTest, Globals)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Locals)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -442,14 +442,14 @@ TEST(LoaderSymtabTest, Locals)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, Weaks)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -470,9 +470,9 @@ TEST(LoaderSymtabTest, Weaks)
|
|
|
|
|
/** Test searching for a non-existent address. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindNonExistentAddress)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(symtab.find(0x0), symtab.end());
|
|
|
|
|
@@ -481,12 +481,12 @@ TEST(LoaderSymtabTest, FindNonExistentAddress)
|
|
|
|
|
/** Test searching for a unique address. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindUniqueAddress)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -502,13 +502,13 @@ TEST(LoaderSymtabTest, FindUniqueAddress)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FindNonUniqueAddress)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
const Addr addr = 0x20;
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", addr},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", addr},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -522,9 +522,9 @@ TEST(LoaderSymtabTest, FindNonUniqueAddress)
|
|
|
|
|
/** Test searching for a non-existent name. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindNonExistentName)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.find("symbol2");
|
|
|
|
|
@@ -534,12 +534,12 @@ TEST(LoaderSymtabTest, FindNonExistentName)
|
|
|
|
|
/** Test searching for an existing name. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindExistingName)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -553,11 +553,11 @@ TEST(LoaderSymtabTest, FindExistingName)
|
|
|
|
|
/** Test searching for an existent address using findNearest. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindNearestExact)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -573,9 +573,9 @@ TEST(LoaderSymtabTest, FindNearestExact)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FindNearestRound)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.findNearest(symbol.address + 0x1);
|
|
|
|
|
@@ -590,11 +590,11 @@ TEST(LoaderSymtabTest, FindNearestRound)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FindNearestRoundWithNext)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -613,9 +613,9 @@ TEST(LoaderSymtabTest, FindNearestRoundWithNext)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FindNearestRoundWithNextNonExistent)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
Addr next_addr;
|
|
|
|
|
@@ -631,9 +631,9 @@ TEST(LoaderSymtabTest, FindNearestRoundWithNextNonExistent)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FindNearestNonExistent)
|
|
|
|
|
{
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
Loader::Symbol symbol = {Loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.findNearest(symbol.address - 0x1);
|
|
|
|
|
@@ -647,23 +647,23 @@ TEST(LoaderSymtabTest, FindNearestNonExistent)
|
|
|
|
|
TEST(LoaderSymtabTest, InsertTableConflicting)
|
|
|
|
|
{
|
|
|
|
|
const std::string name = "symbol";
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
// Introduce name conflict
|
|
|
|
|
{Loader::Symbol::Binding::Local, name, 0x50},
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x50},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Populate table 1
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[2]));
|
|
|
|
|
|
|
|
|
|
// Populate table 2
|
|
|
|
|
Loader::SymbolTable symtab2;
|
|
|
|
|
loader::SymbolTable symtab2;
|
|
|
|
|
EXPECT_TRUE(symtab2.insert(symbols[3]));
|
|
|
|
|
EXPECT_TRUE(symtab2.insert(symbols[4]));
|
|
|
|
|
|
|
|
|
|
@@ -681,22 +681,22 @@ TEST(LoaderSymtabTest, InsertTableConflicting)
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, InsertTable)
|
|
|
|
|
{
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol5", 0x50},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol5", 0x50},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Populate table 1
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[2]));
|
|
|
|
|
|
|
|
|
|
// Populate table 2
|
|
|
|
|
Loader::SymbolTable symtab2;
|
|
|
|
|
loader::SymbolTable symtab2;
|
|
|
|
|
EXPECT_TRUE(symtab2.insert(symbols[3]));
|
|
|
|
|
EXPECT_TRUE(symtab2.insert(symbols[4]));
|
|
|
|
|
|
|
|
|
|
@@ -717,11 +717,11 @@ using LoaderSymtabSerializationFixture = SerializationFixture;
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture, Serialization)
|
|
|
|
|
{
|
|
|
|
|
// Populate the table
|
|
|
|
|
Loader::SymbolTable symtab;
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -742,17 +742,17 @@ TEST_F(LoaderSymtabSerializationFixture, Serialization)
|
|
|
|
|
/** Test unserialization. */
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture, Unserialization)
|
|
|
|
|
{
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\ntest.binding_1=1\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
|
|
|
|
|
Loader::SymbolTable unserialized_symtab;
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
Serializable::ScopedCheckpointSection scs(cp, "Section1");
|
|
|
|
|
unserialized_symtab.unserialize("test", cp);
|
|
|
|
|
@@ -770,17 +770,17 @@ TEST_F(LoaderSymtabSerializationFixture, Unserialization)
|
|
|
|
|
*/
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture, UnserializationMissingBinding)
|
|
|
|
|
{
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
|
|
|
|
|
Loader::SymbolTable unserialized_symtab;
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
Serializable::ScopedCheckpointSection scs(cp, "Section1");
|
|
|
|
|
|
|
|
|
|
@@ -800,22 +800,22 @@ TEST_F(LoaderSymtabSerializationFixture, UnserializationMissingBinding)
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture,
|
|
|
|
|
UnserializationMissingBindingChangeDefault)
|
|
|
|
|
{
|
|
|
|
|
Loader::Symbol symbols[] = {
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{Loader::Symbol::Binding::Weak, "symbol2", 0x20},
|
|
|
|
|
{Loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
|
|
|
|
|
Loader::SymbolTable unserialized_symtab;
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
Serializable::ScopedCheckpointSection scs(cp, "Section1");
|
|
|
|
|
|
|
|
|
|
unserialized_symtab.unserialize("test", cp,
|
|
|
|
|
Loader::Symbol::Binding::Weak);
|
|
|
|
|
loader::Symbol::Binding::Weak);
|
|
|
|
|
|
|
|
|
|
// Make sure that the symbols in symtab are present in the
|
|
|
|
|
// unserialized table
|
|
|
|
|
|