blob: d662391216e4bd75b7341277290351214f24b38b [file] [log] [blame]
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +00001//===-- dfsan.h -------------------------------------------------*- C++ -*-===//
2//
Chandler Carruth58d43602019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of DataFlowSanitizer.
10//
11// Private DFSan header.
12//===----------------------------------------------------------------------===//
13
14#ifndef DFSAN_H
15#define DFSAN_H
16
Alexey Samsonovc85d6272013-11-17 09:41:47 +000017#include "sanitizer_common/sanitizer_internal_defs.h"
Adhemerval Zanellaa0a280e2015-11-27 12:43:33 +000018#include "dfsan_platform.h"
Alexey Samsonovc85d6272013-11-17 09:41:47 +000019
Anna Zaks074767b2016-09-15 21:02:18 +000020using __sanitizer::uptr;
21using __sanitizer::u16;
22
Alexey Samsonovc85d6272013-11-17 09:41:47 +000023// Copy declarations from public sanitizer/dfsan_interface.h header here.
24typedef u16 dfsan_label;
25
26struct dfsan_label_info {
27 dfsan_label l1;
28 dfsan_label l2;
29 const char *desc;
30 void *userdata;
31};
32
33extern "C" {
Peter Collingbourne28015232014-06-04 17:54:51 +000034void dfsan_add_label(dfsan_label label, void *addr, uptr size);
Alexey Samsonovc85d6272013-11-17 09:41:47 +000035void dfsan_set_label(dfsan_label label, void *addr, uptr size);
36dfsan_label dfsan_read_label(const void *addr, uptr size);
37dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2);
38} // extern "C"
39
40template <typename T>
41void dfsan_set_label(dfsan_label label, T &data) { // NOLINT
42 dfsan_set_label(label, (void *)&data, sizeof(T));
43}
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000044
45namespace __dfsan {
46
Peter Collingbourne6e4c46d2013-08-15 21:18:53 +000047void InitializeInterceptors();
48
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000049inline dfsan_label *shadow_for(void *ptr) {
Adhemerval Zanellaa0a280e2015-11-27 12:43:33 +000050 return (dfsan_label *) ((((uptr) ptr) & ShadowMask()) << 1);
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000051}
52
53inline const dfsan_label *shadow_for(const void *ptr) {
54 return shadow_for(const_cast<void *>(ptr));
55}
56
Peter Collingbourne78d737c2013-09-10 01:51:35 +000057struct Flags {
Alexey Samsonov8bb699b2015-01-07 00:38:00 +000058#define DFSAN_FLAG(Type, Name, DefaultValue, Description) Type Name;
59#include "dfsan_flags.inc"
60#undef DFSAN_FLAG
61
62 void SetDefaults();
Peter Collingbourne78d737c2013-09-10 01:51:35 +000063};
64
65extern Flags flags_data;
66inline Flags &flags() {
67 return flags_data;
68}
69
Peter Collingbournefa9f5ae2013-08-12 23:51:33 +000070} // namespace __dfsan
71
72#endif // DFSAN_H