summaryrefslogtreecommitdiff
path: root/absl/base
diff options
context:
space:
mode:
Diffstat (limited to 'absl/base')
-rw-r--r--absl/base/internal/inline_variable.h30
-rw-r--r--absl/base/internal/malloc_hook.h7
-rw-r--r--absl/base/internal/malloc_hook_c.h1
3 files changed, 31 insertions, 7 deletions
diff --git a/absl/base/internal/inline_variable.h b/absl/base/internal/inline_variable.h
index f7bb8c56..a65fe893 100644
--- a/absl/base/internal/inline_variable.h
+++ b/absl/base/internal/inline_variable.h
@@ -53,7 +53,24 @@
// it will likely be a reference type).
////////////////////////////////////////////////////////////////////////////////
-#ifdef __cpp_inline_variables
+// ABSL_INTERNAL_HAS_WARNING()
+//
+// If the compiler supports the `__has_warning` extension for detecting
+// warnings, then this macro is defined to be `__has_warning`.
+//
+// If the compiler does not support `__has_warning`, invocations expand to 0.
+//
+// For clang's documentation of `__has_warning`, see
+// https://clang.llvm.org/docs/LanguageExtensions.html#has-warning
+#if defined(__has_warning)
+#define ABSL_INTERNAL_HAS_WARNING __has_warning
+#else // Otherwise, be optimistic and assume the warning is not enabled.
+#define ABSL_INTERNAL_HAS_WARNING(warning) 0
+#endif // defined(__has_warning)
+
+// If the compiler supports inline variables and does not warn when used...
+#if defined(__cpp_inline_variables) && \
+ !ABSL_INTERNAL_HAS_WARNING("-Wc++98-c++11-c++14-compat")
// Clang's -Wmissing-variable-declarations option erroneously warned that
// inline constexpr objects need to be pre-declared. This has now been fixed,
@@ -66,19 +83,21 @@
// identity_t is used here so that the const and name are in the
// appropriate place for pointer types, reference types, function pointer
// types, etc..
-#if defined(__clang__)
+#if defined(__clang__) && \
+ ABSL_INTERNAL_HAS_WARNING("-Wmissing-variable-declarations")
#define ABSL_INTERNAL_EXTERN_DECL(type, name) \
extern const ::absl::internal::identity_t<type> name;
#else // Otherwise, just define the macro to do nothing.
#define ABSL_INTERNAL_EXTERN_DECL(type, name)
-#endif // defined(__clang__)
+#endif // defined(__clang__) &&
+ // ABSL_INTERNAL_HAS_WARNING("-Wmissing-variable-declarations")
// See above comment at top of file for details.
#define ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init) \
ABSL_INTERNAL_EXTERN_DECL(type, name) \
inline constexpr ::absl::internal::identity_t<type> name = init
-#else
+#else // Otherwise, we need to emulate inline variables...
// See above comment at top of file for details.
//
@@ -102,6 +121,7 @@
static_assert(sizeof(void (*)(decltype(name))) != 0, \
"Silence unused variable warnings.")
-#endif // __cpp_inline_variables
+#endif // defined(__cpp_inline_variables) &&
+ // !ABSL_INTERNAL_HAS_WARNING("-Wc++98-c++11-c++14-compat")
#endif // ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_
diff --git a/absl/base/internal/malloc_hook.h b/absl/base/internal/malloc_hook.h
index 7c1eaddb..6b006eda 100644
--- a/absl/base/internal/malloc_hook.h
+++ b/absl/base/internal/malloc_hook.h
@@ -91,8 +91,11 @@ class MallocHook {
// SampledAlloc has the following fields:
// * AllocHandle handle: to be set to an effectively unique value (in this
// process) by allocator.
- // * size_t allocated_size: space actually used by allocator to host
- // the object.
+ // * size_t allocated_size: space actually used by allocator to host the
+ // object. Not necessarily equal to the requested size due to alignment
+ // and other reasons.
+ // * double weight: the expected number of allocations matching this profile
+ // that this sample represents.
// * int stack_depth and const void* stack: invocation stack for
// the allocation.
// The allocator invoking the hook should record the handle value and later
diff --git a/absl/base/internal/malloc_hook_c.h b/absl/base/internal/malloc_hook_c.h
index ed41143a..7255ddc2 100644
--- a/absl/base/internal/malloc_hook_c.h
+++ b/absl/base/internal/malloc_hook_c.h
@@ -37,6 +37,7 @@ typedef struct {
/* See malloc_hook.h for documentation for this struct. */
MallocHook_AllocHandle handle;
size_t allocated_size;
+ double weight;
int stack_depth;
const void* stack;
} MallocHook_SampledAlloc;