|  | //===-- 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(); | 
|  | } |