brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 5bfa700 Raw
141 lines · c
1//===-- allocator_config_wrapper.h ------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef SCUDO_ALLOCATOR_CONFIG_WRAPPER_H_10#define SCUDO_ALLOCATOR_CONFIG_WRAPPER_H_11 12#include "condition_variable.h"13#include "internal_defs.h"14#include "secondary.h"15#include "type_traits.h"16 17namespace scudo {18 19#define OPTIONAL_TEMPLATE(TYPE, NAME, DEFAULT, MEMBER)                         \20  template <typename Config, typename = TYPE> struct NAME##State {             \21    static constexpr removeConst<TYPE>::type getValue() { return DEFAULT; }    \22  };                                                                           \23  template <typename Config>                                                   \24  struct NAME##State<                                                          \25      Config, typename assertSameType<decltype(Config::MEMBER), TYPE>::type> { \26    static constexpr removeConst<TYPE>::type getValue() {                      \27      return Config::MEMBER;                                                   \28    }                                                                          \29  };30 31#define OPTIONAL_TYPE_TEMPLATE(NAME, DEFAULT, MEMBER)                          \32  template <typename Config, typename Void = void> struct NAME##Type {         \33    static constexpr bool enabled() { return false; }                          \34    using NAME = DEFAULT;                                                      \35  };                                                                           \36  template <typename Config>                                                   \37  struct NAME##Type<Config,                                                    \38                    typename voidAdaptor<typename Config::MEMBER>::type> {     \39    static constexpr bool enabled() { return true; }                           \40    using NAME = typename Config::MEMBER;                                      \41  };42 43template <typename AllocatorConfig> struct BaseConfig {44#define BASE_REQUIRED_TEMPLATE_TYPE(NAME)                                      \45  template <typename T> using NAME = typename AllocatorConfig::template NAME<T>;46 47#define BASE_OPTIONAL(TYPE, NAME, DEFAULT)                                     \48  OPTIONAL_TEMPLATE(TYPE, NAME, DEFAULT, NAME)                                 \49  static constexpr removeConst<TYPE>::type get##NAME() {                       \50    return NAME##State<AllocatorConfig>::getValue();                           \51  }52 53#include "allocator_config.def"54}; // BaseConfig55 56template <typename AllocatorConfig> struct PrimaryConfig {57  // TODO: Pass this flag through template argument to remove this hard-coded58  //       function.59  static constexpr bool getMaySupportMemoryTagging() {60    return BaseConfig<AllocatorConfig>::getMaySupportMemoryTagging();61  }62 63  static constexpr bool getQuarantineDisabled() {64    return BaseConfig<AllocatorConfig>::getQuarantineDisabled();65  }66 67#define PRIMARY_REQUIRED_TYPE(NAME)                                            \68  using NAME = typename AllocatorConfig::Primary::NAME;69 70#define PRIMARY_REQUIRED(TYPE, NAME)                                           \71  static constexpr removeConst<TYPE>::type get##NAME() {                       \72    return AllocatorConfig::Primary::NAME;                                     \73  }74 75#define PRIMARY_OPTIONAL(TYPE, NAME, DEFAULT)                                  \76  OPTIONAL_TEMPLATE(TYPE, NAME, DEFAULT, NAME)                                 \77  static constexpr removeConst<TYPE>::type get##NAME() {                       \78    return NAME##State<typename AllocatorConfig::Primary>::getValue();         \79  }80 81#define PRIMARY_OPTIONAL_TYPE(NAME, DEFAULT)                                   \82  OPTIONAL_TYPE_TEMPLATE(NAME, DEFAULT, NAME)                                  \83  static constexpr bool has##NAME() {                                          \84    return NAME##Type<typename AllocatorConfig::Primary>::enabled();           \85  }                                                                            \86  using NAME = typename NAME##Type<typename AllocatorConfig::Primary>::NAME;87 88#include "allocator_config.def"89 90}; // PrimaryConfig91 92template <typename AllocatorConfig> struct SecondaryConfig {93  // TODO: Pass this flag through template argument to remove this hard-coded94  //       function.95  static constexpr bool getMaySupportMemoryTagging() {96    return BaseConfig<AllocatorConfig>::getMaySupportMemoryTagging();97  }98 99  static constexpr bool getQuarantineDisabled() {100    return BaseConfig<AllocatorConfig>::getQuarantineDisabled();101  }102 103#define SECONDARY_REQUIRED_TEMPLATE_TYPE(NAME)                                 \104  template <typename T>                                                        \105  using NAME = typename AllocatorConfig::Secondary::template NAME<T>;106 107#define SECONDARY_OPTIONAL(TYPE, NAME, DEFAULT)                                \108  OPTIONAL_TEMPLATE(TYPE, NAME, DEFAULT, NAME)                                 \109  static constexpr removeConst<TYPE>::type get##NAME() {                       \110    return NAME##State<typename AllocatorConfig::Secondary>::getValue();       \111  }112 113#include "allocator_config.def"114 115  struct CacheConfig {116    // TODO: Pass this flag through template argument to remove this hard-coded117    //       function.118    static constexpr bool getMaySupportMemoryTagging() {119      return BaseConfig<AllocatorConfig>::getMaySupportMemoryTagging();120    }121 122    static constexpr bool getQuarantineDisabled() {123      return BaseConfig<AllocatorConfig>::getQuarantineDisabled();124    }125 126#define SECONDARY_CACHE_OPTIONAL(TYPE, NAME, DEFAULT)                          \127  OPTIONAL_TEMPLATE(TYPE, NAME, DEFAULT, Cache::NAME)                          \128  static constexpr removeConst<TYPE>::type get##NAME() {                       \129    return NAME##State<typename AllocatorConfig::Secondary>::getValue();       \130  }131#include "allocator_config.def"132  }; // CacheConfig133};   // SecondaryConfig134 135#undef OPTIONAL_TEMPLATE136#undef OPTIONAL_TEMPLATE_TYPE137 138} // namespace scudo139 140#endif // SCUDO_ALLOCATOR_CONFIG_WRAPPER_H_141