summaryrefslogtreecommitdiff
path: root/lib/msan/msan.cc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-01-15 15:13:43 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-01-15 15:13:43 +0000
commit096af34b7cf9920da660a3084b5485ba97059f35 (patch)
tree8f2a32c53687aba186ca91e2b782fa9bb57e4d44 /lib/msan/msan.cc
parent05fe0575f84ea38fa2eca8a5bdea5c77f3217cda (diff)
[sanitizer] Flag parser rewrite.
The new parser is a lot stricter about syntax, reports unrecognized flags, and will make it easier to implemented some of the planned features. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@226169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan.cc')
-rw-r--r--lib/msan/msan.cc50
1 files changed, 34 insertions, 16 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc
index 6eccb5bf6..c8bd6039c 100644
--- a/lib/msan/msan.cc
+++ b/lib/msan/msan.cc
@@ -19,13 +19,13 @@
#include "sanitizer_common/sanitizer_atomic.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_flags.h"
+#include "sanitizer_common/sanitizer_flag_parser.h"
#include "sanitizer_common/sanitizer_libc.h"
#include "sanitizer_common/sanitizer_procmaps.h"
#include "sanitizer_common/sanitizer_stacktrace.h"
#include "sanitizer_common/sanitizer_symbolizer.h"
#include "sanitizer_common/sanitizer_stackdepot.h"
-
// ACHTUNG! No system header includes in this file.
using namespace __sanitizer;
@@ -102,20 +102,40 @@ void Flags::SetDefaults() {
#undef MSAN_FLAG
}
-void Flags::ParseFromString(const char *str) {
- // keep_going is an old name for halt_on_error,
- // and it has inverse meaning.
- halt_on_error = !halt_on_error;
- ParseFlag(str, &halt_on_error, "keep_going", "");
- halt_on_error = !halt_on_error;
+// keep_going is an old name for halt_on_error,
+// and it has inverse meaning.
+class FlagHandlerKeepGoing : public FlagHandlerBase {
+ bool *halt_on_error_;
+
+ public:
+ explicit FlagHandlerKeepGoing(bool *halt_on_error)
+ : halt_on_error_(halt_on_error) {}
+ bool Parse(const char *value) {
+ bool tmp;
+ FlagHandler<bool> h(&tmp);
+ if (!h.Parse(value)) return false;
+ *halt_on_error_ = !tmp;
+ return true;
+ }
+};
-#define MSAN_FLAG(Type, Name, DefaultValue, Description) \
- ParseFlag(str, &Name, #Name, Description);
+void RegisterMsanFlags(FlagParser *parser, Flags *f) {
+#define MSAN_FLAG(Type, Name, DefaultValue, Description) \
+ RegisterFlag(parser, #Name, Description, &f->Name);
#include "msan_flags.inc"
#undef MSAN_FLAG
+
+ FlagHandlerKeepGoing *fh_keep_going =
+ new (INTERNAL_ALLOC) FlagHandlerKeepGoing(&f->halt_on_error); // NOLINT
+ parser->RegisterHandler("keep_going", fh_keep_going,
+ "deprecated, use halt_on_error");
}
static void InitializeFlags(Flags *f, const char *options) {
+ FlagParser parser;
+ RegisterMsanFlags(&parser, f);
+ RegisterCommonFlags(&parser);
+
SetCommonFlagsDefaults();
{
CommonFlags cf;
@@ -132,13 +152,12 @@ static void InitializeFlags(Flags *f, const char *options) {
f->SetDefaults();
// Override from user-specified string.
- if (__msan_default_options) {
- f->ParseFromString(__msan_default_options());
- ParseCommonFlagsFromString(__msan_default_options());
- }
+ if (__msan_default_options)
+ parser.ParseString(__msan_default_options());
+
+ parser.ParseString(options);
- f->ParseFromString(options);
- ParseCommonFlagsFromString(options);
+ if (common_flags()->help) parser.PrintFlagDescriptions();
// Check flag values:
if (f->exit_code < 0 || f->exit_code > 127) {
@@ -328,7 +347,6 @@ void __msan_init() {
const char *msan_options = GetEnv("MSAN_OPTIONS");
InitializeFlags(&msan_flags, msan_options);
- if (common_flags()->help) PrintFlagDescriptions();
__sanitizer_set_report_path(common_flags()->log_path);
InitializeInterceptors();