[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