| //===-- nsan_flags.cc -----------------------------------------------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of NumericalStabilitySanitizer. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "nsan_flags.h" |
| |
| #include "sanitizer_common/sanitizer_flag_parser.h" |
| #include "sanitizer_common/sanitizer_flags.h" |
| |
| using namespace __sanitizer; |
| using namespace __nsan; |
| |
| SANITIZER_INTERFACE_WEAK_DEF(const char *, __nsan_default_options, void) { |
| return ""; |
| } |
| |
| Flags __nsan::flags_data; |
| |
| void Flags::SetDefaults() { |
| #define NSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; |
| #include "nsan_flags.inc" |
| #undef NSAN_FLAG |
| } |
| |
| void Flags::PopulateCache() { |
| cached_absolute_error_threshold = |
| 1.0 / (1ull << log2_absolute_error_threshold); |
| } |
| |
| static void RegisterNSanFlags(FlagParser *parser, Flags *f) { |
| #define NSAN_FLAG(Type, Name, DefaultValue, Description) \ |
| RegisterFlag(parser, #Name, Description, &f->Name); |
| #include "nsan_flags.inc" |
| #undef NSAN_FLAG |
| } |
| |
| static const char *MaybeCallNsanDefaultOptions() { |
| return (&__nsan_default_options) ? __nsan_default_options() : ""; |
| } |
| |
| void __nsan::InitializeFlags() { |
| SetCommonFlagsDefaults(); |
| { |
| CommonFlags cf; |
| cf.CopyFrom(*common_flags()); |
| cf.external_symbolizer_path = GetEnv("NSAN_SYMBOLIZER_PATH"); |
| OverrideCommonFlags(cf); |
| } |
| |
| flags().SetDefaults(); |
| |
| FlagParser parser; |
| RegisterCommonFlags(&parser); |
| RegisterNSanFlags(&parser, &flags()); |
| |
| const char *nsan_default_options = MaybeCallNsanDefaultOptions(); |
| parser.ParseString(nsan_default_options); |
| |
| parser.ParseString(GetEnv("NSAN_OPTIONS")); |
| InitializeCommonFlags(); |
| if (Verbosity()) |
| ReportUnrecognizedFlags(); |
| if (common_flags()->help) |
| parser.PrintFlagDescriptions(); |
| |
| flags().PopulateCache(); |
| } |