1//===----------------------- InitMap.cpp ------------------------*- 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-exception
6//
7//===----------------------------------------------------------------------===//
8#include "InitMap.h"
9
10using namespace clang;
11using namespace clang::interp;
12
13bool InitMap::initializeElement(unsigned I) {
14 unsigned Bucket = I / PER_FIELD;
15 T Mask = T(1) << (I % PER_FIELD);
16 if (!(data()[Bucket] & Mask)) {
17 data()[Bucket] |= Mask;
18 UninitFields -= 1;
19 }
20 return UninitFields == 0;
21}
22
23bool InitMap::isElementInitialized(unsigned I) const {
24 if (UninitFields == 0)
25 return true;
26 unsigned Bucket = I / PER_FIELD;
27 return data()[Bucket] & (T(1) << (I % PER_FIELD));
28}
29
30// Values in the second half of data() are inverted,
31// i.e. 0 means "lifetime started".
32void InitMap::startElementLifetime(unsigned I) {
33 unsigned LifetimeIndex = NumElems + I;
34
35 unsigned Bucket = numFields(N: NumElems) / 2 + (I / PER_FIELD);
36 T Mask = T(1) << (LifetimeIndex % PER_FIELD);
37 if ((data()[Bucket] & Mask)) {
38 data()[Bucket] &= ~Mask;
39 --DeadFields;
40 }
41}
42
43// Values in the second half of data() are inverted,
44// i.e. 0 means "lifetime started".
45void InitMap::endElementLifetime(unsigned I) {
46 unsigned LifetimeIndex = NumElems + I;
47
48 unsigned Bucket = numFields(N: NumElems) / 2 + (I / PER_FIELD);
49 T Mask = T(1) << (LifetimeIndex % PER_FIELD);
50 if (!(data()[Bucket] & Mask)) {
51 data()[Bucket] |= Mask;
52 ++DeadFields;
53 }
54}
55