Index: include/llvm/Object/SymbolSize.h =================================================================== --- include/llvm/Object/SymbolSize.h +++ include/llvm/Object/SymbolSize.h @@ -15,8 +15,25 @@ namespace llvm { namespace object { + +struct SymEntry { + symbol_iterator I; + uint64_t Address; + unsigned Number; + unsigned SectionID; +}; + +static int compareAddress(const SymEntry *A, const SymEntry *B) { + if (A->SectionID != B->SectionID) + return A->SectionID < B->SectionID ? -1 : 1; + if (A->Address != B->Address) + return A->Address < B->Address ? -1 : 1; + return 0; +} + std::vector> computeSymbolSizes(const ObjectFile &O); + } } // namespace llvm Index: lib/Object/SymbolSize.cpp =================================================================== --- lib/Object/SymbolSize.cpp +++ lib/Object/SymbolSize.cpp @@ -16,21 +16,6 @@ using namespace llvm; using namespace object; -namespace { -struct SymEntry { - symbol_iterator I; - uint64_t Address; - unsigned Number; - unsigned SectionID; -}; -} - -static int compareAddress(const SymEntry *A, const SymEntry *B) { - if (A->SectionID != B->SectionID) - return A->SectionID - B->SectionID; - return A->Address - B->Address; -} - static unsigned getSectionID(const ObjectFile &O, SectionRef Sec) { if (auto *M = dyn_cast(&O)) return M->getSectionID(Sec); Index: unittests/CMakeLists.txt =================================================================== --- unittests/CMakeLists.txt +++ unittests/CMakeLists.txt @@ -21,6 +21,7 @@ add_subdirectory(Linker) add_subdirectory(MC) add_subdirectory(MI) +add_subdirectory(Object) add_subdirectory(ObjectYAML) add_subdirectory(Option) add_subdirectory(ProfileData) Index: unittests/Object/CMakeLists.txt =================================================================== --- unittests/Object/CMakeLists.txt +++ unittests/Object/CMakeLists.txt @@ -0,0 +1,8 @@ +set(LLVM_LINK_COMPONENTS + Object + ) + +add_llvm_unittest(ObjectTests + SymbolSizeTest.cpp + ) + Index: unittests/Object/SymbolSizeTest.cpp =================================================================== --- unittests/Object/SymbolSizeTest.cpp +++ unittests/Object/SymbolSizeTest.cpp @@ -0,0 +1,34 @@ +//===- SymbolSizeTest.cpp - Tests for SymbolSize.cpp ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Object/SymbolSize.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace llvm::object; + +TEST(Object, SymbolSizeSort) { + std::vector Syms; + auto it = symbol_iterator(SymbolRef()); + Syms.push_back(SymEntry{it, 0xffffffff00000000ull, 1, 0}); + Syms.push_back(SymEntry{it, 0x00ffffff00000000ull, 2, 0}); + Syms.push_back(SymEntry{it, 0x00ffffff000000ffull, 3, 0}); + Syms.push_back(SymEntry{it, 0x0000000100000000ull, 4, 0}); + Syms.push_back(SymEntry{it, 0x00000000000000ffull, 5, 0}); + Syms.push_back(SymEntry{it, 0x00000001000000ffull, 6, 0}); + Syms.push_back(SymEntry{it, 0x000000010000ffffull, 7, 0}); + + array_pod_sort(Syms.begin(), Syms.end(), compareAddress); + + for (unsigned I = 0, N = Syms.size(); I < N - 1; ++I) { + EXPECT_LE(Syms[I].Address, Syms[I + 1].Address); + } + + EXPECT_EQ(1, 1); +}