brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · cabe521 Raw
77 lines · cpp
1//===- AllocToken.cpp - Allocation Token Calculation ----------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// Definition of AllocToken modes and shared calculation of stateless token IDs.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Support/AllocToken.h"14#include "llvm/ADT/StringSwitch.h"15#include "llvm/Support/ErrorHandling.h"16#include "llvm/Support/SipHash.h"17 18using namespace llvm;19 20std::optional<AllocTokenMode>21llvm::getAllocTokenModeFromString(StringRef Name) {22  return StringSwitch<std::optional<AllocTokenMode>>(Name)23      .Case("increment", AllocTokenMode::Increment)24      .Case("random", AllocTokenMode::Random)25      .Case("typehash", AllocTokenMode::TypeHash)26      .Case("typehashpointersplit", AllocTokenMode::TypeHashPointerSplit)27      .Case("default", DefaultAllocTokenMode)28      .Default(std::nullopt);29}30 31StringRef llvm::getAllocTokenModeAsString(AllocTokenMode Mode) {32  switch (Mode) {33  case AllocTokenMode::Increment:34    return "increment";35  case AllocTokenMode::Random:36    return "random";37  case AllocTokenMode::TypeHash:38    return "typehash";39  case AllocTokenMode::TypeHashPointerSplit:40    return "typehashpointersplit";41  }42  llvm_unreachable("Unknown AllocTokenMode");43}44 45static uint64_t getStableHash(const AllocTokenMetadata &Metadata,46                              uint64_t MaxTokens) {47  return getStableSipHash(Metadata.TypeName) % MaxTokens;48}49 50std::optional<uint64_t> llvm::getAllocToken(AllocTokenMode Mode,51                                            const AllocTokenMetadata &Metadata,52                                            uint64_t MaxTokens) {53  assert(MaxTokens && "Must provide non-zero max tokens");54 55  switch (Mode) {56  case AllocTokenMode::Increment:57  case AllocTokenMode::Random:58    // Stateful modes cannot be implemented as a pure function.59    return std::nullopt;60 61  case AllocTokenMode::TypeHash:62    return getStableHash(Metadata, MaxTokens);63 64  case AllocTokenMode::TypeHashPointerSplit: {65    if (MaxTokens == 1)66      return 0;67    const uint64_t HalfTokens = MaxTokens / 2;68    uint64_t Hash = getStableHash(Metadata, HalfTokens);69    if (Metadata.ContainsPointer)70      Hash += HalfTokens;71    return Hash;72  }73  }74 75  llvm_unreachable("");76}77