blob: ceba3533a233fc9e85335206275a933b2888b514 [file] [log] [blame]
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +00001//===-- dfsan.h -------------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is a part of DataFlowSanitizer.
11//
12// Private DFSan header.
13//===----------------------------------------------------------------------===//
14
15#ifndef DFSAN_H
16#define DFSAN_H
17
Alexey Samsonovc85d6272013-11-17 09:41:47 +000018#include "sanitizer_common/sanitizer_internal_defs.h"
19
20// Copy declarations from public sanitizer/dfsan_interface.h header here.
21typedef u16 dfsan_label;
22
23struct dfsan_label_info {
24 dfsan_label l1;
25 dfsan_label l2;
26 const char *desc;
27 void *userdata;
28};
29
30extern "C" {
Stephen Hines6a211c52014-07-21 00:49:56 -070031void dfsan_add_label(dfsan_label label, void *addr, uptr size);
Alexey Samsonovc85d6272013-11-17 09:41:47 +000032void dfsan_set_label(dfsan_label label, void *addr, uptr size);
33dfsan_label dfsan_read_label(const void *addr, uptr size);
34dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2);
35} // extern "C"
36
37template <typename T>
38void dfsan_set_label(dfsan_label label, T &data) { // NOLINT
39 dfsan_set_label(label, (void *)&data, sizeof(T));
40}
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000041
42namespace __dfsan {
43
Peter Collingbourne6e4c46d2013-08-15 21:18:53 +000044void InitializeInterceptors();
45
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000046inline dfsan_label *shadow_for(void *ptr) {
Stephen Hines86277eb2015-03-23 12:06:32 -070047#if defined(__x86_64__)
Alexey Samsonovc85d6272013-11-17 09:41:47 +000048 return (dfsan_label *) ((((uptr) ptr) & ~0x700000000000) << 1);
Stephen Hines86277eb2015-03-23 12:06:32 -070049#elif defined(__mips64)
50 return (dfsan_label *) ((((uptr) ptr) & ~0xF000000000) << 1);
51#endif
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000052}
53
54inline const dfsan_label *shadow_for(const void *ptr) {
55 return shadow_for(const_cast<void *>(ptr));
56}
57
Peter Collingbourne78d737c2013-09-10 01:51:35 +000058struct Flags {
Stephen Hines86277eb2015-03-23 12:06:32 -070059#define DFSAN_FLAG(Type, Name, DefaultValue, Description) Type Name;
60#include "dfsan_flags.inc"
61#undef DFSAN_FLAG
62
63 void SetDefaults();
Peter Collingbourne78d737c2013-09-10 01:51:35 +000064};
65
66extern Flags flags_data;
67inline Flags &flags() {
68 return flags_data;
69}
70
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000071} // namespace __dfsan
72
73#endif // DFSAN_H