diff --git a/clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h b/clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h --- a/clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h +++ b/clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h @@ -26,10 +26,12 @@ #include "clang/Tooling/Inclusions/StandardLibrary.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/DenseMapInfoVariant.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include #include +#include #include namespace llvm { diff --git a/flang/include/flang/Optimizer/HLFIR/HLFIROps.h b/flang/include/flang/Optimizer/HLFIR/HLFIROps.h --- a/flang/include/flang/Optimizer/HLFIR/HLFIROps.h +++ b/flang/include/flang/Optimizer/HLFIR/HLFIROps.h @@ -19,6 +19,7 @@ #include "mlir/IR/PatternMatch.h" #include "mlir/Interfaces/InferTypeOpInterface.h" #include "mlir/Interfaces/SideEffectInterfaces.h" +#include #include "flang/Optimizer/HLFIR/HLFIROpInterfaces.h.inc" #define GET_OP_CLASSES diff --git a/llvm/include/llvm/ADT/DenseMapInfo.h b/llvm/include/llvm/ADT/DenseMapInfo.h --- a/llvm/include/llvm/ADT/DenseMapInfo.h +++ b/llvm/include/llvm/ADT/DenseMapInfo.h @@ -20,7 +20,6 @@ #include #include #include -#include namespace llvm { @@ -234,6 +233,14 @@ SecondInfo::getHashValue(PairVal.second)); } + // Expose an additional function intended to be used by other + // specializations of DenseMapInfo without needing to know how + // to combine hash values manually + static unsigned getHashValuePiecewise(const T &First, const U &Second) { + return detail::combineHashValue(FirstInfo::getHashValue(First), + SecondInfo::getHashValue(Second)); + } + static bool isEqual(const Pair &LHS, const Pair &RHS) { return FirstInfo::isEqual(LHS.first, RHS.first) && SecondInfo::isEqual(LHS.second, RHS.second); @@ -290,52 +297,6 @@ } }; -// Provide DenseMapInfo for variants whose all alternatives have DenseMapInfo. -template struct DenseMapInfo> { - using Variant = std::variant; - using FirstT = std::variant_alternative_t<0, Variant>; - - static inline Variant getEmptyKey() { - return Variant(std::in_place_index<0>, DenseMapInfo::getEmptyKey()); - } - - static inline Variant getTombstoneKey() { - return Variant(std::in_place_index<0>, - DenseMapInfo::getTombstoneKey()); - } - - static unsigned getHashValue(const Variant &Val) { - return std::visit( - [&Val](auto &&Alternative) { - using T = std::decay_t; - // Include index in hash to make sure same value as different - // alternatives don't collide. - return detail::combineHashValue( - DenseMapInfo::getHashValue(Val.index()), - DenseMapInfo::getHashValue(Alternative)); - }, - Val); - } - - static bool isEqual(const Variant &LHS, const Variant &RHS) { - if (LHS.index() != RHS.index()) - return false; - if (LHS.valueless_by_exception()) - return true; - // We want to dispatch to DenseMapInfo::isEqual(LHS.get(I), RHS.get(I)) - // We know the types are the same, but std::visit(V, LHS, RHS) doesn't. - // We erase the type held in LHS to void*, and dispatch over RHS. - const void *ErasedLHS = - std::visit([](const auto &LHS) -> const void * { return &LHS; }, LHS); - return std::visit( - [&](const auto &RHS) -> bool { - using T = std::remove_cv_t>; - return DenseMapInfo::isEqual(*static_cast(ErasedLHS), - RHS); - }, - RHS); - } -}; } // end namespace llvm #endif // LLVM_ADT_DENSEMAPINFO_H diff --git a/llvm/include/llvm/ADT/DenseMapInfoVariant.h b/llvm/include/llvm/ADT/DenseMapInfoVariant.h new file mode 100644 --- /dev/null +++ b/llvm/include/llvm/ADT/DenseMapInfoVariant.h @@ -0,0 +1,71 @@ +//===- DenseMapInfoVariant.h - Type traits for DenseMap *- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file defines DenseMapInfo traits for DenseMap>. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ADT_DENSEMAPINFOVARIANT_H +#define LLVM_ADT_DENSEMAPINFOVARIANT_H + +#include "llvm/ADT/DenseMapInfo.h" +#include +#include + +namespace llvm { + +// Provide DenseMapInfo for variants whose all alternatives have DenseMapInfo. +template struct DenseMapInfo> { + using Variant = std::variant; + using FirstT = std::variant_alternative_t<0, Variant>; + + static inline Variant getEmptyKey() { + return Variant(std::in_place_index<0>, DenseMapInfo::getEmptyKey()); + } + + static inline Variant getTombstoneKey() { + return Variant(std::in_place_index<0>, + DenseMapInfo::getTombstoneKey()); + } + + static unsigned getHashValue(const Variant &Val) { + return std::visit( + [&Val](auto &&Alternative) { + using T = std::decay_t; + // Include index in hash to make sure same value as different + // alternatives don't collide. + return DenseMapInfo>::getHashValuePiecewise( + Val.index(), Alternative); + }, + Val); + } + + static bool isEqual(const Variant &LHS, const Variant &RHS) { + if (LHS.index() != RHS.index()) + return false; + if (LHS.valueless_by_exception()) + return true; + // We want to dispatch to DenseMapInfo::isEqual(LHS.get(I), RHS.get(I)) + // We know the types are the same, but std::visit(V, LHS, RHS) doesn't. + // We erase the type held in LHS to void*, and dispatch over RHS. + const void *ErasedLHS = + std::visit([](const auto &LHS) -> const void * { return &LHS; }, LHS); + return std::visit( + [&](const auto &RHS) -> bool { + using T = std::remove_cv_t>; + return DenseMapInfo::isEqual(*static_cast(ErasedLHS), + RHS); + }, + RHS); + } +}; + +} // end namespace llvm + +#endif // LLVM_ADT_DENSEMAPINFOVARIANT_H diff --git a/llvm/include/llvm/CodeGen/CallingConvLower.h b/llvm/include/llvm/CodeGen/CallingConvLower.h --- a/llvm/include/llvm/CodeGen/CallingConvLower.h +++ b/llvm/include/llvm/CodeGen/CallingConvLower.h @@ -19,6 +19,8 @@ #include "llvm/CodeGen/TargetCallingConv.h" #include "llvm/IR/CallingConv.h" #include "llvm/Support/Alignment.h" +#include +#include namespace llvm { diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h --- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h @@ -22,6 +22,7 @@ #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ThreadPool.h" +#include namespace llvm { namespace orc { diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -21,6 +21,7 @@ #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBufferRef.h" #include "llvm/TargetParser/Triple.h" +#include namespace llvm { namespace object { diff --git a/llvm/include/llvm/Transforms/Scalar/SROA.h b/llvm/include/llvm/Transforms/Scalar/SROA.h --- a/llvm/include/llvm/Transforms/Scalar/SROA.h +++ b/llvm/include/llvm/Transforms/Scalar/SROA.h @@ -21,6 +21,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/IR/PassManager.h" #include "llvm/IR/ValueHandle.h" +#include #include namespace llvm { diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -8,6 +8,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/ADT/DenseMapInfoVariant.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include diff --git a/mlir/include/mlir/IR/AsmState.h b/mlir/include/mlir/IR/AsmState.h --- a/mlir/include/mlir/IR/AsmState.h +++ b/mlir/include/mlir/IR/AsmState.h @@ -20,6 +20,7 @@ #include "llvm/ADT/StringMap.h" #include +#include namespace mlir { class AsmResourcePrinter; diff --git a/mlir/include/mlir/Transforms/SROA.h b/mlir/include/mlir/Transforms/SROA.h --- a/mlir/include/mlir/Transforms/SROA.h +++ b/mlir/include/mlir/Transforms/SROA.h @@ -13,6 +13,7 @@ #include "mlir/Interfaces/MemorySlotInterfaces.h" #include "mlir/Support/LogicalResult.h" #include "llvm/ADT/Statistic.h" +#include namespace mlir {