[compiler-rt] r204339 - [libsanitizer] Introduce flag descriptions.

Alexey Samsonov samsonov at google.com
Thu Mar 20 06:18:31 PDT 2014


On Thu, Mar 20, 2014 at 4:52 PM, Alexander Potapenko <glider at google.com>wrote:

> Author: glider
> Date: Thu Mar 20 07:52:52 2014
> New Revision: 204339
>
> URL: http://llvm.org/viewvc/llvm-project?rev=204339&view=rev
> Log:
> [libsanitizer] Introduce flag descriptions.
> Extend ParseFlag to accept the |description| parameter, add dummy values
> for all existing flags.
> As the flags are parsed their descriptions are stored in a global linked
> list.
> The tool can later call __sanitizer::PrintFlagDescriptions() to dump all
> the flag names and their descriptions.
> Add the 'help' flag and make ASan, TSan and MSan print the flags if 'help'
> is set to 1.
>
> Modified:
>     compiler-rt/trunk/lib/asan/asan_rtl.cc
>     compiler-rt/trunk/lib/dfsan/dfsan.cc
>     compiler-rt/trunk/lib/lsan/lsan_common.cc
>     compiler-rt/trunk/lib/msan/msan.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h
>     compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
>     compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
>
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Thu Mar 20 07:52:52 2014
> @@ -95,50 +95,52 @@ static void ParseFlagsFromString(Flags *
>    ParseCommonFlagsFromString(cf, str);
>    CHECK((uptr)cf->malloc_context_size <= kStackTraceMax);
>
> -  ParseFlag(str, &f->quarantine_size, "quarantine_size");
> -  ParseFlag(str, &f->redzone, "redzone");
> -  ParseFlag(str, &f->max_redzone, "max_redzone");
> +  ParseFlag(str, &f->quarantine_size, "quarantine_size", "");
> +  ParseFlag(str, &f->redzone, "redzone", "");
> +  ParseFlag(str, &f->max_redzone, "max_redzone", "");
>    CHECK_GE(f->redzone, 16);
>    CHECK_GE(f->max_redzone, f->redzone);
>    CHECK_LE(f->max_redzone, 2048);
>    CHECK(IsPowerOfTwo(f->redzone));
>    CHECK(IsPowerOfTwo(f->max_redzone));
>
> -  ParseFlag(str, &f->debug, "debug");
> -  ParseFlag(str, &f->report_globals, "report_globals");
> -  ParseFlag(str, &f->check_initialization_order,
> "check_initialization_order");
> -
> -  ParseFlag(str, &f->replace_str, "replace_str");
> -  ParseFlag(str, &f->replace_intrin, "replace_intrin");
> -  ParseFlag(str, &f->mac_ignore_invalid_free, "mac_ignore_invalid_free");
> +  ParseFlag(str, &f->debug, "debug", "");
> +  ParseFlag(str, &f->report_globals, "report_globals", "");
> +  ParseFlag(str, &f->check_initialization_order,
> +            "check_initialization_order", "");
> +
> +  ParseFlag(str, &f->replace_str, "replace_str", "");
> +  ParseFlag(str, &f->replace_intrin, "replace_intrin", "");
> +  ParseFlag(str, &f->mac_ignore_invalid_free, "mac_ignore_invalid_free",
> "");
>    ParseFlag(str, &f->detect_stack_use_after_return,
> -            "detect_stack_use_after_return");
> -  ParseFlag(str, &f->min_uar_stack_size_log, "min_uar_stack_size_log");
> -  ParseFlag(str, &f->max_uar_stack_size_log, "max_uar_stack_size_log");
> -  ParseFlag(str, &f->uar_noreserve, "uar_noreserve");
> -  ParseFlag(str, &f->max_malloc_fill_size, "max_malloc_fill_size");
> -  ParseFlag(str, &f->malloc_fill_byte, "malloc_fill_byte");
> -  ParseFlag(str, &f->exitcode, "exitcode");
> -  ParseFlag(str, &f->allow_user_poisoning, "allow_user_poisoning");
> -  ParseFlag(str, &f->sleep_before_dying, "sleep_before_dying");
> -  ParseFlag(str, &f->check_malloc_usable_size,
> "check_malloc_usable_size");
> -  ParseFlag(str, &f->unmap_shadow_on_exit, "unmap_shadow_on_exit");
> -  ParseFlag(str, &f->abort_on_error, "abort_on_error");
> -  ParseFlag(str, &f->print_stats, "print_stats");
> -  ParseFlag(str, &f->print_legend, "print_legend");
> -  ParseFlag(str, &f->atexit, "atexit");
> -  ParseFlag(str, &f->coverage, "coverage");
> -  ParseFlag(str, &f->disable_core, "disable_core");
> -  ParseFlag(str, &f->allow_reexec, "allow_reexec");
> -  ParseFlag(str, &f->print_full_thread_history,
> "print_full_thread_history");
> -  ParseFlag(str, &f->poison_heap, "poison_heap");
> -  ParseFlag(str, &f->poison_partial, "poison_partial");
> -  ParseFlag(str, &f->alloc_dealloc_mismatch, "alloc_dealloc_mismatch");
> -  ParseFlag(str, &f->strict_memcmp, "strict_memcmp");
> -  ParseFlag(str, &f->strict_init_order, "strict_init_order");
> -  ParseFlag(str, &f->start_deactivated, "start_deactivated");
> +            "detect_stack_use_after_return", "");
> +  ParseFlag(str, &f->min_uar_stack_size_log, "min_uar_stack_size_log",
> "");
> +  ParseFlag(str, &f->max_uar_stack_size_log, "max_uar_stack_size_log",
> "");
> +  ParseFlag(str, &f->uar_noreserve, "uar_noreserve", "");
> +  ParseFlag(str, &f->max_malloc_fill_size, "max_malloc_fill_size", "");
> +  ParseFlag(str, &f->malloc_fill_byte, "malloc_fill_byte", "");
> +  ParseFlag(str, &f->exitcode, "exitcode", "");
> +  ParseFlag(str, &f->allow_user_poisoning, "allow_user_poisoning", "");
> +  ParseFlag(str, &f->sleep_before_dying, "sleep_before_dying", "");
> +  ParseFlag(str, &f->check_malloc_usable_size,
> "check_malloc_usable_size", "");
> +  ParseFlag(str, &f->unmap_shadow_on_exit, "unmap_shadow_on_exit", "");
> +  ParseFlag(str, &f->abort_on_error, "abort_on_error", "");
> +  ParseFlag(str, &f->print_stats, "print_stats", "");
> +  ParseFlag(str, &f->print_legend, "print_legend", "");
> +  ParseFlag(str, &f->atexit, "atexit", "");
> +  ParseFlag(str, &f->coverage, "coverage", "");
> +  ParseFlag(str, &f->disable_core, "disable_core", "");
> +  ParseFlag(str, &f->allow_reexec, "allow_reexec", "");
> +  ParseFlag(str, &f->print_full_thread_history,
> +            "print_full_thread_history", "");
> +  ParseFlag(str, &f->poison_heap, "poison_heap", "");
> +  ParseFlag(str, &f->poison_partial, "poison_partial", "");
> +  ParseFlag(str, &f->alloc_dealloc_mismatch, "alloc_dealloc_mismatch",
> "");
> +  ParseFlag(str, &f->strict_memcmp, "strict_memcmp", "");
> +  ParseFlag(str, &f->strict_init_order, "strict_init_order", "");
> +  ParseFlag(str, &f->start_deactivated, "start_deactivated", "");
>    ParseFlag(str, &f->detect_invalid_pointer_pairs,
> -            "detect_invalid_pointer_pairs");
> +            "detect_invalid_pointer_pairs", "");
>  }
>
>  void InitializeFlags(Flags *f, const char *env) {
> @@ -196,6 +198,9 @@ void InitializeFlags(Flags *f, const cha
>
>    // Override from command line.
>    ParseFlagsFromString(f, env);
> +  if (common_flags()->help) {
> +    PrintFlagDescriptions();
> +  }
>
>  #if !CAN_SANITIZE_LEAKS
>    if (cf->detect_leaks) {
>
> Modified: compiler-rt/trunk/lib/dfsan/dfsan.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/dfsan.cc (original)
> +++ compiler-rt/trunk/lib/dfsan/dfsan.cc Thu Mar 20 07:52:52 2014
> @@ -235,9 +235,9 @@ static void InitializeFlags(Flags &f, co
>    f.warn_nonzero_labels = false;
>    f.strict_data_dependencies = true;
>
> -  ParseFlag(env, &f.warn_unimplemented, "warn_unimplemented");
> -  ParseFlag(env, &f.warn_nonzero_labels, "warn_nonzero_labels");
> -  ParseFlag(env, &f.strict_data_dependencies, "strict_data_dependencies");
> +  ParseFlag(env, &f.warn_unimplemented, "warn_unimplemented", "");
> +  ParseFlag(env, &f.warn_nonzero_labels, "warn_nonzero_labels", "");
> +  ParseFlag(env, &f.strict_data_dependencies, "strict_data_dependencies",
> "");
>  }
>
>  #ifdef DFSAN_NOLIBC
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_common.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_common.cc Thu Mar 20 07:52:52 2014
> @@ -57,23 +57,23 @@ static void InitializeFlags() {
>
>    const char *options = GetEnv("LSAN_OPTIONS");
>    if (options) {
> -    ParseFlag(options, &f->use_registers, "use_registers");
> -    ParseFlag(options, &f->use_globals, "use_globals");
> -    ParseFlag(options, &f->use_stacks, "use_stacks");
> -    ParseFlag(options, &f->use_tls, "use_tls");
> -    ParseFlag(options, &f->use_root_regions, "use_root_regions");
> -    ParseFlag(options, &f->use_unaligned, "use_unaligned");
> -    ParseFlag(options, &f->use_poisoned, "use_poisoned");
> -    ParseFlag(options, &f->report_objects, "report_objects");
> -    ParseFlag(options, &f->resolution, "resolution");
> +    ParseFlag(options, &f->use_registers, "use_registers", "");
> +    ParseFlag(options, &f->use_globals, "use_globals", "");
> +    ParseFlag(options, &f->use_stacks, "use_stacks", "");
> +    ParseFlag(options, &f->use_tls, "use_tls", "");
> +    ParseFlag(options, &f->use_root_regions, "use_root_regions", "");
> +    ParseFlag(options, &f->use_unaligned, "use_unaligned", "");
> +    ParseFlag(options, &f->use_poisoned, "use_poisoned", "");
> +    ParseFlag(options, &f->report_objects, "report_objects", "");
> +    ParseFlag(options, &f->resolution, "resolution", "");
>      CHECK_GE(&f->resolution, 0);
> -    ParseFlag(options, &f->max_leaks, "max_leaks");
> +    ParseFlag(options, &f->max_leaks, "max_leaks", "");
>      CHECK_GE(&f->max_leaks, 0);
> -    ParseFlag(options, &f->log_pointers, "log_pointers");
> -    ParseFlag(options, &f->log_threads, "log_threads");
> -    ParseFlag(options, &f->exitcode, "exitcode");
> -    ParseFlag(options, &f->print_suppressions, "print_suppressions");
> -    ParseFlag(options, &f->suppressions, "suppressions");
> +    ParseFlag(options, &f->log_pointers, "log_pointers", "");
> +    ParseFlag(options, &f->log_threads, "log_threads", "");
> +    ParseFlag(options, &f->exitcode, "exitcode", "");
> +    ParseFlag(options, &f->print_suppressions, "print_suppressions", "");
> +    ParseFlag(options, &f->suppressions, "suppressions", "");
>    }
>  }
>
>
> Modified: compiler-rt/trunk/lib/msan/msan.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/msan.cc (original)
> +++ compiler-rt/trunk/lib/msan/msan.cc Thu Mar 20 07:52:52 2014
> @@ -107,24 +107,24 @@ static atomic_uint32_t NumStackOriginDes
>  static void ParseFlagsFromString(Flags *f, const char *str) {
>    CommonFlags *cf = common_flags();
>    ParseCommonFlagsFromString(cf, str);
> -  ParseFlag(str, &f->poison_heap_with_zeroes, "poison_heap_with_zeroes");
> -  ParseFlag(str, &f->poison_stack_with_zeroes,
> "poison_stack_with_zeroes");
> -  ParseFlag(str, &f->poison_in_malloc, "poison_in_malloc");
> -  ParseFlag(str, &f->poison_in_free, "poison_in_free");
> -  ParseFlag(str, &f->exit_code, "exit_code");
> +  ParseFlag(str, &f->poison_heap_with_zeroes, "poison_heap_with_zeroes",
> "");
> +  ParseFlag(str, &f->poison_stack_with_zeroes,
> "poison_stack_with_zeroes", "");
> +  ParseFlag(str, &f->poison_in_malloc, "poison_in_malloc", "");
> +  ParseFlag(str, &f->poison_in_free, "poison_in_free", "");
> +  ParseFlag(str, &f->exit_code, "exit_code", "");
>    if (f->exit_code < 0 || f->exit_code > 127) {
>      Printf("Exit code not in [0, 128) range: %d\n", f->exit_code);
>      Die();
>    }
> -  ParseFlag(str, &f->report_umrs, "report_umrs");
> -  ParseFlag(str, &f->wrap_signals, "wrap_signals");
> +  ParseFlag(str, &f->report_umrs, "report_umrs", "");
> +  ParseFlag(str, &f->wrap_signals, "wrap_signals", "");
>
>    // keep_going is an old name for halt_on_error,
>    // and it has inverse meaning.
>    f->halt_on_error = !f->halt_on_error;
> -  ParseFlag(str, &f->halt_on_error, "keep_going");
> +  ParseFlag(str, &f->halt_on_error, "keep_going", "");
>    f->halt_on_error = !f->halt_on_error;
> -  ParseFlag(str, &f->halt_on_error, "halt_on_error");
> +  ParseFlag(str, &f->halt_on_error, "halt_on_error", "");
>  }
>
>  static void InitializeFlags(Flags *f, const char *options) {
> @@ -277,6 +277,7 @@ 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();
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc Thu Mar 20
> 07:52:52 2014
> @@ -20,6 +20,14 @@ namespace __sanitizer {
>
>  CommonFlags common_flags_dont_use;
>
> +struct FlagDescriptionList {
> +  const char *name;
> +  const char *description;
> +  FlagDescriptionList *next;
> +};
> +
> +FlagDescriptionList *flag_descriptions = 0, *last_flag_description = 0;
>
+
>  void SetCommonFlagsDefaults(CommonFlags *f) {
>    f->symbolize = true;
>    f->external_symbolizer_path = 0;
> @@ -47,29 +55,31 @@ void SetCommonFlagsDefaults(CommonFlags
>  }
>
>  void ParseCommonFlagsFromString(CommonFlags *f, const char *str) {
> -  ParseFlag(str, &f->symbolize, "symbolize");
> -  ParseFlag(str, &f->external_symbolizer_path,
> "external_symbolizer_path");
> -  ParseFlag(str, &f->allow_addr2line, "allow_addr2line");
> -  ParseFlag(str, &f->strip_path_prefix, "strip_path_prefix");
> -  ParseFlag(str, &f->fast_unwind_on_fatal, "fast_unwind_on_fatal");
> -  ParseFlag(str, &f->fast_unwind_on_malloc, "fast_unwind_on_malloc");
> -  ParseFlag(str, &f->handle_ioctl, "handle_ioctl");
> -  ParseFlag(str, &f->malloc_context_size, "malloc_context_size");
> -  ParseFlag(str, &f->log_path, "log_path");
> -  ParseFlag(str, &f->verbosity, "verbosity");
> -  ParseFlag(str, &f->detect_leaks, "detect_leaks");
> -  ParseFlag(str, &f->leak_check_at_exit, "leak_check_at_exit");
> -  ParseFlag(str, &f->allocator_may_return_null,
> "allocator_may_return_null");
> -  ParseFlag(str, &f->print_summary, "print_summary");
> -  ParseFlag(str, &f->check_printf, "check_printf");
> -  ParseFlag(str, &f->handle_segv, "handle_segv");
> -  ParseFlag(str, &f->allow_user_segv_handler, "allow_user_segv_handler");
> -  ParseFlag(str, &f->use_sigaltstack, "use_sigaltstack");
> -  ParseFlag(str, &f->detect_deadlocks, "detect_deadlocks");
> +  ParseFlag(str, &f->symbolize, "symbolize", "");
> +  ParseFlag(str, &f->external_symbolizer_path,
> "external_symbolizer_path", "");
> +  ParseFlag(str, &f->allow_addr2line, "allow_addr2line", "");
> +  ParseFlag(str, &f->strip_path_prefix, "strip_path_prefix", "");
> +  ParseFlag(str, &f->fast_unwind_on_fatal, "fast_unwind_on_fatal", "");
> +  ParseFlag(str, &f->fast_unwind_on_malloc, "fast_unwind_on_malloc", "");
> +  ParseFlag(str, &f->handle_ioctl, "handle_ioctl", "");
> +  ParseFlag(str, &f->malloc_context_size, "malloc_context_size", "");
> +  ParseFlag(str, &f->log_path, "log_path", "");
> +  ParseFlag(str, &f->verbosity, "verbosity", "");
> +  ParseFlag(str, &f->detect_leaks, "detect_leaks", "");
> +  ParseFlag(str, &f->leak_check_at_exit, "leak_check_at_exit", "");
> +  ParseFlag(str, &f->allocator_may_return_null,
> "allocator_may_return_null",
> +            "");
> +  ParseFlag(str, &f->print_summary, "print_summary", "");
> +  ParseFlag(str, &f->check_printf, "check_printf", "");
> +  ParseFlag(str, &f->handle_segv, "handle_segv", "");
> +  ParseFlag(str, &f->allow_user_segv_handler, "allow_user_segv_handler",
> "");
> +  ParseFlag(str, &f->use_sigaltstack, "use_sigaltstack", "");
> +  ParseFlag(str, &f->detect_deadlocks, "detect_deadlocks", "");
>    ParseFlag(str, &f->clear_shadow_mmap_threshold,
> -            "clear_shadow_mmap_threshold");
> -  ParseFlag(str, &f->color, "color");
> -  ParseFlag(str, &f->legacy_pthread_cond, "legacy_pthread_cond");
> +            "clear_shadow_mmap_threshold", "");
> +  ParseFlag(str, &f->color, "color", "");
> +  ParseFlag(str, &f->legacy_pthread_cond, "legacy_pthread_cond", "");
> +  ParseFlag(str, &f->help, "help", "");
>
>    // Do a sanity check for certain flags.
>    if (f->malloc_context_size < 1)
> @@ -124,9 +134,49 @@ static bool StartsWith(const char *flag,
>           (0 == internal_strncmp(flag, value, value_length));
>  }
>
> -void ParseFlag(const char *env, bool *flag, const char *name) {
> +static LowLevelAllocator allocator_for_flags;
> +
> +// The linear scan is suboptimal, but the number of flags is relatively
> small.
> +bool FlagInDescriptionList(const char *name) {
> +  FlagDescriptionList *descr = flag_descriptions;
> +  while (descr) {
> +    if (!internal_strcmp(descr->name, name)) return true;
> +    descr = descr->next;
> +  }
> +  return false;
> +}
> +
> +void AddFlagDescription(const char *name, const char *description) {
> +  if (FlagInDescriptionList(name)) return;
> +  FlagDescriptionList *new_description =
> +      (FlagDescriptionList*)allocator_for_flags.Allocate(
> +          sizeof(FlagDescriptionList));
>

We have automagic for that:
new_description = new(allocator_for_flags) FlagDescriptionList;


> +  if (!last_flag_description) {
> +    flag_descriptions = new_description;
> +  } else {
> +    last_flag_description->next = new_description;
> +  }
>

Consider re-using IntrusiveList<FlagDescription> instead of re-implementing
it.


> +  new_description->name = name;
> +  new_description->description = description;
> +  new_description->next = 0;
> +  last_flag_description = new_description;
> +}
> +
> +// TODO(glider): put the descriptions inside CommonFlags.
> +void PrintFlagDescriptions() {
> +  FlagDescriptionList *descr = flag_descriptions;
> +  Printf("Available flags for %s:\n", SanitizerToolName);
> +  while (descr) {
> +    Printf("\t%s - %s\n", descr->name, descr->description);
> +    descr = descr->next;
> +  }
> +}
> +
> +void ParseFlag(const char *env, bool *flag,
> +               const char *name, const char *descr) {
>    const char *value;
>    int value_length;
> +  AddFlagDescription(name, descr);
>    if (!GetFlagValue(env, name, &value, &value_length))
>      return;
>    if (StartsWith(value, value_length, "0") ||
> @@ -139,27 +189,31 @@ void ParseFlag(const char *env, bool *fl
>      *flag = true;
>  }
>
> -void ParseFlag(const char *env, int *flag, const char *name) {
> +void ParseFlag(const char *env, int *flag,
> +               const char *name, const char *descr) {
>    const char *value;
>    int value_length;
> +  AddFlagDescription(name, descr);
>    if (!GetFlagValue(env, name, &value, &value_length))
>      return;
>    *flag = static_cast<int>(internal_atoll(value));
>  }
>
> -void ParseFlag(const char *env, uptr *flag, const char *name) {
> +void ParseFlag(const char *env, uptr *flag,
> +               const char *name, const char *descr) {
>    const char *value;
>    int value_length;
> +  AddFlagDescription(name, descr);
>    if (!GetFlagValue(env, name, &value, &value_length))
>      return;
>    *flag = static_cast<uptr>(internal_atoll(value));
>  }
>
> -static LowLevelAllocator allocator_for_flags;
> -
> -void ParseFlag(const char *env, const char **flag, const char *name) {
> +void ParseFlag(const char *env, const char **flag,
> +               const char *name, const char *descr) {
>    const char *value;
>    int value_length;
> +  AddFlagDescription(name, descr);
>    if (!GetFlagValue(env, name, &value, &value_length))
>      return;
>    // Copy the flag value. Don't use locks here, as flags are parsed at
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h Thu Mar 20
> 07:52:52 2014
> @@ -18,10 +18,14 @@
>
>  namespace __sanitizer {
>
> -void ParseFlag(const char *env, bool *flag, const char *name);
> -void ParseFlag(const char *env, int *flag, const char *name);
> -void ParseFlag(const char *env, uptr *flag, const char *name);
> -void ParseFlag(const char *env, const char **flag, const char *name);
> +void ParseFlag(const char *env, bool *flag,
> +    const char *name, const char *descr);
> +void ParseFlag(const char *env, int *flag,
> +    const char *name, const char *descr);
> +void ParseFlag(const char *env, uptr *flag,
> +    const char *name, const char *descr);
> +void ParseFlag(const char *env, const char **flag,
> +    const char *name, const char *descr);
>
>  struct CommonFlags {
>    // If set, use the online symbolizer from common sanitizer runtime to
> turn
> @@ -80,6 +84,8 @@ struct CommonFlags {
>    const char *color;
>    // Enables support for dynamic libraries linked with libpthread 2.2.5.
>    bool legacy_pthread_cond;
> +  // Print help and exit.
> +  bool help;
>  };
>
>  inline CommonFlags *common_flags() {
> @@ -89,6 +95,7 @@ inline CommonFlags *common_flags() {
>
>  void SetCommonFlagsDefaults(CommonFlags *f);
>  void ParseCommonFlagsFromString(CommonFlags *f, const char *str);
> +void PrintFlagDescriptions();
>
>  }  // namespace __sanitizer
>
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_flags_test.cc
> Thu Mar 20 07:52:52 2014
> @@ -24,14 +24,14 @@ static const char kFlagName[] = "flag_na
>  template <typename T>
>  static void TestFlag(T start_value, const char *env, T final_value) {
>    T flag = start_value;
> -  ParseFlag(env, &flag, kFlagName);
> +  ParseFlag(env, &flag, kFlagName, "flag description");
>    EXPECT_EQ(final_value, flag);
>  }
>
>  static void TestStrFlag(const char *start_value, const char *env,
>                          const char *final_value) {
>    const char *flag = start_value;
> -  ParseFlag(env, &flag, kFlagName);
> +  ParseFlag(env, &flag, kFlagName, "flag description");
>    EXPECT_EQ(0, internal_strcmp(final_value, flag));
>  }
>
> @@ -70,8 +70,8 @@ static void TestTwoFlags(const char *env
>                           const char *expected_flag2) {
>    bool flag1 = !expected_flag1;
>    const char *flag2 = "";
> -  ParseFlag(env, &flag1, "flag1");
> -  ParseFlag(env, &flag2, "flag2");
> +  ParseFlag(env, &flag1, "flag1", "flag1 description");
> +  ParseFlag(env, &flag2, "flag2", "flag2 description");
>    EXPECT_EQ(expected_flag1, flag1);
>    EXPECT_EQ(0, internal_strcmp(flag2, expected_flag2));
>  }
>
> Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc (original)
> +++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc Thu Mar 20 07:52:52 2014
> @@ -76,7 +76,7 @@ void InitializeFlags(Flags *f, const cha
>    f->allow_addr2line = true;
>
>    // Override from command line.
> -  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
> +  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack", "");
>    ParseCommonFlagsFromString(f, env);
>
>    // Copy back to common flags.
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=204339&r1=204338&r2=204339&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Thu Mar 20 07:52:52 2014
> @@ -34,34 +34,34 @@ const char *WEAK __tsan_default_options(
>  #endif
>
>  static void ParseFlags(Flags *f, const char *env) {
> -  ParseFlag(env, &f->enable_annotations, "enable_annotations");
> -  ParseFlag(env, &f->suppress_equal_stacks, "suppress_equal_stacks");
> -  ParseFlag(env, &f->suppress_equal_addresses,
> "suppress_equal_addresses");
> -  ParseFlag(env, &f->suppress_java, "suppress_java");
> -  ParseFlag(env, &f->report_bugs, "report_bugs");
> -  ParseFlag(env, &f->report_thread_leaks, "report_thread_leaks");
> -  ParseFlag(env, &f->report_destroy_locked, "report_destroy_locked");
> -  ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe");
> -  ParseFlag(env, &f->report_atomic_races, "report_atomic_races");
> -  ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics");
> -  ParseFlag(env, &f->suppressions, "suppressions");
> -  ParseFlag(env, &f->print_suppressions, "print_suppressions");
> -  ParseFlag(env, &f->print_benign, "print_benign");
> -  ParseFlag(env, &f->exitcode, "exitcode");
> -  ParseFlag(env, &f->halt_on_error, "halt_on_error");
> -  ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms");
> -  ParseFlag(env, &f->profile_memory, "profile_memory");
> -  ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms");
> -  ParseFlag(env, &f->flush_symbolizer_ms, "flush_symbolizer_ms");
> -  ParseFlag(env, &f->memory_limit_mb, "memory_limit_mb");
> -  ParseFlag(env, &f->stop_on_start, "stop_on_start");
> -  ParseFlag(env, &f->running_on_valgrind, "running_on_valgrind");
> -  ParseFlag(env, &f->history_size, "history_size");
> -  ParseFlag(env, &f->io_sync, "io_sync");
> -  ParseFlag(env, &f->die_after_fork, "die_after_fork");
> +  ParseFlag(env, &f->enable_annotations, "enable_annotations", "");
> +  ParseFlag(env, &f->suppress_equal_stacks, "suppress_equal_stacks", "");
> +  ParseFlag(env, &f->suppress_equal_addresses,
> "suppress_equal_addresses", "");
> +  ParseFlag(env, &f->suppress_java, "suppress_java", "");
> +  ParseFlag(env, &f->report_bugs, "report_bugs", "");
> +  ParseFlag(env, &f->report_thread_leaks, "report_thread_leaks", "");
> +  ParseFlag(env, &f->report_destroy_locked, "report_destroy_locked", "");
> +  ParseFlag(env, &f->report_signal_unsafe, "report_signal_unsafe", "");
> +  ParseFlag(env, &f->report_atomic_races, "report_atomic_races", "");
> +  ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics", "");
> +  ParseFlag(env, &f->suppressions, "suppressions", "");
> +  ParseFlag(env, &f->print_suppressions, "print_suppressions", "");
> +  ParseFlag(env, &f->print_benign, "print_benign", "");
> +  ParseFlag(env, &f->exitcode, "exitcode", "");
> +  ParseFlag(env, &f->halt_on_error, "halt_on_error", "");
> +  ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms", "");
> +  ParseFlag(env, &f->profile_memory, "profile_memory", "");
> +  ParseFlag(env, &f->flush_memory_ms, "flush_memory_ms", "");
> +  ParseFlag(env, &f->flush_symbolizer_ms, "flush_symbolizer_ms", "");
> +  ParseFlag(env, &f->memory_limit_mb, "memory_limit_mb", "");
> +  ParseFlag(env, &f->stop_on_start, "stop_on_start", "");
> +  ParseFlag(env, &f->running_on_valgrind, "running_on_valgrind", "");
> +  ParseFlag(env, &f->history_size, "history_size", "");
> +  ParseFlag(env, &f->io_sync, "io_sync", "");
> +  ParseFlag(env, &f->die_after_fork, "die_after_fork", "");
>
>    // DDFlags
> -  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
> +  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack", "");
>  }
>
>  void InitializeFlags(Flags *f, const char *env) {
> @@ -118,6 +118,8 @@ void InitializeFlags(Flags *f, const cha
>      f->report_signal_unsafe = false;
>    }
>
> +  if (f->help) PrintFlagDescriptions();
> +
>    if (f->history_size < 0 || f->history_size > 7) {
>      Printf("ThreadSanitizer: incorrect value for history_size"
>             " (must be [0..7])\n");
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140320/4cc1e4e6/attachment.html>


More information about the llvm-commits mailing list