178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===-- msan.cc -----------------------------------------------------------===//
278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//                     The LLVM Compiler Infrastructure
478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source
678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details.
778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===//
978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
1078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is a part of MemorySanitizer.
1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// MemorySanitizer runtime.
1378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===//
1478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
1578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h"
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_chained_origin_depot.h"
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_origin.h"
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_thread.h"
1986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_poisoning.h"
2078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_atomic.h"
2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_common.h"
2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_flags.h"
2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "sanitizer_common/sanitizer_flag_parser.h"
2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_libc.h"
2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_procmaps.h"
2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_stacktrace.h"
2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_symbolizer.h"
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_stackdepot.h"
29cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "ubsan/ubsan_flags.h"
30cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "ubsan/ubsan_init.h"
3178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No system header includes in this file.
3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __sanitizer;
3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Globals.
3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic THREADLOCAL int msan_expect_umr = 0;
3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic THREADLOCAL int msan_expected_umr_found = 0;
3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Function argument shadow. Each argument starts at the next available 8-byte
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// aligned address.
4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
436d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u64 __msan_param_tls[kMsanParamTlsSize / sizeof(u64)];
4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Function argument origin. Each argument starts at the same offset as the
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// corresponding shadow in (__msan_param_tls). Slightly weird, but changing this
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// would break compatibility with older prebuilt binaries.
4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
496d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u32 __msan_param_origin_tls[kMsanParamTlsSize / sizeof(u32)];
5078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
526d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u64 __msan_retval_tls[kMsanRetvalTlsSize / sizeof(u64)];
5378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
5578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u32 __msan_retval_origin_tls;
5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarALIGNED(16) THREADLOCAL u64 __msan_va_arg_tls[kMsanParamTlsSize / sizeof(u64)];
5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u64 __msan_va_arg_overflow_size_tls;
6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE
6478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u32 __msan_origin_tls;
6578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
6627ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovstatic THREADLOCAL int is_in_symbolizer;
6770c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany
68a879f10ee6aa04f6169d056ef2a9c39502fff290Evgeniy Stepanovextern "C" SANITIZER_WEAK_ATTRIBUTE const int __msan_track_origins;
69b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov
7078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint __msan_get_track_origins() {
71b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov  return &__msan_track_origins ? __msan_track_origins : 0;
7278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
7378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
74bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanovextern "C" SANITIZER_WEAK_ATTRIBUTE const int __msan_keep_going;
75bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov
7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan {
7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
7827ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovvoid EnterSymbolizer() { ++is_in_symbolizer; }
7927ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovvoid ExitSymbolizer()  { --is_in_symbolizer; }
8070c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanybool IsInSymbolizer() { return is_in_symbolizer; }
8170c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany
8278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic Flags msan_flags;
8378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovFlags *flags() {
8578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return &msan_flags;
8678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
8778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
8878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint msan_inited = 0;
8978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovbool msan_init_is_running;
9078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
9199bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanovint msan_report_count = 0;
9299bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov
9378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Array of stack origins.
9478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: make it resizable.
9578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const uptr kNumStackOriginDescrs = 1024 * 1024;
9678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const char *StackOriginDescr[kNumStackOriginDescrs];
976f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanovstatic uptr StackOriginPC[kNumStackOriginDescrs];
9878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic atomic_uint32_t NumStackOriginDescrs;
9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
10086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid Flags::SetDefaults() {
10186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define MSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
10286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_flags.inc"
10386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#undef MSAN_FLAG
10486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
10586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
10686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// keep_going is an old name for halt_on_error,
10786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// and it has inverse meaning.
10886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesclass FlagHandlerKeepGoing : public FlagHandlerBase {
10986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  bool *halt_on_error_;
11086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
11186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines public:
11286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  explicit FlagHandlerKeepGoing(bool *halt_on_error)
11386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      : halt_on_error_(halt_on_error) {}
11486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  bool Parse(const char *value) final {
11586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    bool tmp;
11686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    FlagHandler<bool> h(&tmp);
11786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if (!h.Parse(value)) return false;
11886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    *halt_on_error_ = !tmp;
11986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    return true;
12086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  }
12186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines};
12286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
12386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void RegisterMsanFlags(FlagParser *parser, Flags *f) {
12486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define MSAN_FLAG(Type, Name, DefaultValue, Description) \
12586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  RegisterFlag(parser, #Name, Description, &f->Name);
12686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_flags.inc"
12786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#undef MSAN_FLAG
12886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
12986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  FlagHandlerKeepGoing *fh_keep_going = new (FlagParser::Alloc)  // NOLINT
13086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      FlagHandlerKeepGoing(&f->halt_on_error);
13186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  parser->RegisterHandler("keep_going", fh_keep_going,
13286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                          "deprecated, use halt_on_error");
13386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
13486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
13586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void InitializeFlags() {
13686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  SetCommonFlagsDefaults();
13786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  {
13886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    CommonFlags cf;
13986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.CopyFrom(*common_flags());
14086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.external_symbolizer_path = GetEnv("MSAN_SYMBOLIZER_PATH");
14186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.malloc_context_size = 20;
14286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.handle_ioctl = true;
14386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    // FIXME: test and enable.
14486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.check_printf = false;
14586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    cf.intercept_tls_get_addr = true;
146799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    cf.exitcode = 77;
14786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    OverrideCommonFlags(cf);
14886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  }
14986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
150cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  Flags *f = flags();
15186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  f->SetDefaults();
15286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
153cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  FlagParser parser;
154cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  RegisterMsanFlags(&parser, f);
155cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  RegisterCommonFlags(&parser);
156cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
157cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN
158cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  __ubsan::Flags *uf = __ubsan::flags();
159cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  uf->SetDefaults();
160cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
161cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  FlagParser ubsan_parser;
162cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  __ubsan::RegisterUbsanFlags(&ubsan_parser, uf);
163cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  RegisterCommonFlags(&ubsan_parser);
164cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif
165cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
16686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  // Override from user-specified string.
16786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (__msan_default_options)
16886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    parser.ParseString(__msan_default_options());
169cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN
170cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  const char *ubsan_default_options = __ubsan::MaybeCallUbsanDefaultOptions();
171cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  ubsan_parser.ParseString(ubsan_default_options);
172cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif
17386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
17486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const char *msan_options = GetEnv("MSAN_OPTIONS");
17586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  parser.ParseString(msan_options);
176cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN
177cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  ubsan_parser.ParseString(GetEnv("UBSAN_OPTIONS"));
178cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif
17986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  VPrintf(1, "MSAN_OPTIONS: %s\n", msan_options ? msan_options : "<empty>");
18086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
181c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  InitializeCommonFlags();
18286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
18386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (Verbosity()) ReportUnrecognizedFlags();
18486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
18586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (common_flags()->help) parser.PrintFlagDescriptions();
18686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
187799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  // Check if deprecated exit_code MSan flag is set.
188799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  if (f->exit_code != -1) {
189799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (Verbosity())
190799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      Printf("MSAN_OPTIONS=exit_code is deprecated! "
191799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar             "Please use MSAN_OPTIONS=exitcode instead.\n");
192799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    CommonFlags cf;
193799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    cf.CopyFrom(*common_flags());
194799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    cf.exitcode = f->exit_code;
195799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    OverrideCommonFlags(cf);
19678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
197799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
198799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  // Check flag values:
1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (f->origin_history_size < 0 ||
2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      f->origin_history_size > Origin::kMaxDepth) {
2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Printf(
2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        "Origin history size invalid: %d. Must be 0 (unlimited) or in [1, %d] "
2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        "range.\n",
2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        f->origin_history_size, Origin::kMaxDepth);
2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Die();
2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Limiting to kStackDepotMaxUseCount / 2 to avoid overflow in
2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // StackDepotHandle::inc_use_count_unsafe.
2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (f->origin_history_per_stack_limit < 0 ||
2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      f->origin_history_per_stack_limit > kStackDepotMaxUseCount / 2) {
2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Printf(
2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        "Origin per-stack limit invalid: %d. Must be 0 (unlimited) or in [1, "
2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        "%d] range.\n",
2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        f->origin_history_per_stack_limit, kStackDepotMaxUseCount / 2);
2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Die();
2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
2176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  if (f->store_context_size < 1) f->store_context_size = 1;
21878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
21978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2206d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr bp,
221f16dc4234098a22a9d0d56f0198d87905481e7fdAlexey Samsonov                   bool request_fast_unwind) {
2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  MsanThread *t = GetCurrentThread();
2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (!t || !StackTrace::WillUseFastUnwind(request_fast_unwind)) {
22493c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner    // Block reports from our interceptors during _Unwind_Backtrace.
22593c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner    SymbolizerScope sym_scope;
226799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    return stack->Unwind(max_s, pc, bp, nullptr, 0, 0, request_fast_unwind);
22793c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner  }
228799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(), t->stack_bottom(),
2292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines                request_fast_unwind);
23078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
23178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
23278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid PrintWarning(uptr pc, uptr bp) {
23378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  PrintWarningWithOrigin(pc, bp, __msan_origin_tls);
23478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
23578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
23678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin) {
23778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (msan_expect_umr) {
23878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    // Printf("Expected UMR\n");
23978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    __msan_origin_tls = origin;
24078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    msan_expected_umr_found = 1;
24178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    return;
24278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
24378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
24499bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov  ++msan_report_count;
24599bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov
2462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  GET_FATAL_STACK_TRACE_PC_BP(pc, bp);
247db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov
248db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov  u32 report_origin =
24986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    (__msan_get_track_origins() && Origin::isValidId(origin)) ? origin : 0;
250db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov  ReportUMR(&stack, report_origin);
251db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov
25286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (__msan_get_track_origins() && !Origin::isValidId(origin)) {
25348ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov    Printf(
25448ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov        "  ORIGIN: invalid (%x). Might be a bug in MemorySanitizer origin "
25548ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov        "tracking.\n    This could still be a bug in your code, too!\n",
25648ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov        origin);
25778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
25878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
25978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
260c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonovvoid UnpoisonParam(uptr n) {
261c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov  internal_memset(__msan_param_tls, 0, n * sizeof(*__msan_param_tls));
262c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov}
263c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov
2640e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Backup MSan runtime TLS state.
2650e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Implementation must be async-signal-safe.
2660e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Instances of this class may live on the signal handler stack, and data size
2670e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// may be an issue.
2680e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid ScopedThreadLocalStateBackup::Backup() {
2690e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov  va_arg_overflow_size_tls = __msan_va_arg_overflow_size_tls;
2700e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov}
2710e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov
2720e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid ScopedThreadLocalStateBackup::Restore() {
2730e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov  // A lame implementation that only keeps essential state and resets the rest.
2740e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov  __msan_va_arg_overflow_size_tls = va_arg_overflow_size_tls;
2750e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov
27691659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov  internal_memset(__msan_param_tls, 0, sizeof(__msan_param_tls));
27791659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov  internal_memset(__msan_retval_tls, 0, sizeof(__msan_retval_tls));
27891659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov  internal_memset(__msan_va_arg_tls, 0, sizeof(__msan_va_arg_tls));
2790e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov
2800e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov  if (__msan_get_track_origins()) {
2812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    internal_memset(&__msan_retval_origin_tls, 0,
2822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines                    sizeof(__msan_retval_origin_tls));
283c154820b43052cfc54ee20752a3232aa8e6c7843Alexey Samsonov    internal_memset(__msan_param_origin_tls, 0,
284c154820b43052cfc54ee20752a3232aa8e6c7843Alexey Samsonov                    sizeof(__msan_param_origin_tls));
2850e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov  }
2860e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov}
2870e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov
2880e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid UnpoisonThreadLocalState() {
28991659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov}
29091659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov
2912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst char *GetStackOriginDescr(u32 id, uptr *pc) {
2926f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov  CHECK_LT(id, kNumStackOriginDescrs);
2936f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov  if (pc) *pc = StackOriginPC[id];
2946f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov  return StackOriginDescr[id];
2956f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov}
2966f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov
2972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 ChainOrigin(u32 id, StackTrace *stack) {
2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  MsanThread *t = GetCurrentThread();
2992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (t && t->InSignalHandler())
3002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    return id;
3012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
30286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  Origin o = Origin::FromRawId(id);
30386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  stack->tag = StackTrace::TAG_UNKNOWN;
30486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  Origin chained = Origin::CreateChainedOrigin(o, stack);
30586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  return chained.raw_id();
3062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
3072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
308799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} // namespace __msan
30978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Interface.
31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
31278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan;
31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define MSAN_MAYBE_WARNING(type, size)              \
3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_maybe_warning_##size(type s, u32 o) { \
3162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    GET_CALLER_PC_BP_SP;                            \
3172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    (void) sp;                                      \
3182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (UNLIKELY(s)) {                              \
3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      PrintWarningWithOrigin(pc, bp, o);            \
3202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      if (__msan::flags()->halt_on_error) {         \
3212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        Printf("Exiting\n");                        \
3222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        Die();                                      \
3232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      }                                             \
3242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    }                                               \
3252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
3262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u8, 1)
3282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u16, 2)
3292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u32, 4)
3302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u64, 8)
3312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define MSAN_MAYBE_STORE_ORIGIN(type, size)                       \
3332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_maybe_store_origin_##size(type s, void *p, u32 o) { \
3346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    if (UNLIKELY(s)) {                                            \
3356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      if (__msan_get_track_origins() > 1) {                       \
3366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines        GET_CALLER_PC_BP_SP;                                      \
3376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines        (void) sp;                                                \
3386a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines        GET_STORE_STACK_TRACE_PC_BP(pc, bp);                      \
3396a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines        o = ChainOrigin(o, &stack);                               \
3406a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      }                                                           \
3416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      *(u32 *)MEM_TO_ORIGIN((uptr)p & ~3UL) = o;                  \
3426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    }                                                             \
3432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
3442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u8, 1)
3462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u16, 2)
3472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u32, 4)
3482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u64, 8)
3492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_warning() {
35178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  GET_CALLER_PC_BP_SP;
35278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  (void)sp;
35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  PrintWarning(pc, bp);
354dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  if (__msan::flags()->halt_on_error) {
3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (__msan::flags()->print_stats)
3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ReportStats();
357bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov    Printf("Exiting\n");
358bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov    Die();
359bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov  }
36078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
36178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
36278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_warning_noreturn() {
36378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  GET_CALLER_PC_BP_SP;
36478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  (void)sp;
36578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  PrintWarning(pc, bp);
3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (__msan::flags()->print_stats)
3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ReportStats();
36878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  Printf("Exiting\n");
36978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  Die();
37078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
37178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
37278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_init() {
3732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  CHECK(!msan_init_is_running);
37478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (msan_inited) return;
37578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  msan_init_is_running = 1;
376859778a4e2dffa4024fa3e13b105fd62eca44b1cKostya Serebryany  SanitizerToolName = "MemorySanitizer";
37778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
378c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  AvoidCVE_2016_2143();
37910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  InitTlsSize();
380a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov
381cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  CacheBinaryName();
382799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  InitializeFlags();
383799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
384a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov  __sanitizer_set_report_path(common_flags()->log_path);
385a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov
38678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  InitializeInterceptors();
387cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov  InstallAtExitHandler(); // Needs __cxa_atexit interceptor.
38878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3896d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  DisableCoreDumperIfNecessary();
39078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (StackSizeIsUnlimited()) {
3912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    VPrintf(1, "Unlimited stack, doing reexec\n");
39278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    // A reasonably large stack size. It is bigger than the usual 8Mb, because,
39378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    // well, the program could have been run with unlimited stack for a reason.
39478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    SetStackSizeLimitInBytes(32 * 1024 * 1024);
39578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    ReExec();
39678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
397f35eae83757946decb312deab3f0fe155fe5d580Evgeniy Stepanov
39878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  __msan_clear_on_return();
3992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (__msan_get_track_origins())
4002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    VPrintf(1, "msan_track_origins\n");
401cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  if (!InitShadow(__msan_get_track_origins())) {
4024c9ddc143839c9f4b79152737cd2869c99e8e86dEvgeniy Stepanov    Printf("FATAL: MemorySanitizer can not mmap the shadow memory.\n");
40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    Printf("FATAL: Make sure to compile with -fPIE and to link with -pie.\n");
4044c9ddc143839c9f4b79152737cd2869c99e8e86dEvgeniy Stepanov    Printf("FATAL: Disabling ASLR is known to cause this error.\n");
4054b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany    Printf("FATAL: If running under GDB, try "
4064b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany           "'set disable-randomization off'.\n");
40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    DumpProcessMap();
40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    Die();
40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
41078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  Symbolizer::GetOrInit()->AddHooks(EnterSymbolizer, ExitSymbolizer);
41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
41386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
41486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
4152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  MsanTSDInit(MsanTSDDtor);
4162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
417799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  MsanAllocatorInit();
418799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
419799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  MsanThread *main_thread = MsanThread::Create(nullptr, nullptr);
4202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  SetCurrentThread(main_thread);
4212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  main_thread->ThreadStart();
4222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
423cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN
424cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  __ubsan::InitAsPlugin();
425cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif
426cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
4272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  VPrintf(1, "MemorySanitizer init done\n");
4282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  msan_init_is_running = 0;
43078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  msan_inited = 1;
43178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
43278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
433bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanovvoid __msan_set_keep_going(int keep_going) {
434dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov  flags()->halt_on_error = !keep_going;
435bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov}
436bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov
43778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_set_expect_umr(int expect_umr) {
43878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (expect_umr) {
43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    msan_expected_umr_found = 0;
44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  } else if (!msan_expected_umr_found) {
44178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    GET_CALLER_PC_BP_SP;
44278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    (void)sp;
4432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    GET_FATAL_STACK_TRACE_PC_BP(pc, bp);
444db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov    ReportExpectedUMRNotFound(&stack);
44578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    Die();
44678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
44778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  msan_expect_umr = expect_umr;
44878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
44978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
45078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_print_shadow(const void *x, uptr size) {
45121bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov  if (!MEM_IS_APP(x)) {
45221bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov    Printf("Not a valid application address: %p\n", x);
45321bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov    return;
45421bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov  }
4552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  DescribeMemoryRange(x, size);
4572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
4582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_dump_shadow(const void *x, uptr size) {
4602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (!MEM_IS_APP(x)) {
4612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Printf("Not a valid application address: %p\n", x);
4622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    return;
4632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
4642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
46578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  unsigned char *s = (unsigned char*)MEM_TO_SHADOW(x);
466c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  for (uptr i = 0; i < size; i++)
46778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    Printf("%x%x ", s[i] >> 4, s[i] & 0xf);
46878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  Printf("\n");
46978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
47078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
47178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovsptr __msan_test_shadow(const void *x, uptr size) {
4722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (!MEM_IS_APP(x)) return -1;
4732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  unsigned char *s = (unsigned char *)MEM_TO_SHADOW((uptr)x);
47478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  for (uptr i = 0; i < size; ++i)
47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    if (s[i])
47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov      return i;
47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return -1;
47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
47978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_check_mem_is_initialized(const void *x, uptr size) {
4812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (!__msan::flags()->report_umrs) return;
4822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  sptr offset = __msan_test_shadow(x, size);
4832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (offset < 0)
4842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    return;
4852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  GET_CALLER_PC_BP_SP;
4872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  (void)sp;
4882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ReportUMRInsideAddressRange(__func__, x, size, offset);
4892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan::PrintWarningWithOrigin(pc, bp,
4906d1862363c88c183b0ed7740fca876342cf0474bStephen Hines                                 __msan_get_origin(((const char *)x) + offset));
4912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (__msan::flags()->halt_on_error) {
4922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Printf("Exiting\n");
4932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Die();
4942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
4952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
4962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
49778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint __msan_set_poison_in_malloc(int do_poison) {
49878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  int old = flags()->poison_in_malloc;
49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  flags()->poison_in_malloc = do_poison;
50078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return old;
50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
5036d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesint __msan_has_dynamic_component() { return false; }
50478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
50578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovNOINLINE
50678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_on_return() {
50778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  __msan_param_tls[0] = 0;
50878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
50978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
51011347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_partial_poison(const void* data, void* shadow, uptr size) {
51178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  internal_memcpy((void*)MEM_TO_SHADOW((uptr)data), shadow, size);
51278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
51378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
514799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarvoid __msan_load_unpoisoned(const void *src, uptr size, void *dst) {
51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  internal_memcpy(dst, src, size);
51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  __msan_unpoison(dst, size);
51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
51878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
51911347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_set_origin(const void *a, uptr size, u32 origin) {
52086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (__msan_get_track_origins()) SetOrigin(a, size, origin);
52178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
52278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 'descr' is created at compile time and contains '----' in the beginning.
52478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// When we see descr for the first time we replace '----' with a uniq id
52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// and set the origin to (id | (31-th bit)).
5266d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid __msan_set_alloca_origin(void *a, uptr size, char *descr) {
5276f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov  __msan_set_alloca_origin4(a, size, descr, 0);
5286f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov}
5296f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov
5306d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc) {
53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  static const u32 dash = '-';
53278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  static const u32 first_timer =
53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov      dash + (dash << 8) + (dash << 16) + (dash << 24);
53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  u32 *id_ptr = (u32*)descr;
53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  bool print = false;  // internal_strstr(descr + 4, "AllocaTOTest") != 0;
53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  u32 id = *id_ptr;
53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (id == first_timer) {
5382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    u32 idx = atomic_fetch_add(&NumStackOriginDescrs, 1, memory_order_relaxed);
5392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    CHECK_LT(idx, kNumStackOriginDescrs);
5402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StackOriginDescr[idx] = descr + 4;
541c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if SANITIZER_PPC64V1
542c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    // On PowerPC64 ELFv1, the address of a function actually points to a
543c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    // three-doubleword data structure with the first field containing
544c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    // the address of the function's code.
545c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    if (pc)
546c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar      pc = *reinterpret_cast<uptr*>(pc);
547c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
5482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StackOriginPC[idx] = pc;
54986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    id = Origin::CreateStackOrigin(idx).raw_id();
55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    *id_ptr = id;
55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    if (print)
5522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      Printf("First time: idx=%d id=%d %s %p \n", idx, id, descr + 4, pc);
55378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  }
55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  if (print)
55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov    Printf("__msan_set_alloca_origin: descr=%s id=%x\n", descr + 4, id);
55686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  __msan_set_origin(a, size, id);
55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
5592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 __msan_chain_origin(u32 id) {
5602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  GET_CALLER_PC_BP_SP;
5612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  (void)sp;
5622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  GET_STORE_STACK_TRACE_PC_BP(pc, bp);
5632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return ChainOrigin(id, &stack);
56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
56578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
56611347bf5f008b5970f699241617381d95526d73dAlexey Samsonovu32 __msan_get_origin(const void *a) {
567b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov  if (!__msan_get_track_origins()) return 0;
56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  uptr x = (uptr)a;
56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  uptr aligned = x & ~3ULL;
57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  uptr origin_ptr = MEM_TO_ORIGIN(aligned);
57178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return *(u32*)origin_ptr;
57278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
57378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
57486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint __msan_origin_is_descendant_or_same(u32 this_id, u32 prev_id) {
57586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  Origin o = Origin::FromRawId(this_id);
57686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  while (o.raw_id() != prev_id && o.isChainedOrigin())
57786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    o = o.getNextChainedOrigin(nullptr);
57886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  return o.raw_id() == prev_id;
57986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
58086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
58112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanovu32 __msan_get_umr_origin() {
58278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return __msan_origin_tls;
58378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
58470c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany
5852e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu16 __sanitizer_unaligned_load16(const uu16 *p) {
586c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  *(uu16 *)&__msan_retval_tls[0] = *(uu16 *)MEM_TO_SHADOW((uptr)p);
5877ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov  if (__msan_get_track_origins())
5882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p));
5892e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  return *p;
590f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
5912e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu32 __sanitizer_unaligned_load32(const uu32 *p) {
592c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  *(uu32 *)&__msan_retval_tls[0] = *(uu32 *)MEM_TO_SHADOW((uptr)p);
5937ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov  if (__msan_get_track_origins())
5942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p));
5952e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  return *p;
596f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
5972e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu64 __sanitizer_unaligned_load64(const uu64 *p) {
5982e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  __msan_retval_tls[0] = *(uu64 *)MEM_TO_SHADOW((uptr)p);
5997ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov  if (__msan_get_track_origins())
6002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p));
6012e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  return *p;
602f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
6032e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store16(uu16 *p, u16 x) {
604c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  u16 s = *(uu16 *)&__msan_param_tls[1];
6052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  *(uu16 *)MEM_TO_SHADOW((uptr)p) = s;
6062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (s && __msan_get_track_origins())
6072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (uu32 o = __msan_param_origin_tls[2])
6082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o);
6092e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  *p = x;
610f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
6112e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store32(uu32 *p, u32 x) {
612c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  u32 s = *(uu32 *)&__msan_param_tls[1];
6132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  *(uu32 *)MEM_TO_SHADOW((uptr)p) = s;
6142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (s && __msan_get_track_origins())
6152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (uu32 o = __msan_param_origin_tls[2])
6162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o);
6172e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  *p = x;
618f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
6192e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store64(uu64 *p, u64 x) {
6202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  u64 s = __msan_param_tls[1];
6212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  *(uu64 *)MEM_TO_SHADOW((uptr)p) = s;
6222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (s && __msan_get_track_origins())
6232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (uu32 o = __msan_param_origin_tls[2])
6242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o);
6252e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov  *p = x;
626f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
627f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
6282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_set_death_callback(void (*callback)(void)) {
629799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  SetUserDieCallback(callback);
6302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
6312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
63270c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany#if !SANITIZER_SUPPORTS_WEAK_HOOKS
63370c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanyextern "C" {
6343c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
63570c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanyconst char* __msan_default_options() { return ""; }
63670c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany}  // extern "C"
63770c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany#endif
63870c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany
6392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" {
6402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesSANITIZER_INTERFACE_ATTRIBUTE
6412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __sanitizer_print_stack_trace() {
6422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME());
6432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  stack.Print();
6442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
645799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} // extern "C"
646