2013-01-29 14:33:29 +00:00
|
|
|
//===-- msan_interface_internal.h -------------------------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 08:50:56 +00:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2013-01-29 14:33:29 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file is a part of MemorySanitizer.
|
|
|
|
//
|
|
|
|
// Private MSan interface header.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef MSAN_INTERFACE_INTERNAL_H
|
|
|
|
#define MSAN_INTERFACE_INTERNAL_H
|
|
|
|
|
2013-01-30 13:12:08 +00:00
|
|
|
#include "sanitizer_common/sanitizer_internal_defs.h"
|
2013-01-29 14:33:29 +00:00
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
// FIXME: document all interface functions.
|
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
int __msan_get_track_origins();
|
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_init();
|
|
|
|
|
|
|
|
// Print a warning and maybe return.
|
2015-08-21 20:49:37 +00:00
|
|
|
// This function can die based on common_flags()->exitcode.
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_warning();
|
|
|
|
|
|
|
|
// Print a warning and die.
|
2021-09-04 13:01:34 +05:30
|
|
|
// Instrumentation inserts calls to this function when building in "fast" mode
|
2013-01-29 14:33:29 +00:00
|
|
|
// (i.e. -mllvm -msan-keep-going)
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn))
|
|
|
|
void __msan_warning_noreturn();
|
|
|
|
|
2016-09-15 21:02:18 +00:00
|
|
|
using __sanitizer::uptr;
|
|
|
|
using __sanitizer::sptr;
|
|
|
|
using __sanitizer::uu64;
|
|
|
|
using __sanitizer::uu32;
|
|
|
|
using __sanitizer::uu16;
|
|
|
|
using __sanitizer::u64;
|
|
|
|
using __sanitizer::u32;
|
|
|
|
using __sanitizer::u16;
|
|
|
|
using __sanitizer::u8;
|
|
|
|
|
[MSAN] Pass Origin by parameter to __msan_warning functions
Summary:
Normally, the Origin is passed over TLS, which seems like it introduces unnecessary overhead. It's in the (extremely) cold path though, so the only overhead is in code size.
But with eager-checks, calls to __msan_warning functions are extremely common, so this becomes a useful optimization.
This can save ~5% code size.
Reviewers: eugenis, vitalybuka
Reviewed By: eugenis, vitalybuka
Subscribers: hiraditya, #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D81700
2020-06-15 15:17:00 -07:00
|
|
|
// Versions of the above which take Origin as a parameter
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_warning_with_origin(u32 origin);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn)) void
|
|
|
|
__msan_warning_with_origin_noreturn(u32 origin);
|
|
|
|
|
2014-04-18 12:18:00 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_warning_1(u8 s, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_warning_2(u16 s, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_warning_4(u32 s, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_warning_8(u64 s, u32 o);
|
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_store_origin_1(u8 s, void *p, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_store_origin_2(u16 s, void *p, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_store_origin_4(u32 s, void *p, u32 o);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_maybe_store_origin_8(u64 s, void *p, u32 o);
|
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
void __msan_unpoison(const void *a, uptr size);
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2014-03-21 10:12:17 +00:00
|
|
|
void __msan_unpoison_string(const char *s);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2019-05-09 21:50:57 +00:00
|
|
|
void __msan_unpoison_param(uptr n);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-01-29 14:33:29 +00:00
|
|
|
void __msan_clear_and_unpoison(void *a, uptr size);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void* __msan_memcpy(void *dst, const void *src, uptr size);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void* __msan_memset(void *s, int c, uptr n);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void* __msan_memmove(void* dest, const void* src, uptr n);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
void __msan_poison(const void *a, uptr size);
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_poison_stack(void *a, uptr size);
|
|
|
|
|
|
|
|
// Copy size bytes from src to dst and unpoison the result.
|
|
|
|
// Useful to implement unsafe loads.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_load_unpoisoned(void *src, uptr size, void *dst);
|
|
|
|
|
|
|
|
// Returns the offset of the first (at least partially) poisoned byte,
|
|
|
|
// or -1 if the whole range is good.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
sptr __msan_test_shadow(const void *x, uptr size);
|
|
|
|
|
2014-04-02 11:50:42 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_check_mem_is_initialized(const void *x, uptr size);
|
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
void __msan_set_origin(const void *a, uptr size, u32 origin);
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2014-11-13 22:40:59 +00:00
|
|
|
void __msan_set_alloca_origin(void *a, uptr size, char *descr);
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2014-11-13 22:40:59 +00:00
|
|
|
void __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc);
|
2013-09-13 12:49:13 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2022-08-11 00:23:15 -07:00
|
|
|
void __msan_set_alloca_origin_with_descr(void *a, uptr size, u32 *id_ptr,
|
|
|
|
char *descr);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2022-08-11 14:53:38 -07:00
|
|
|
void __msan_set_alloca_origin_no_descr(void *a, uptr size, u32 *id_ptr);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2014-03-18 13:45:19 +00:00
|
|
|
u32 __msan_chain_origin(u32 id);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
u32 __msan_get_origin(const void *a);
|
2013-01-29 14:33:29 +00:00
|
|
|
|
2015-02-26 15:19:33 +00:00
|
|
|
// Test that this_id is a descendant of prev_id (or they are simply equal).
|
|
|
|
// "descendant" here means that are part of the same chain, created with
|
|
|
|
// __msan_chain_origin.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
int __msan_origin_is_descendant_or_same(u32 this_id, u32 prev_id);
|
|
|
|
|
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_clear_on_return();
|
|
|
|
|
2013-06-21 12:37:58 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_set_keep_going(int keep_going);
|
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
int __msan_set_poison_in_malloc(int do_poison);
|
|
|
|
|
2020-09-04 19:19:20 -07:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
const char *__msan_default_options();
|
2013-02-13 07:19:47 +00:00
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
// For testing.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_set_expect_umr(int expect_umr);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_print_shadow(const void *x, uptr size);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2014-04-30 09:50:30 +00:00
|
|
|
void __msan_dump_shadow(const void *x, uptr size);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-01-29 14:33:29 +00:00
|
|
|
int __msan_has_dynamic_component();
|
|
|
|
|
|
|
|
// For testing.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
u32 __msan_get_umr_origin();
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
void __msan_partial_poison(const void* data, void* shadow, uptr size);
|
2013-01-29 14:33:29 +00:00
|
|
|
|
|
|
|
// Tell MSan about newly allocated memory (ex.: custom allocator).
|
|
|
|
// Memory will be marked uninitialized, with origin at the call site.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-04-23 13:34:19 +00:00
|
|
|
void __msan_allocated_memory(const void* data, uptr size);
|
2013-01-29 14:33:29 +00:00
|
|
|
|
2015-07-17 23:28:00 +00:00
|
|
|
// Tell MSan about newly destroyed memory. Memory will be marked
|
|
|
|
// uninitialized.
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __sanitizer_dtor_callback(const void* data, uptr size);
|
2022-08-29 20:33:01 -07:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __sanitizer_dtor_callback_fields(const void *data, uptr size);
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __sanitizer_dtor_callback_vptr(const void *data);
|
2015-07-17 23:28:00 +00:00
|
|
|
|
2013-06-04 13:08:36 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
u16 __sanitizer_unaligned_load16(const uu16 *p);
|
2013-06-04 13:08:36 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
u32 __sanitizer_unaligned_load32(const uu32 *p);
|
2013-06-04 13:08:36 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
u64 __sanitizer_unaligned_load64(const uu64 *p);
|
2013-06-04 13:08:36 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
void __sanitizer_unaligned_store16(uu16 *p, u16 x);
|
2013-06-04 13:08:36 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
void __sanitizer_unaligned_store32(uu32 *p, u32 x);
|
2013-06-04 13:08:36 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
2013-06-04 13:49:10 +00:00
|
|
|
void __sanitizer_unaligned_store64(uu64 *p, u64 x);
|
2013-08-02 14:26:58 +00:00
|
|
|
|
2014-03-27 14:04:58 +00:00
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_set_death_callback(void (*callback)(void));
|
2015-10-12 23:20:24 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_copy_shadow(void *dst, const void *src, uptr size);
|
2018-07-06 17:10:51 +00:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_scoped_disable_interceptor_checks();
|
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_scoped_enable_interceptor_checks();
|
2020-08-27 19:21:59 -07:00
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_start_switch_fiber(const void *bottom, uptr size);
|
|
|
|
|
|
|
|
SANITIZER_INTERFACE_ATTRIBUTE
|
|
|
|
void __msan_finish_switch_fiber(const void **bottom_old, uptr *size_old);
|
2013-06-04 13:08:36 +00:00
|
|
|
} // extern "C"
|
|
|
|
|
2013-01-29 14:33:29 +00:00
|
|
|
#endif // MSAN_INTERFACE_INTERNAL_H
|