Skip to content

Commit

Permalink
Experimantal dfsan mode "fast16labels=1"
Browse files Browse the repository at this point in the history
Summary:
dfsan mode "fast16labels=1".
In this mode the labels are treated as 16-bit bit masks.

Reviewers: pcc

Reviewed By: pcc

Subscribers: delcypher, #sanitizers, llvm-commits

Tags: #llvm, #sanitizers

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

llvm-svn: 362859
  • Loading branch information
kcc committed Jun 8, 2019
1 parent 829037a commit 300c0c7
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler-rt/lib/dfsan/dfsan.cc
Expand Up @@ -162,6 +162,8 @@ static void dfsan_check_label(dfsan_label label) {
// this function (the instrumentation pass inlines the equality test).
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
dfsan_label __dfsan_union(dfsan_label l1, dfsan_label l2) {
if (flags().fast16labels)
return l1 | l2;
DCHECK_NE(l1, l2);

if (l1 == 0)
Expand Down
4 changes: 4 additions & 0 deletions compiler-rt/lib/dfsan/dfsan_flags.inc
Expand Up @@ -29,3 +29,7 @@ DFSAN_FLAG(
DFSAN_FLAG(const char *, dump_labels_at_exit, "", "The path of the file where "
"to dump the labels when the "
"program terminates.")
DFSAN_FLAG(bool, fast16labels, false,
"Enables experimental mode where DFSan supports only 16 power-of-2 labels "
"(1, 2, 4, 8, ... 32768) and the label union is computed as a bit-wise OR."
)
25 changes: 25 additions & 0 deletions compiler-rt/test/dfsan/fast16labels.c
@@ -0,0 +1,25 @@
// RUN: %clang_dfsan %s -o %t && DFSAN_OPTIONS=fast16labels=1 %run %t
//
// Tests DFSAN_OPTIONS=fast16labels=1
//
#include <sanitizer/dfsan_interface.h>

#include <assert.h>
#include <stdio.h>

int foo(int a, int b) {
return a + b;
}

int main() {
int a = 10;
int b = 20;
dfsan_set_label(8, &a, sizeof(a));
dfsan_set_label(512, &b, sizeof(b));
int c = foo(a, b);
printf("A: 0x%x\n", dfsan_get_label(a));
printf("B: 0x%x\n", dfsan_get_label(b));
dfsan_label l = dfsan_get_label(c);
printf("C: 0x%x\n", l);
assert(l == 520); // OR of the other two labels.
}

0 comments on commit 300c0c7

Please sign in to comment.