Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions llvm/include/llvm/Support/AllocToken.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ struct AllocTokenMetadata {
/// \param Metadata The metadata about the allocation.
/// \param MaxTokens The maximum number of tokens (must not be 0)
/// \return The calculated allocation token ID, or std::nullopt.
std::optional<uint64_t> getAllocTokenHash(AllocTokenMode Mode,
const AllocTokenMetadata &Metadata,
uint64_t MaxTokens);
LLVM_ABI std::optional<uint64_t>
getAllocToken(AllocTokenMode Mode, const AllocTokenMetadata &Metadata,
uint64_t MaxTokens);

} // end namespace llvm

Expand Down
24 changes: 14 additions & 10 deletions llvm/lib/Support/AllocToken.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,32 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/SipHash.h"

namespace llvm {
std::optional<uint64_t> getAllocTokenHash(AllocTokenMode Mode,
const AllocTokenMetadata &Metadata,
uint64_t MaxTokens) {
assert(MaxTokens && "Must provide concrete max tokens");
using namespace llvm;

static uint64_t getStableHash(const AllocTokenMetadata &Metadata,
uint64_t MaxTokens) {
return getStableSipHash(Metadata.TypeName) % MaxTokens;
}

std::optional<uint64_t> llvm::getAllocToken(AllocTokenMode Mode,
const AllocTokenMetadata &Metadata,
uint64_t MaxTokens) {
assert(MaxTokens && "Must provide non-zero max tokens");

switch (Mode) {
case AllocTokenMode::Increment:
case AllocTokenMode::Random:
// Stateful modes cannot be implemented as a pure function.
return std::nullopt;

case AllocTokenMode::TypeHash: {
return getStableSipHash(Metadata.TypeName) % MaxTokens;
}
case AllocTokenMode::TypeHash:
return getStableHash(Metadata, MaxTokens);

case AllocTokenMode::TypeHashPointerSplit: {
if (MaxTokens == 1)
return 0;
const uint64_t HalfTokens = MaxTokens / 2;
uint64_t Hash = getStableSipHash(Metadata.TypeName) % HalfTokens;
uint64_t Hash = getStableHash(Metadata, HalfTokens);
if (Metadata.ContainsPointer)
Hash += HalfTokens;
return Hash;
Expand All @@ -43,4 +48,3 @@ std::optional<uint64_t> getAllocTokenHash(AllocTokenMode Mode,

llvm_unreachable("");
}
} // namespace llvm
12 changes: 5 additions & 7 deletions llvm/lib/Transforms/Instrumentation/AllocToken.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,7 @@ class TypeHashMode : public ModeBase {
if (MDNode *N = getAllocTokenMetadata(CB)) {
MDString *S = cast<MDString>(N->getOperand(0));
AllocTokenMetadata Metadata{S->getString(), containsPointer(N)};
if (auto Token =
getAllocTokenHash(TokenMode::TypeHash, Metadata, MaxTokens))
if (auto Token = getAllocToken(TokenMode::TypeHash, Metadata, MaxTokens))
return *Token;
}
// Fallback.
Expand Down Expand Up @@ -238,8 +237,8 @@ class TypeHashPointerSplitMode : public TypeHashMode {
if (MDNode *N = getAllocTokenMetadata(CB)) {
MDString *S = cast<MDString>(N->getOperand(0));
AllocTokenMetadata Metadata{S->getString(), containsPointer(N)};
if (auto Token = getAllocTokenHash(TokenMode::TypeHashPointerSplit,
Metadata, MaxTokens))
if (auto Token = getAllocToken(TokenMode::TypeHashPointerSplit, Metadata,
MaxTokens))
return *Token;
}
// Pick the fallback token (ClFallbackToken), which by default is 0, meaning
Expand Down Expand Up @@ -373,9 +372,8 @@ bool AllocToken::instrumentFunction(Function &F) {
}

if (!IntrinsicInsts.empty()) {
for (auto *II : IntrinsicInsts) {
for (auto *II : IntrinsicInsts)
replaceIntrinsicInst(II, ORE);
}
Modified = true;
NumFunctionsModified++;
}
Expand All @@ -397,7 +395,7 @@ AllocToken::shouldInstrumentCall(const CallBase &CB,
if (TLI.getLibFunc(*Callee, Func)) {
if (isInstrumentableLibFunc(Func, CB, TLI))
return Func;
} else if (Options.Extended && getAllocTokenMetadata(CB)) {
} else if (Options.Extended && CB.getMetadata(LLVMContext::MD_alloc_token)) {
return NotLibFunc;
}

Expand Down
Loading