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 Sanders const 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 Sanders const 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