1/*
2 * kmp_utils.h -- Utilities that used internally
3 */
4
5//===----------------------------------------------------------------------===//
6//
7// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8// See https://llvm.org/LICENSE.txt for license information.
9// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10//
11//===----------------------------------------------------------------------===//
12#ifndef __KMP_UTILS_H__
13#define __KMP_UTILS_H__
14
15#include <cstddef>
16
17#include "kmp.h"
18
19/// A simple pure header implementation of VLA that aims to replace uses of
20/// actual VLA, which can cause compile warning. This class by default creates a
21/// stack buffer that can accomodate \p N elements. If the number of elements is
22/// greater than \p N, then a heap buffer will be allocated and used to
23/// accomodate the elements. Similar to the actual VLA, we don't check boundary
24/// (for now), so we will not store the number of elements. We can always revise
25/// it later.
26template <typename T, unsigned N = 8> class SimpleVLA final {
27  T StackBuffer[N];
28  T *HeapBuffer = nullptr;
29  T *Ptr = StackBuffer;
30
31public:
32  SimpleVLA() = delete;
33  SimpleVLA(const SimpleVLA &) = delete;
34  SimpleVLA(SimpleVLA &&) = delete;
35  SimpleVLA &operator=(const SimpleVLA &) = delete;
36  SimpleVLA &operator=(SimpleVLA &&) = delete;
37
38  explicit SimpleVLA(unsigned NumOfElements) noexcept {
39    if (NumOfElements > N) {
40      HeapBuffer =
41          reinterpret_cast<T *>(__kmp_allocate(NumOfElements * sizeof(T)));
42      Ptr = HeapBuffer;
43    }
44  }
45
46  ~SimpleVLA() {
47    if (HeapBuffer)
48      __kmp_free(HeapBuffer);
49  }
50
51  operator T *() noexcept { return Ptr; }
52  operator const T *() const noexcept { return Ptr; }
53};
54
55#endif
56