forked from OSchip/llvm-project
[DFSan] Don't include public headers in dfsan runtime code
Summary: Definitions we use in public sanitizer headers may slightly conflict with the ones we use in private sanitizer runtimes. Moreover, we generally forbid to include any system headers (like <stdint.h>) in sanitizer runtime headers. This leads to inevitable duplication of selected interface function declarations, but we decided to live with it. Reviewers: pcc Reviewed By: pcc CC: kcc, llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D2179 llvm-svn: 194955
This commit is contained in:
parent
9e49704f59
commit
4985d5274a
|
|
@ -212,8 +212,6 @@ endif()
|
||||||
filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH
|
filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH
|
||||||
x86_64 i386 powerpc64)
|
x86_64 i386 powerpc64)
|
||||||
|
|
||||||
# Add the public header's directory to the includes for all of compiler-rt.
|
|
||||||
include_directories(include)
|
|
||||||
add_subdirectory(include)
|
add_subdirectory(include)
|
||||||
|
|
||||||
set(SANITIZER_COMMON_LIT_TEST_DEPS
|
set(SANITIZER_COMMON_LIT_TEST_DEPS
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
// prefixed __dfsan_.
|
// prefixed __dfsan_.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "sanitizer/dfsan_interface.h"
|
|
||||||
#include "sanitizer_common/sanitizer_atomic.h"
|
#include "sanitizer_common/sanitizer_atomic.h"
|
||||||
#include "sanitizer_common/sanitizer_common.h"
|
#include "sanitizer_common/sanitizer_common.h"
|
||||||
#include "sanitizer_common/sanitizer_flags.h"
|
#include "sanitizer_common/sanitizer_flags.h"
|
||||||
|
|
@ -123,9 +122,9 @@ dfsan_label __dfsan_union(dfsan_label l1, dfsan_label l2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
|
||||||
dfsan_label __dfsan_union_load(const dfsan_label *ls, size_t n) {
|
dfsan_label __dfsan_union_load(const dfsan_label *ls, uptr n) {
|
||||||
dfsan_label label = ls[0];
|
dfsan_label label = ls[0];
|
||||||
for (size_t i = 1; i != n; ++i) {
|
for (uptr i = 1; i != n; ++i) {
|
||||||
dfsan_label next_label = ls[i];
|
dfsan_label next_label = ls[i];
|
||||||
if (label != next_label)
|
if (label != next_label)
|
||||||
label = __dfsan_union(label, next_label);
|
label = __dfsan_union(label, next_label);
|
||||||
|
|
@ -157,7 +156,7 @@ dfsan_union(dfsan_label l1, dfsan_label l2) {
|
||||||
return __dfsan_union(l1, l2);
|
return __dfsan_union(l1, l2);
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
|
||||||
dfsan_label dfsan_create_label(const char *desc, void *userdata) {
|
dfsan_label dfsan_create_label(const char *desc, void *userdata) {
|
||||||
dfsan_label label =
|
dfsan_label label =
|
||||||
atomic_fetch_add(&__dfsan_last_label, 1, memory_order_relaxed) + 1;
|
atomic_fetch_add(&__dfsan_last_label, 1, memory_order_relaxed) + 1;
|
||||||
|
|
@ -169,18 +168,18 @@ dfsan_label dfsan_create_label(const char *desc, void *userdata) {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
|
||||||
void __dfsan_set_label(dfsan_label label, void *addr, size_t size) {
|
void __dfsan_set_label(dfsan_label label, void *addr, uptr size) {
|
||||||
for (dfsan_label *labelp = shadow_for(addr); size != 0; --size, ++labelp)
|
for (dfsan_label *labelp = shadow_for(addr); size != 0; --size, ++labelp)
|
||||||
*labelp = label;
|
*labelp = label;
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE
|
SANITIZER_INTERFACE_ATTRIBUTE
|
||||||
void dfsan_set_label(dfsan_label label, void *addr, size_t size) {
|
void dfsan_set_label(dfsan_label label, void *addr, uptr size) {
|
||||||
__dfsan_set_label(label, addr, size);
|
__dfsan_set_label(label, addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE
|
SANITIZER_INTERFACE_ATTRIBUTE
|
||||||
void dfsan_add_label(dfsan_label label, void *addr, size_t size) {
|
void dfsan_add_label(dfsan_label label, void *addr, uptr size) {
|
||||||
for (dfsan_label *labelp = shadow_for(addr); size != 0; --size, ++labelp)
|
for (dfsan_label *labelp = shadow_for(addr); size != 0; --size, ++labelp)
|
||||||
if (*labelp != label)
|
if (*labelp != label)
|
||||||
*labelp = __dfsan_union(*labelp, label);
|
*labelp = __dfsan_union(*labelp, label);
|
||||||
|
|
@ -197,7 +196,7 @@ __dfsw_dfsan_get_label(long data, dfsan_label data_label,
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
|
SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
|
||||||
dfsan_read_label(const void *addr, size_t size) {
|
dfsan_read_label(const void *addr, uptr size) {
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return __dfsan_union_load(shadow_for(addr), size);
|
return __dfsan_union_load(shadow_for(addr), size);
|
||||||
|
|
@ -208,7 +207,8 @@ const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label) {
|
||||||
return &__dfsan_label_info[label];
|
return &__dfsan_label_info[label];
|
||||||
}
|
}
|
||||||
|
|
||||||
int dfsan_has_label(dfsan_label label, dfsan_label elem) {
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE int
|
||||||
|
dfsan_has_label(dfsan_label label, dfsan_label elem) {
|
||||||
if (label == elem)
|
if (label == elem)
|
||||||
return true;
|
return true;
|
||||||
const dfsan_label_info *info = dfsan_get_label_info(label);
|
const dfsan_label_info *info = dfsan_get_label_info(label);
|
||||||
|
|
@ -219,7 +219,8 @@ int dfsan_has_label(dfsan_label label, dfsan_label elem) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dfsan_label dfsan_has_label_with_desc(dfsan_label label, const char *desc) {
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
|
||||||
|
dfsan_has_label_with_desc(dfsan_label label, const char *desc) {
|
||||||
const dfsan_label_info *info = dfsan_get_label_info(label);
|
const dfsan_label_info *info = dfsan_get_label_info(label);
|
||||||
if (info->l1 != 0) {
|
if (info->l1 != 0) {
|
||||||
return dfsan_has_label_with_desc(info->l1, desc) ||
|
return dfsan_has_label_with_desc(info->l1, desc) ||
|
||||||
|
|
|
||||||
|
|
@ -15,14 +15,35 @@
|
||||||
#ifndef DFSAN_H
|
#ifndef DFSAN_H
|
||||||
#define DFSAN_H
|
#define DFSAN_H
|
||||||
|
|
||||||
#include "sanitizer/dfsan_interface.h"
|
#include "sanitizer_common/sanitizer_internal_defs.h"
|
||||||
|
|
||||||
|
// Copy declarations from public sanitizer/dfsan_interface.h header here.
|
||||||
|
typedef u16 dfsan_label;
|
||||||
|
|
||||||
|
struct dfsan_label_info {
|
||||||
|
dfsan_label l1;
|
||||||
|
dfsan_label l2;
|
||||||
|
const char *desc;
|
||||||
|
void *userdata;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void dfsan_set_label(dfsan_label label, void *addr, uptr size);
|
||||||
|
dfsan_label dfsan_read_label(const void *addr, uptr size);
|
||||||
|
dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2);
|
||||||
|
} // extern "C"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void dfsan_set_label(dfsan_label label, T &data) { // NOLINT
|
||||||
|
dfsan_set_label(label, (void *)&data, sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
namespace __dfsan {
|
namespace __dfsan {
|
||||||
|
|
||||||
void InitializeInterceptors();
|
void InitializeInterceptors();
|
||||||
|
|
||||||
inline dfsan_label *shadow_for(void *ptr) {
|
inline dfsan_label *shadow_for(void *ptr) {
|
||||||
return (dfsan_label *) ((((uintptr_t) ptr) & ~0x700000000000) << 1);
|
return (dfsan_label *) ((((uptr) ptr) & ~0x700000000000) << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const dfsan_label *shadow_for(const void *ptr) {
|
inline const dfsan_label *shadow_for(const void *ptr) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@
|
||||||
//
|
//
|
||||||
// This file defines the custom functions listed in done_abilist.txt.
|
// This file defines the custom functions listed in done_abilist.txt.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
#include "sanitizer/dfsan_interface.h"
|
|
||||||
#include "sanitizer_common/sanitizer_internal_defs.h"
|
#include "sanitizer_common/sanitizer_internal_defs.h"
|
||||||
#include "sanitizer_common/sanitizer_linux.h"
|
#include "sanitizer_common/sanitizer_linux.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
// Interceptors for standard library functions.
|
// Interceptors for standard library functions.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "sanitizer/dfsan_interface.h"
|
#include "dfsan/dfsan.h"
|
||||||
#include "interception/interception.h"
|
#include "interception/interception.h"
|
||||||
#include "sanitizer_common/sanitizer_common.h"
|
#include "sanitizer_common/sanitizer_common.h"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue