summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Object
diff options
context:
space:
mode:
authorKuba Brecka <kuba.brecka@gmail.com>2016-11-15 21:07:03 +0000
committerKuba Brecka <kuba.brecka@gmail.com>2016-11-15 21:07:03 +0000
commita3ccf3ddbd12a0db6522f9990a9e30e535ca76dc (patch)
treea3739b4cd583ecc736fd6e448e123987b1c641f4 /llvm/unittests/Object
parented55a05b010eb62747e19ad179eb8555e28483ac (diff)
downloadbcm5719-llvm-a3ccf3ddbd12a0db6522f9990a9e30e535ca76dc.tar.gz
bcm5719-llvm-a3ccf3ddbd12a0db6522f9990a9e30e535ca76dc.zip
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
Diffstat (limited to 'llvm/unittests/Object')
-rw-r--r--llvm/unittests/Object/CMakeLists.txt8
-rw-r--r--llvm/unittests/Object/SymbolSizeTest.cpp33
2 files changed, 41 insertions, 0 deletions
diff --git a/llvm/unittests/Object/CMakeLists.txt b/llvm/unittests/Object/CMakeLists.txt
new file mode 100644
index 00000000000..7a63c167a30
--- /dev/null
+++ b/llvm/unittests/Object/CMakeLists.txt
@@ -0,0 +1,8 @@
+set(LLVM_LINK_COMPONENTS
+ Object
+ )
+
+add_llvm_unittest(ObjectTests
+ SymbolSizeTest.cpp
+ )
+
diff --git a/llvm/unittests/Object/SymbolSizeTest.cpp b/llvm/unittests/Object/SymbolSizeTest.cpp
new file mode 100644
index 00000000000..ad9c40b986d
--- /dev/null
+++ b/llvm/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<SymEntry> 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);
+ }
+}
OpenPOWER on IntegriCloud