mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
If the __is_trivially_copyable type trait is available use it as the baseline for isPodLike.
This way we can enable the POD-like class optimization for a lot more classes, saving ~120k of code in clang/i386/Release+Asserts when selfhosting. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155761 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1dd346ad05
commit
18883037a9
@ -21,6 +21,11 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#ifndef __has_feature
|
||||||
|
#define LLVM_DEFINED_HAS_FEATURE
|
||||||
|
#define __has_feature(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// This is actually the conforming implementation which works with abstract
|
// This is actually the conforming implementation which works with abstract
|
||||||
// classes. However, enough compilers have trouble with it that most will use
|
// classes. However, enough compilers have trouble with it that most will use
|
||||||
// the one in boost/type_traits/object_traits.hpp. This implementation actually
|
// the one in boost/type_traits/object_traits.hpp. This implementation actually
|
||||||
@ -58,9 +63,15 @@ struct is_class
|
|||||||
/// type can be copied around with memcpy instead of running ctors etc.
|
/// type can be copied around with memcpy instead of running ctors etc.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct isPodLike {
|
struct isPodLike {
|
||||||
|
#if __has_feature(is_trivially_copyable)
|
||||||
|
// If the compiler supports the is_trivially_copyable trait use it, as it
|
||||||
|
// matches the definition of isPodLike closely.
|
||||||
|
static const bool value = __is_trivially_copyable(T);
|
||||||
|
#else
|
||||||
// If we don't know anything else, we can (at least) assume that all non-class
|
// If we don't know anything else, we can (at least) assume that all non-class
|
||||||
// types are PODs.
|
// types are PODs.
|
||||||
static const bool value = !is_class<T>::value;
|
static const bool value = !is_class<T>::value;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// std::pair's are pod-like if their elements are.
|
// std::pair's are pod-like if their elements are.
|
||||||
@ -202,4 +213,8 @@ struct conditional<false, T, F> { typedef F type; };
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LLVM_DEFINED_HAS_FEATURE
|
||||||
|
#undef __has_feature
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user