Fix llvm-symbolizer to correctly sort a symbol array and calculate symbol sizes

Sometimes, llvm-symbolizer gives wrong results due to incorrect sizes of some symbols. The reason for that was an incorrectly sorted array in computeSymbolSizes. The comparison function used subtraction of unsigned types, which is incorrect. Let's change this to return explicit -1 or 1.

Differential Revision: https://reviews.llvm.org/D26537

llvm-svn: 287028
This commit is contained in:
Kuba Brecka
2016-11-15 21:07:03 +00:00
parent ed55a05b01
commit a3ccf3ddbd
5 changed files with 59 additions and 12 deletions

View File

@@ -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) {