//===-- 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
