// Instrumented code may set this value in terms of -dfsan-track-origins.
// * undefined or 0: do not track origins.
// * 1: track origins at memory store operations.
-// * 2: TODO: track origins at memory store operations and callsites.
+// * 2: track origins at memory load and store operations.
+// TODO: track callsites.
extern "C" SANITIZER_WEAK_ATTRIBUTE const int __dfsan_track_origins;
-int __dfsan_get_track_origins() {
+extern "C" SANITIZER_INTERFACE_ATTRIBUTE int dfsan_get_track_origins() {
return &__dfsan_track_origins ? __dfsan_track_origins : 0;
}
internal_memcpy(dst, src, size);
internal_memcpy((void *)shadow_for(dst), (const void *)shadow_for(src),
size * sizeof(dfsan_label));
- if (__dfsan_get_track_origins())
+ if (dfsan_get_track_origins())
dfsan_mem_origin_transfer(dst, src, size);
}
if (0 != label) {
const uptr beg_shadow_addr = (uptr)__dfsan::shadow_for(addr);
WriteShadowWithSize(label, beg_shadow_addr, size);
- if (__dfsan_get_track_origins())
+ if (dfsan_get_track_origins())
SetOrigin(addr, size, origin);
return;
}
- if (__dfsan_get_track_origins())
+ if (dfsan_get_track_origins())
ReleaseOrigins(addr, size);
ReleaseOrClearShadows(addr, size);
SANITIZER_INTERFACE_ATTRIBUTE
void dfsan_set_label(dfsan_label label, void *addr, uptr size) {
dfsan_origin init_origin = 0;
- if (label && __dfsan_get_track_origins()) {
+ if (label && dfsan_get_track_origins()) {
GET_CALLER_PC_BP;
GET_STORE_STACK_TRACE_PC_BP(pc, bp);
init_origin = ChainOrigin(0, &stack, true);
if (0 == label)
return;
- if (__dfsan_get_track_origins()) {
+ if (dfsan_get_track_origins()) {
GET_CALLER_PC_BP;
GET_STORE_STACK_TRACE_PC_BP(pc, bp);
dfsan_origin init_origin = ChainOrigin(0, &stack, true);
bool PrintOriginTraceToStr(const void *addr, const char *description,
InternalScopedString *out) {
CHECK(out);
- CHECK(__dfsan_get_track_origins());
+ CHECK(dfsan_get_track_origins());
Decorator d;
const dfsan_label label = *__dfsan::shadow_for(addr);
extern "C" SANITIZER_INTERFACE_ATTRIBUTE void dfsan_print_origin_trace(
const void *addr, const char *description) {
- if (!__dfsan_get_track_origins()) {
+ if (!dfsan_get_track_origins()) {
PrintNoOriginTrackingWarning();
return;
}
char *out_buf, size_t out_buf_size) {
CHECK(out_buf);
- if (!__dfsan_get_track_origins()) {
+ if (!dfsan_get_track_origins()) {
PrintNoOriginTrackingWarning();
return 0;
}
extern "C" SANITIZER_INTERFACE_ATTRIBUTE dfsan_origin
dfsan_get_init_origin(const void *addr) {
- if (!__dfsan_get_track_origins())
+ if (!dfsan_get_track_origins())
return 0;
const dfsan_label label = *__dfsan::shadow_for(addr);
internal_memset(__dfsan_arg_tls, 0, sizeof(__dfsan_arg_tls));
internal_memset(__dfsan_retval_tls, 0, sizeof(__dfsan_retval_tls));
- if (__dfsan_get_track_origins()) {
+ if (dfsan_get_track_origins()) {
internal_memset(__dfsan_arg_origin_tls, 0, sizeof(__dfsan_arg_origin_tls));
internal_memset(&__dfsan_retval_origin_tls, 0,
sizeof(__dfsan_retval_origin_tls));
CheckASLR();
- InitShadow(__dfsan_get_track_origins());
+ InitShadow(dfsan_get_track_origins());
initialize_interceptors();
; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,CHECK_NO_ORIGIN -DSHADOW_XOR_MASK=87960930222080 --dump-input-context=100
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN -DSHADOW_XOR_MASK=87960930222080 --dump-input-context=100
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN1 -DSHADOW_XOR_MASK=87960930222080 --dump-input-context=100
+; RUN: opt < %s -dfsan -dfsan-track-origins=2 -S | FileCheck %s --check-prefixes=CHECK_ORIGIN2 -DSHADOW_XOR_MASK=87960930222080 --dump-input-context=100
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; CHECK: @__dfsan_arg_origin_tls = external thread_local(initialexec) global [200 x i32]
; CHECK: @__dfsan_retval_origin_tls = external thread_local(initialexec) global i32
; CHECK_NO_ORIGIN: @__dfsan_track_origins = weak_odr constant i32 0
-; CHECK_ORIGIN: @__dfsan_track_origins = weak_odr constant i32 1
+; CHECK_ORIGIN1: @__dfsan_track_origins = weak_odr constant i32 1
+; CHECK_ORIGIN2: @__dfsan_track_origins = weak_odr constant i32 2
; CHECK: @__dfsan_shadow_width_bits = weak_odr constant i32 [[#SBITS:]]
; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]