aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-03-02 10:56:40 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-03-02 10:56:40 +0000
commit1c1448984d43f1f02c0235d35ebe8460c9b57afd (patch)
treec15c8c05b0a683a2653c6d0e61edb9f04dc042bc /include/llvm
parentd8313be41031e4d768f5b38199904d4debff88cd (diff)
downloadexternal_llvm-1c1448984d43f1f02c0235d35ebe8460c9b57afd.zip
external_llvm-1c1448984d43f1f02c0235d35ebe8460c9b57afd.tar.gz
external_llvm-1c1448984d43f1f02c0235d35ebe8460c9b57afd.tar.bz2
Simplify the pair optimization. Rather than using complex type traits,
just ensure that the number of bytes in the pair is the sum of the bytes in each side of the pair. As long as thats true, there are no extra bytes that might be padding. Also add a few tests that previously would have slipped through the checking. The more accurate checking mechanism catches these and ensures they are handled conservatively correctly. Thanks to Duncan for prodding me to do this right and more simply. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151891 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm')
-rw-r--r--include/llvm/ADT/Hashing.h4
-rw-r--r--include/llvm/Support/type_traits.h18
2 files changed, 2 insertions, 20 deletions
diff --git a/include/llvm/ADT/Hashing.h b/include/llvm/ADT/Hashing.h
index 1b0e669..7fbe5bb 100644
--- a/include/llvm/ADT/Hashing.h
+++ b/include/llvm/ADT/Hashing.h
@@ -357,8 +357,8 @@ template <typename T> struct is_hashable_data
template <typename T, typename U> struct is_hashable_data<std::pair<T, U> >
: integral_constant<bool, (is_hashable_data<T>::value &&
is_hashable_data<U>::value &&
- !is_alignment_padded<std::pair<T, U> >::value &&
- !is_pod_pair_padded<T, U>::value)> {};
+ (sizeof(T) + sizeof(U)) ==
+ sizeof(std::pair<T, U>))> {};
/// \brief Helper to get the hashable data representation for a type.
/// This variant is enabled when the type itself can be used.
diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h
index a10d83c..85d90b1 100644
--- a/include/llvm/Support/type_traits.h
+++ b/include/llvm/Support/type_traits.h
@@ -126,24 +126,6 @@ struct is_integral : is_integral_impl<T> {};
template <typename T> struct is_pointer : false_type {};
template <typename T> struct is_pointer<T*> : true_type {};
-/// \brief Metafunction to compute whether a type requires alignment padding.
-/// When true, an object of this type will have padding bytes inside its
-/// 'sizeof' bytes.
-template <typename T> class is_alignment_padded {
- struct pod_size_tester { T t; char c; };
-public:
- enum { value = offsetof(pod_size_tester, c) != sizeof(T) };
-};
-
-/// \brief Metafunction to determine whether an adjacent pair of two types will
-/// require padding between them due to alignment.
-template <typename T, typename U> class is_pod_pair_padded {
- struct pod_pair { T t; U u; };
- struct pod_char_pair { T t; char c; };
-public:
- enum { value = offsetof(pod_pair, u) != offsetof(pod_char_pair, c) };
-};
-
// enable_if_c - Enable/disable a template based on a metafunction
template<bool Cond, typename T = void>