summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2013-08-13 22:15:40 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2013-08-13 22:15:40 +0000
commit7da504faa497cb04c4fa5682495fa1f1f9da3e6f (patch)
tree026aea4f6330774926c719a2f1855ec1fbfe6634 /compiler-rt/lib
parent04632f1f1643b38c32e1c5a9ffb1d8e87201ca3b (diff)
downloadbcm5719-llvm-7da504faa497cb04c4fa5682495fa1f1f9da3e6f.tar.gz
bcm5719-llvm-7da504faa497cb04c4fa5682495fa1f1f9da3e6f.zip
[dfsan] Introduce dfsan_read_label runtime function.
Differential Revision: http://llvm-reviews.chandlerc.com/D1349 llvm-svn: 188319
Diffstat (limited to 'compiler-rt/lib')
-rw-r--r--compiler-rt/lib/dfsan/dfsan.cc9
-rw-r--r--compiler-rt/lib/dfsan/lit_tests/basic.c3
-rw-r--r--compiler-rt/lib/dfsan/lit_tests/propagate.c3
3 files changed, 14 insertions, 1 deletions
diff --git a/compiler-rt/lib/dfsan/dfsan.cc b/compiler-rt/lib/dfsan/dfsan.cc
index c8b0e6851ec..ba8e8b5112e 100644
--- a/compiler-rt/lib/dfsan/dfsan.cc
+++ b/compiler-rt/lib/dfsan/dfsan.cc
@@ -120,7 +120,7 @@ dfsan_label __dfsan_union(dfsan_label l1, dfsan_label l2) {
}
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
-dfsan_label __dfsan_union_load(dfsan_label *ls, size_t n) {
+dfsan_label __dfsan_union_load(const dfsan_label *ls, size_t n) {
dfsan_label label = ls[0];
for (size_t i = 1; i != n; ++i) {
dfsan_label next_label = ls[i];
@@ -171,6 +171,13 @@ SANITIZER_INTERFACE_ATTRIBUTE dfsan_label dfsan_get_label(long data) {
return __dfsan_arg_tls[0];
}
+SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
+dfsan_read_label(const void *addr, size_t size) {
+ if (size == 0)
+ return 0;
+ return __dfsan_union_load(shadow_for(addr), size);
+}
+
SANITIZER_INTERFACE_ATTRIBUTE
const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label) {
__dfsan_retval_tls = 0; // Ensures return value is unlabelled in the caller.
diff --git a/compiler-rt/lib/dfsan/lit_tests/basic.c b/compiler-rt/lib/dfsan/lit_tests/basic.c
index db1acb71208..de11bd186e9 100644
--- a/compiler-rt/lib/dfsan/lit_tests/basic.c
+++ b/compiler-rt/lib/dfsan/lit_tests/basic.c
@@ -13,5 +13,8 @@ int main(void) {
dfsan_label new_label = dfsan_get_label(i);
assert(i_label == new_label);
+ dfsan_label read_label = dfsan_read_label(&i, sizeof(i));
+ assert(i_label == read_label);
+
return 0;
}
diff --git a/compiler-rt/lib/dfsan/lit_tests/propagate.c b/compiler-rt/lib/dfsan/lit_tests/propagate.c
index d78c9ae0b33..31b65ee72a4 100644
--- a/compiler-rt/lib/dfsan/lit_tests/propagate.c
+++ b/compiler-rt/lib/dfsan/lit_tests/propagate.c
@@ -34,5 +34,8 @@ int main(void) {
assert(dfsan_has_label(ijk_label, j_label));
assert(dfsan_has_label(ijk_label, k_label));
+ struct { int i, j; } s = { i, j };
+ assert(dfsan_read_label(&s, sizeof(s)) == ij_label);
+
return 0;
}
OpenPOWER on IntegriCloud