forked from OSchip/llvm-project
88 lines
2.5 KiB
C++
88 lines
2.5 KiB
C++
//===-- sanitizer_flags.cc ------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of ThreadSanitizer/AddressSanitizer runtime.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "sanitizer_flags.h"
|
|
|
|
#include "sanitizer_common.h"
|
|
#include "sanitizer_libc.h"
|
|
#include "sanitizer_list.h"
|
|
#include "sanitizer_flag_parser.h"
|
|
|
|
namespace __sanitizer {
|
|
|
|
CommonFlags common_flags_dont_use;
|
|
|
|
struct FlagDescription {
|
|
const char *name;
|
|
const char *description;
|
|
FlagDescription *next;
|
|
};
|
|
|
|
IntrusiveList<FlagDescription> flag_descriptions;
|
|
|
|
// If set, the tool will install its own SEGV signal handler by default.
|
|
#ifndef SANITIZER_NEEDS_SEGV
|
|
# define SANITIZER_NEEDS_SEGV 1
|
|
#endif
|
|
|
|
void CommonFlags::SetDefaults() {
|
|
#define COMMON_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
|
|
#include "sanitizer_flags.inc"
|
|
#undef COMMON_FLAG
|
|
}
|
|
|
|
void CommonFlags::CopyFrom(const CommonFlags &other) {
|
|
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) final {
|
|
char *data;
|
|
uptr data_mapped_size;
|
|
error_t err;
|
|
uptr len =
|
|
ReadFileToBuffer(value, &data, &data_mapped_size,
|
|
Max(kMaxIncludeSize, GetPageSizeCached()), &err);
|
|
if (!len) {
|
|
Printf("Failed to read options from '%s': error %d\n", value, err);
|
|
return false;
|
|
}
|
|
parser_->ParseString(data);
|
|
UnmapOrDie(data, data_mapped_size);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
void RegisterIncludeFlag(FlagParser *parser, CommonFlags *cf) {
|
|
FlagHandlerInclude *fh_include =
|
|
new (FlagParser::Alloc) FlagHandlerInclude(parser); // NOLINT
|
|
parser->RegisterHandler("include", fh_include,
|
|
"read more options from the given file");
|
|
}
|
|
|
|
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
|
|
|
|
RegisterIncludeFlag(parser, cf);
|
|
}
|
|
|
|
} // namespace __sanitizer
|