1ca89f3a1SDaniel Sanders //===- Types.cpp - Helper for the selection of C++ data types. ------------===// 2ca89f3a1SDaniel Sanders // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ca89f3a1SDaniel Sanders // 7ca89f3a1SDaniel Sanders //===----------------------------------------------------------------------===// 8ca89f3a1SDaniel Sanders 9ca89f3a1SDaniel Sanders #include "Types.h" 10ca89f3a1SDaniel Sanders 11ca89f3a1SDaniel Sanders // For LLVM_ATTRIBUTE_UNUSED 12ca89f3a1SDaniel Sanders #include "llvm/Support/Compiler.h" 13ca89f3a1SDaniel Sanders 14ca89f3a1SDaniel Sanders #include <cassert> 15ca89f3a1SDaniel Sanders 16ca89f3a1SDaniel Sanders using namespace llvm; 17ca89f3a1SDaniel Sanders getMinimalTypeForRange(uint64_t Range,unsigned MaxSize LLVM_ATTRIBUTE_UNUSED)18ca89f3a1SDaniel Sandersconst char *llvm::getMinimalTypeForRange(uint64_t Range, unsigned MaxSize LLVM_ATTRIBUTE_UNUSED) { 19ca89f3a1SDaniel Sanders // TODO: The original callers only used 32 and 64 so these are the only 20ca89f3a1SDaniel Sanders // values permitted. Rather than widen the supported values we should 21ca89f3a1SDaniel Sanders // allow 64 for the callers that currently use 32 and remove the 22ca89f3a1SDaniel Sanders // argument altogether. 23ca89f3a1SDaniel Sanders assert((MaxSize == 32 || MaxSize == 64) && "Unexpected size"); 24ca89f3a1SDaniel Sanders assert(MaxSize <= 64 && "Unexpected size"); 25ca89f3a1SDaniel Sanders assert(((MaxSize > 32) ? Range <= 0xFFFFFFFFFFFFFFFFULL 26ca89f3a1SDaniel Sanders : Range <= 0xFFFFFFFFULL) && 27ca89f3a1SDaniel Sanders "Enum too large"); 28ca89f3a1SDaniel Sanders 29ca89f3a1SDaniel Sanders if (Range > 0xFFFFFFFFULL) 30ca89f3a1SDaniel Sanders return "uint64_t"; 31ca89f3a1SDaniel Sanders if (Range > 0xFFFF) 32ca89f3a1SDaniel Sanders return "uint32_t"; 33ca89f3a1SDaniel Sanders if (Range > 0xFF) 34ca89f3a1SDaniel Sanders return "uint16_t"; 35ca89f3a1SDaniel Sanders return "uint8_t"; 36ca89f3a1SDaniel Sanders } 3772db2a39SDaniel Sanders getMinimalTypeForEnumBitfield(uint64_t Size)3872db2a39SDaniel Sandersconst char *llvm::getMinimalTypeForEnumBitfield(uint64_t Size) { 3972db2a39SDaniel Sanders uint64_t MaxIndex = Size; 4072db2a39SDaniel Sanders if (MaxIndex > 0) 4172db2a39SDaniel Sanders MaxIndex--; 42e7b0d660SDaniel Sanders assert(MaxIndex <= 64 && "Too many bits"); 4372db2a39SDaniel Sanders return getMinimalTypeForRange(1ULL << MaxIndex); 4472db2a39SDaniel Sanders } 45