[compiler-rt] r226175 - [sanitizer] Implement include= option.

Hal Finkel hfinkel at anl.gov
Fri Jan 16 19:36:09 PST 2015


----- Original Message -----
> From: "Evgeniy Stepanov" <eugeni.stepanov at gmail.com>
> To: llvm-commits at cs.uiuc.edu
> Sent: Thursday, January 15, 2015 10:27:00 AM
> Subject: [compiler-rt] r226175 - [sanitizer] Implement include= option.
> 
> Author: eugenis
> Date: Thu Jan 15 10:26:59 2015
> New Revision: 226175
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=226175&view=rev
> Log:
> [sanitizer] Implement include= option.
> 
> Allows loading sanitizer options from file.
> 
> Added:
>     compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc
>       (with props)
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc
> 
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc?rev=226175&r1=226174&r2=226175&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.cc
> Thu Jan 15 10:26:59 2015
> @@ -71,10 +71,7 @@ void FlagParser::parse_flag() {
>    InternalFree((void *)value);
>  }
>  
> -void FlagParser::ParseString(const char *s) {
> -  if (!s) return;
> -  buf_ = s;
> -  pos_ = 0;
> +void FlagParser::parse_flags() {
>    while (true) {
>      skip_whitespace();
>      if (buf_[pos_] == 0) break;
> @@ -86,6 +83,20 @@ void FlagParser::ParseString(const char
>      common_flags_dont_use.malloc_context_size = 1;
>  }
>  
> +void FlagParser::ParseString(const char *s) {
> +  if (!s) return;
> +  // Backup current parser state to allow nested ParseString()
> calls.
> +  const char *old_buf_ = buf_;
> +  uptr old_pos_ = pos_;
> +  buf_ = s;
> +  pos_ = 0;
> +
> +  parse_flags();
> +
> +  buf_ = old_buf_;
> +  pos_ = old_pos_;
> +}
> +
>  bool FlagParser::run_handler(const char *name, const char *value) {
>    for (int i = 0; i < n_flags_; ++i) {
>      if (internal_strcmp(name, flags_[i].name) == 0)
> 
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h?rev=226175&r1=226174&r2=226175&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flag_parser.h
> Thu Jan 15 10:26:59 2015
> @@ -101,6 +101,7 @@ class FlagParser {
>    void fatal_error(const char *err);
>    bool is_space(char c);
>    void skip_whitespace();
> +  void parse_flags();
>    void parse_flag();
>    bool run_handler(const char *name, const char *value);
>  };
> 
> 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=226175&r1=226174&r2=226175&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc Thu Jan
> 15 10:26:59 2015
> @@ -45,11 +45,37 @@ void CommonFlags::CopyFrom(const CommonF
>    internal_memcpy(this, &other, sizeof(*this));
>  }
>  
> +class FlagHandlerInclude : public FlagHandlerBase {
> +  static const uptr kMaxIncludeSize = 1 << 15;
> +  FlagParser *parser_;
> +
> + public:
> +  explicit FlagHandlerInclude(FlagParser *parser) : parser_(parser)
> {}
> +  bool Parse(const char *value) {
> +    char *data;
> +    uptr data_mapped_size;
> +    uptr len =
> +        ReadFileToBuffer(value, &data, &data_mapped_size,
> kMaxIncludeSize);

I adjusted this slightly in r226368 to that this will work on systems with a page size larger than kMaxIncludeSize == 1 << 15. Bumping this to 1 << 16 will also work for me; I don't have a strong preference. Feel free to adjust my adjustment ;)

Thanks again,
Hal

> +    if (!len) {
> +      Printf("Failed to read options from '%s'\n", value);
> +      return false;
> +    }
> +    parser_->ParseString(data);
> +    UnmapOrDie(data, data_mapped_size);
> +    return true;
> +  }
> +};
> +
>  void RegisterCommonFlags(FlagParser *parser, CommonFlags *cf) {
>  #define COMMON_FLAG(Type, Name, DefaultValue, Description) \
>    RegisterFlag(parser, #Name, Description, &cf->Name);
>  #include "sanitizer_flags.inc"
>  #undef COMMON_FLAG
> +
> +  FlagHandlerInclude *fh_include =
> +      new (INTERNAL_ALLOC) FlagHandlerInclude(parser);  // NOLINT
> +  parser->RegisterHandler("include", fh_include,
> +                          "read more options from the given file");
>  }
>  
>  }  // namespace __sanitizer
> 
> Added: compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc?rev=226175&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc
> (added)
> +++ compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc Thu
> Jan 15 10:26:59 2015
> @@ -0,0 +1,16 @@
> +// RUN: %clangxx_asan -O0 %s -o %t
> +// RUN: echo "symbolize=1\ninclude='%t.options2.txt'" >
> %t.options1.txt
> +// RUN: echo "verbosity=1" > %t.options2.txt
> +// RUN: ASAN_OPTIONS="verbosity=0:include='%t.options2.txt'" %run %t
> 2>&1 | FileCheck %s --check-prefix=CHECK-VERBOSITY1
> +// RUN: ASAN_OPTIONS="include='%t.options2.txt',verbosity=0" %run %t
> 2>&1 | FileCheck %s --check-prefix=CHECK-VERBOSITY0
> +// RUN:
> ASAN_OPTIONS="include='%t.options-not-found.txt',verbosity=0" not
> %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOT-FOUND
> +
> +#include <stdio.h>
> +
> +int main() {
> +  fprintf(stderr, "done\n");
> +}
> +
> +// CHECK-VERBOSITY1: Parsed ASAN_OPTIONS:
> +// CHECK-VERBOSITY0-NOT: Parsed ASAN_OPTIONS:
> +// CHECK-NOT-FOUND: Failed to read options from
> 
> Propchange:
> compiler-rt/trunk/test/asan/TestCases/asan_options-include.cc
> ------------------------------------------------------------------------------
>     svn:eol-style = LF
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list