Index: llvm/trunk/include/llvm/Object/SymbolSize.h =================================================================== --- llvm/trunk/include/llvm/Object/SymbolSize.h +++ llvm/trunk/include/llvm/Object/SymbolSize.h @@ -15,8 +15,19 @@ namespace llvm { namespace object { + +struct SymEntry { + symbol_iterator I; + uint64_t Address; + unsigned Number; + unsigned SectionID; +}; + +int compareAddress(const SymEntry *A, const SymEntry *B); + std::vector> computeSymbolSizes(const ObjectFile &O); + } } // namespace llvm Index: llvm/trunk/lib/Object/SymbolSize.cpp =================================================================== --- llvm/trunk/lib/Object/SymbolSize.cpp +++ llvm/trunk/lib/Object/SymbolSize.cpp @@ -16,19 +16,13 @@ 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) { +// Orders increasingly by (SectionID, Address). +int llvm::object::compareAddress(const SymEntry *A, const SymEntry *B) { if (A->SectionID != B->SectionID) - return A->SectionID - B->SectionID; - return A->Address - B->Address; + return A->SectionID < B->SectionID ? -1 : 1; + if (A->Address != B->Address) + return A->Address < B->Address ? -1 : 1; + return 0; } static unsigned getSectionID(const ObjectFile &O, SectionRef Sec) { Index: llvm/trunk/unittests/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/CMakeLists.txt +++ llvm/trunk/unittests/CMakeLists.txt @@ -17,6 +17,7 @@ add_subdirectory(Linker) add_subdirectory(MC) add_subdirectory(MI) +add_subdirectory(Object) add_subdirectory(ObjectYAML) add_subdirectory(Option) add_subdirectory(ProfileData) Index: llvm/trunk/unittests/Object/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/Object/CMakeLists.txt +++ llvm/trunk/unittests/Object/CMakeLists.txt @@ -0,0 +1,8 @@ +set(LLVM_LINK_COMPONENTS + Object + ) + +add_llvm_unittest(ObjectTests + SymbolSizeTest.cpp + ) + Index: llvm/trunk/unittests/Object/SymbolSizeTest.cpp =================================================================== --- llvm/trunk/unittests/Object/SymbolSizeTest.cpp +++ llvm/trunk/unittests/Object/SymbolSizeTest.cpp @@ -0,0 +1,33 @@ +//===- 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) { + auto it = symbol_iterator(SymbolRef()); + std::vector Syms{ + SymEntry{it, 0xffffffff00000000ull, 1, 0}, + SymEntry{it, 0x00ffffff00000000ull, 2, 0}, + SymEntry{it, 0x00ffffff000000ffull, 3, 0}, + SymEntry{it, 0x0000000100000000ull, 4, 0}, + SymEntry{it, 0x00000000000000ffull, 5, 0}, + SymEntry{it, 0x00000001000000ffull, 6, 0}, + 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); + } +}