summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcin Koscielnicki <koriakin@0x04.net>2016-04-27 21:24:24 +0000
committerMarcin Koscielnicki <koriakin@0x04.net>2016-04-27 21:24:24 +0000
commit0bec2fef8ee874ef45318b737ab8dd86097e3898 (patch)
tree96b492cfaeaa153a5c0882c4aa5b0412e7c9e0be
parent66f0deacb54ffa4c523ac6565cfcba9260944358 (diff)
downloadbcm5719-llvm-0bec2fef8ee874ef45318b737ab8dd86097e3898.tar.gz
bcm5719-llvm-0bec2fef8ee874ef45318b737ab8dd86097e3898.zip
[MSan] [PowerPC] Dereference function descriptors when recording stack origins.
Differential Revision: http://reviews.llvm.org/D19543 llvm-svn: 267795
-rw-r--r--compiler-rt/lib/msan/msan.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc
index 52eda77e6ba..d2981f0b0ed 100644
--- a/compiler-rt/lib/msan/msan.cc
+++ b/compiler-rt/lib/msan/msan.cc
@@ -538,6 +538,13 @@ void __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc) {
u32 idx = atomic_fetch_add(&NumStackOriginDescrs, 1, memory_order_relaxed);
CHECK_LT(idx, kNumStackOriginDescrs);
StackOriginDescr[idx] = descr + 4;
+#if SANITIZER_PPC64V1
+ // On PowerPC64 ELFv1, the address of a function actually points to a
+ // three-doubleword data structure with the first field containing
+ // the address of the function's code.
+ if (pc)
+ pc = *reinterpret_cast<uptr*>(pc);
+#endif
StackOriginPC[idx] = pc;
id = Origin::CreateStackOrigin(idx).raw_id();
*id_ptr = id;
OpenPOWER on IntegriCloud