1*3cab2bb3Spatrick //===-- sancov_flags.cpp ----------------------------------------*- C++ -*-===//
2*3cab2bb3Spatrick //
3*3cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*3cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3cab2bb3Spatrick //
7*3cab2bb3Spatrick //===----------------------------------------------------------------------===//
8*3cab2bb3Spatrick //
9*3cab2bb3Spatrick // Sanitizer Coverage runtime flags.
10*3cab2bb3Spatrick //
11*3cab2bb3Spatrick //===----------------------------------------------------------------------===//
12*3cab2bb3Spatrick
13*3cab2bb3Spatrick #include "sancov_flags.h"
14*3cab2bb3Spatrick #include "sanitizer_flag_parser.h"
15*3cab2bb3Spatrick #include "sanitizer_platform.h"
16*3cab2bb3Spatrick
SANITIZER_INTERFACE_WEAK_DEF(const char *,__sancov_default_options,void)17*3cab2bb3Spatrick SANITIZER_INTERFACE_WEAK_DEF(const char*, __sancov_default_options, void) {
18*3cab2bb3Spatrick return "";
19*3cab2bb3Spatrick }
20*3cab2bb3Spatrick
21*3cab2bb3Spatrick using namespace __sanitizer;
22*3cab2bb3Spatrick
23*3cab2bb3Spatrick namespace __sancov {
24*3cab2bb3Spatrick
25*3cab2bb3Spatrick SancovFlags sancov_flags_dont_use_directly; // use via flags();
26*3cab2bb3Spatrick
SetDefaults()27*3cab2bb3Spatrick void SancovFlags::SetDefaults() {
28*3cab2bb3Spatrick #define SANCOV_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
29*3cab2bb3Spatrick #include "sancov_flags.inc"
30*3cab2bb3Spatrick #undef SANCOV_FLAG
31*3cab2bb3Spatrick }
32*3cab2bb3Spatrick
RegisterSancovFlags(FlagParser * parser,SancovFlags * f)33*3cab2bb3Spatrick static void RegisterSancovFlags(FlagParser *parser, SancovFlags *f) {
34*3cab2bb3Spatrick #define SANCOV_FLAG(Type, Name, DefaultValue, Description) \
35*3cab2bb3Spatrick RegisterFlag(parser, #Name, Description, &f->Name);
36*3cab2bb3Spatrick #include "sancov_flags.inc"
37*3cab2bb3Spatrick #undef SANCOV_FLAG
38*3cab2bb3Spatrick }
39*3cab2bb3Spatrick
MaybeCallSancovDefaultOptions()40*3cab2bb3Spatrick static const char *MaybeCallSancovDefaultOptions() {
41*3cab2bb3Spatrick return (&__sancov_default_options) ? __sancov_default_options() : "";
42*3cab2bb3Spatrick }
43*3cab2bb3Spatrick
InitializeSancovFlags()44*3cab2bb3Spatrick void InitializeSancovFlags() {
45*3cab2bb3Spatrick SancovFlags *f = sancov_flags();
46*3cab2bb3Spatrick f->SetDefaults();
47*3cab2bb3Spatrick
48*3cab2bb3Spatrick FlagParser parser;
49*3cab2bb3Spatrick RegisterSancovFlags(&parser, f);
50*3cab2bb3Spatrick
51*3cab2bb3Spatrick parser.ParseString(MaybeCallSancovDefaultOptions());
52*3cab2bb3Spatrick parser.ParseStringFromEnv("SANCOV_OPTIONS");
53*3cab2bb3Spatrick
54*3cab2bb3Spatrick ReportUnrecognizedFlags();
55*3cab2bb3Spatrick if (f->help) parser.PrintFlagDescriptions();
56*3cab2bb3Spatrick }
57*3cab2bb3Spatrick
58*3cab2bb3Spatrick } // namespace __sancov
59