//===----------------------- InitMap.cpp ------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "InitMap.h" using namespace clang; using namespace clang::interp; bool InitMap::initializeElement(unsigned I) { unsigned Bucket = I / PER_FIELD; T Mask = T(1) << (I % PER_FIELD); if (!(data()[Bucket] & Mask)) { data()[Bucket] |= Mask; UninitFields -= 1; } return UninitFields == 0; } bool InitMap::isElementInitialized(unsigned I) const { if (UninitFields == 0) return true; unsigned Bucket = I / PER_FIELD; return data()[Bucket] & (T(1) << (I % PER_FIELD)); } // Values in the second half of data() are inverted, // i.e. 0 means "lifetime started". void InitMap::startElementLifetime(unsigned I) { unsigned LifetimeIndex = NumElems + I; unsigned Bucket = numFields(NumElems) / 2 + (I / PER_FIELD); T Mask = T(1) << (LifetimeIndex % PER_FIELD); if ((data()[Bucket] & Mask)) { data()[Bucket] &= ~Mask; --DeadFields; } } // Values in the second half of data() are inverted, // i.e. 0 means "lifetime started". void InitMap::endElementLifetime(unsigned I) { unsigned LifetimeIndex = NumElems + I; unsigned Bucket = numFields(NumElems) / 2 + (I / PER_FIELD); T Mask = T(1) << (LifetimeIndex % PER_FIELD); if (!(data()[Bucket] & Mask)) { data()[Bucket] |= Mask; ++DeadFields; } }