mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:20:11 +01:00
- Move formatted printing to `hashing.cpp` instead of `hashing.h` - Separate APInt and APFloat hashing specializations into a new `hashing_llvm.h` - Update toolchain/base dependencies and include sites that hash LLVM data types to include `hashing_llvm.h` Combined, this reduces the transitive includes caused by `hashing.h`. Assisted-by: Antigravity with Gemini
77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#include "toolchain/base/int.h"
|
|
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
#include "common/hashing_llvm.h"
|
|
#include "toolchain/base/canonical_value_store_impl.h"
|
|
#include "toolchain/base/value_store_impl.h"
|
|
|
|
namespace Carbon {
|
|
|
|
auto IntStore::CanonicalBitWidth(int significant_bits) -> int {
|
|
// For larger integers, we store them in as a signed APInt with a canonical
|
|
// width that is the smallest multiple of the word type's bits, but no
|
|
// smaller than a minimum of 64 bits to avoid spurious resizing of the most
|
|
// common cases (<= 64 bits).
|
|
static constexpr int WordWidth = llvm::APInt::APINT_BITS_PER_WORD;
|
|
|
|
return std::max<int>(
|
|
MinAPWidth, ((significant_bits + WordWidth - 1) / WordWidth) * WordWidth);
|
|
}
|
|
|
|
auto IntStore::CanonicalizeSigned(llvm::APInt value) -> llvm::APInt {
|
|
return value.sextOrTrunc(CanonicalBitWidth(value.getSignificantBits()));
|
|
}
|
|
|
|
auto IntStore::CanonicalizeUnsigned(llvm::APInt value) -> llvm::APInt {
|
|
// We need the width to include a zero sign bit as we canonicalize to a
|
|
// signed representation.
|
|
return value.zextOrTrunc(CanonicalBitWidth(value.getActiveBits() + 1));
|
|
}
|
|
|
|
auto IntStore::AddLarge(int64_t value) -> IntId {
|
|
auto ap_id =
|
|
values_.Add(llvm::APInt(CanonicalBitWidth(64), value, /*isSigned=*/true));
|
|
return MakeIndexOrNone(ap_id.index);
|
|
}
|
|
|
|
auto IntStore::AddSignedLarge(llvm::APInt value) -> IntId {
|
|
auto ap_id = values_.Add(CanonicalizeSigned(value));
|
|
return MakeIndexOrNone(ap_id.index);
|
|
}
|
|
|
|
auto IntStore::AddUnsignedLarge(llvm::APInt value) -> IntId {
|
|
auto ap_id = values_.Add(CanonicalizeUnsigned(value));
|
|
return MakeIndexOrNone(ap_id.index);
|
|
}
|
|
|
|
auto IntStore::LookupLarge(int64_t value) const -> IntId {
|
|
auto ap_id = values_.Lookup(
|
|
llvm::APInt(CanonicalBitWidth(64), value, /*isSigned=*/true));
|
|
return MakeIndexOrNone(ap_id.index);
|
|
}
|
|
|
|
auto IntStore::LookupSignedLarge(llvm::APInt value) const -> IntId {
|
|
auto ap_id = values_.Lookup(CanonicalizeSigned(value));
|
|
return MakeIndexOrNone(ap_id.index);
|
|
}
|
|
|
|
auto IntStore::OutputYaml() const -> Yaml::OutputMapping {
|
|
return values_.OutputYaml();
|
|
}
|
|
|
|
auto IntStore::CollectMemUsage(MemUsage& mem_usage, llvm::StringRef label) const
|
|
-> void {
|
|
mem_usage.Collect(std::string(label), values_);
|
|
}
|
|
|
|
template class CanonicalValueStore<IntStore::APIntId, llvm::APInt>;
|
|
template class ValueStore<IntStore::APIntId, llvm::APInt>;
|
|
|
|
} // namespace Carbon
|