LLVM: include/llvm/ADT/FunctionExtras.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32#ifndef LLVM_ADT_FUNCTIONEXTRAS_H

33#define LLVM_ADT_FUNCTIONEXTRAS_H

34

41#include

42#include <type_traits>

43

44namespace llvm {

45

46

47

48

49

50

51

52

53

54

55

57

59

60template <typename CallableT, typename ThisT>

62 std::enable_if_t<!std::is_same<remove_cvref_t, ThisT>::value>;

63template <typename CallableT, typename Ret, typename... Params>

65 std::is_void,

66 std::is_same<decltype(std::declval()(std::declval()...)),

67 Ret>,

68 std::is_same<const decltype(std::declval()(

69 std::declval()...)),

70 Ret>,

71 std::is_convertible<decltype(std::declval()(

72 std::declval()...)),

74

76protected:

79

80

81

82

83

84

85

86

87

88

90 static_assert(!std::is_reference::value,

91 "references should be handled by template specialization");

93 sizeof(T) <= 2 * sizeof(void *);

95 std::conditional_t<std::is_trivially_copy_constructible::value &&

96 std::is_trivially_move_constructible::value &&

98 T, T &>;

99 };

100

101

102

103

106

107 template

109

110

111

112 using CallPtrT = ReturnT (*)(void *CallableAddr,

114 using MovePtrT = void (*)(void *LHSCallableAddr, void *RHSCallableAddr);

116

117

118

122

123

124

130

131

132

133

136

137

138

140

141

147 static_assert(

149 "Should always use all of the out-of-line storage for inline storage!");

150

151

152

153

154

158

159

160

161

163

165

169

173

177

182

183

184

185

186

187

188

196

203

207

208 template

209 static ReturnT CallImpl(void *CallableAddr,

211 auto &Func = *reinterpret_cast<CalledAsT *>(CallableAddr);

212 return Func(std::forward(Params)...);

213 }

214

215 template

216 static void MoveImpl(void *LHSCallableAddr, void *RHSCallableAddr) noexcept {

217 new (LHSCallableAddr)

218 CallableT(std::move(*reinterpret_cast<CallableT *>(RHSCallableAddr)));

219 }

220

221 template

222 static void DestroyImpl(void *CallableAddr) noexcept {

223 reinterpret_cast<CallableT *>(CallableAddr)->~CallableT();

224 }

225

226

227

228

229

230

231

232

233 template <typename CallableT, typename CalledAs> struct CallbacksHolder {

234 inline static auto Callbacks = []() constexpr {

235

236

237 if constexpr (std::is_trivially_move_constructible_v &&

238 std::is_trivially_destructible_v)

240 else

243 }();

244 };

245

246

247 template struct CalledAs {};

248

249

250

251

252 template <typename CallableT, typename CalledAsT>

254 bool IsInlineStorage = true;

258 IsInlineStorage = false;

259

260

261 auto Size = sizeof(CallableT);

262 auto Alignment = alignof(CallableT);

265 }

266

267

268 new (CallableAddr) CallableT(std::move(Callable));

271 }

272

275 return;

276

277

279

283

284 if (!IsInlineStorage)

287 }

288

290

292

293

294 if (RHS)

295 return;

296

298

299 StorageUnion.OutOfLineStorage = RHS.StorageUnion.OutOfLineStorage;

301

303 } else {

304

306 RHS.getInlineStorage());

308 }

309

310

311 RHS.CallbackAndInlineFlag = {};

312

313#if !defined(NDEBUG) && !LLVM_ADDRESS_SANITIZER_BUILD

314

315

316

318#endif

319 }

320

322 if (this == &RHS)

323 return *this;

324

325

326

327

330 return *this;

331 }

332

334

335public:

336 explicit operator bool() const {

338 }

339};

340

341}

342

343template <typename R, typename... P>

346

347public:

354

355 template

357 CallableT Callable,

360 : Base(std::forward(Callable),

361 typename Base::template CalledAs{}) {}

362

366};

367

368template <typename R, typename... P>

372

373public:

380

381 template

383 CallableT Callable,

386 : Base(std::forward(Callable),

387 typename Base::template CalledAs<const CallableT>{}) {}

388

392};

393

394}

395

396#endif

This file defines counterparts of C library allocation functions defined in the namespace 'std'.

This file defines the PointerIntPair class.

This file defines the PointerUnion class, which is a discriminated union of pointer types.

This file contains library features backported from future STL versions.

PointerIntPair - This class implements a pair of a pointer and small integer.

A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...

Definition FunctionExtras.h:75

CallPtrT getCallPtr() const

Definition FunctionExtras.h:178

void(*)(void *LHSCallableAddr, void *RHSCallableAddr) MovePtrT

Definition FunctionExtras.h:114

void * getInlineStorage() const

Definition FunctionExtras.h:192

CallPtrT getTrivialCallback() const

Definition FunctionExtras.h:170

PointerIntPair< CallbackPointerUnionT, 1, bool > CallbackAndInlineFlag

Definition FunctionExtras.h:162

UniqueFunctionBase()=default

~UniqueFunctionBase()

Definition FunctionExtras.h:273

void * getOutOfLineStorage() const

Definition FunctionExtras.h:193

void setOutOfLineStorage(void *Ptr, size_t Size, size_t Alignment)

Definition FunctionExtras.h:204

UniqueFunctionBase & operator=(UniqueFunctionBase &&RHS) noexcept

Definition FunctionExtras.h:321

typename AdjustedParamTBase< T >::type AdjustedParamT

Definition FunctionExtras.h:108

NonTrivialCallbacks * getNonTrivialCallbacks() const

Definition FunctionExtras.h:174

PointerUnion< TrivialCallback *, NonTrivialCallbacks * > CallbackPointerUnionT

Definition FunctionExtras.h:134

UniqueFunctionBase(CallableT Callable, CalledAs< CalledAsT >)

Definition FunctionExtras.h:253

static void MoveImpl(void *LHSCallableAddr, void *RHSCallableAddr) noexcept

Definition FunctionExtras.h:216

static void DestroyImpl(void *CallableAddr) noexcept

Definition FunctionExtras.h:222

bool isInlineStorage() const

Definition FunctionExtras.h:164

size_t getOutOfLineStorageSize() const

Definition FunctionExtras.h:197

static ReturnT CallImpl(void *CallableAddr, AdjustedParamT< ParamTs >... Params)

Definition FunctionExtras.h:209

void * getCalleePtr() const

Definition FunctionExtras.h:189

static constexpr size_t InlineStorageAlign

Definition FunctionExtras.h:78

size_t getOutOfLineStorageAlignment() const

Definition FunctionExtras.h:200

union llvm::detail::UniqueFunctionBase::StorageUnionT StorageUnion

void(*)(void *CallableAddr) DestroyPtrT

Definition FunctionExtras.h:115

ReturnT(*)(void *CallableAddr, AdjustedParamT< ParamTs >... Params) CallPtrT

Definition FunctionExtras.h:112

UniqueFunctionBase(UniqueFunctionBase &&RHS) noexcept

Definition FunctionExtras.h:289

bool isTrivialCallback() const

Definition FunctionExtras.h:166

static constexpr size_t InlineStorageSize

Definition FunctionExtras.h:77

unique_function(std::nullptr_t)

Definition FunctionExtras.h:375

unique_function()=default

unique_function(const unique_function &)=delete

unique_function(unique_function &&)=default

unique_function & operator=(const unique_function &)=delete

unique_function & operator=(unique_function &&)=default

R operator()(P... Params) const

Definition FunctionExtras.h:389

unique_function(CallableT Callable, detail::EnableUnlessSameType< CallableT, unique_function > *=nullptr, detail::EnableIfCallable< const CallableT, R, P... > *=nullptr)

Definition FunctionExtras.h:382

unique_function(unique_function &&)=default

unique_function & operator=(const unique_function &)=delete

unique_function(CallableT Callable, detail::EnableUnlessSameType< CallableT, unique_function > *=nullptr, detail::EnableIfCallable< CallableT, R, P... > *=nullptr)

Definition FunctionExtras.h:356

unique_function & operator=(unique_function &&)=default

R operator()(P... Params)

Definition FunctionExtras.h:363

unique_function()=default

unique_function(std::nullptr_t)

Definition FunctionExtras.h:349

unique_function(const unique_function &)=delete

unique_function is a type-erasing functor similar to std::function.

Definition FunctionExtras.h:56

std::enable_if_t<!std::is_same< remove_cvref_t< CallableT >, ThisT >::value > EnableUnlessSameType

Definition FunctionExtras.h:61

const char unit< Period >::value[]

std::enable_if_t< std::disjunction< std::is_void< Ret >, std::is_same< decltype(std::declval< CallableT >()(std::declval< Params >()...)), Ret >, std::is_same< const decltype(std::declval< CallableT >()( std::declval< Params >()...)), Ret >, std::is_convertible< decltype(std::declval< CallableT >()( std::declval< Params >()...)), Ret > >::value > EnableIfCallable

Definition FunctionExtras.h:64

This is an optimization pass for GlobalISel generic memory operations.

LLVM_ABI LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void * allocate_buffer(size_t Size, size_t Alignment)

Allocate a buffer of memory with the given size and alignment.

LLVM_ABI void deallocate_buffer(void *Ptr, size_t Size, size_t Alignment)

Deallocate a buffer of memory with the given size and alignment.

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

Implement std::hash so that hash_code can be used in STL containers.

T & type

Definition FunctionExtras.h:104

T & type

Definition FunctionExtras.h:105

Definition FunctionExtras.h:89

std::conditional_t< std::is_trivially_copy_constructible< T >::value && std::is_trivially_move_constructible< T >::value && IsSizeLessThanThreshold, T, T & > type

Definition FunctionExtras.h:94

static constexpr bool IsSizeLessThanThreshold

Definition FunctionExtras.h:92

Definition FunctionExtras.h:233

static auto Callbacks

Definition FunctionExtras.h:234

Definition FunctionExtras.h:247

A struct we use to aggregate three callbacks when we need full set of operations.

Definition FunctionExtras.h:125

DestroyPtrT DestroyPtr

Definition FunctionExtras.h:128

MovePtrT MovePtr

Definition FunctionExtras.h:127

CallPtrT CallPtr

Definition FunctionExtras.h:126

Definition FunctionExtras.h:142

void * StoragePtr

Definition FunctionExtras.h:143

size_t Alignment

Definition FunctionExtras.h:145

size_t Size

Definition FunctionExtras.h:144

A struct to hold a single trivial callback with sufficient alignment for our bitpacking.

Definition FunctionExtras.h:119

CallPtrT CallPtr

Definition FunctionExtras.h:120

Definition FunctionExtras.h:139

struct llvm::detail::UniqueFunctionBase::StorageUnionT::OutOfLineStorageT OutOfLineStorage

std::byte InlineStorage[InlineStorageSize]

Definition FunctionExtras.h:156