xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sancov_flags.cpp (revision 3cab2bb3f667058bece8e38b12449a63a9d73c4b)
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