Fix base::IsAligned() to work with const pointers.
One variant of base::IsAligned() takes a void*, but that does not work
for const float*. Change the parameter type to const void*, add a unit
test for it, and convert some code in media/ that can use IsAligned().
Change-Id: Iae7f8d5057dc947ebb85839a0b10e33f21ac207a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2246838
Reviewed-by: Dale Curtis <[email protected]>
Reviewed-by: Brian Geffon <[email protected]>
Commit-Queue: Lei Zhang <[email protected]>
Cr-Commit-Position: refs/heads/master@{#778522}
diff --git a/base/memory/aligned_memory.h b/base/memory/aligned_memory.h
index 04d08b6..39a823a 100644
--- a/base/memory/aligned_memory.h
+++ b/base/memory/aligned_memory.h
@@ -75,7 +75,7 @@
#undef SUPPORTS_BUILTIN_IS_ALIGNED
-inline bool IsAligned(void* val, size_t alignment) {
+inline bool IsAligned(const void* val, size_t alignment) {
return IsAligned(reinterpret_cast<uintptr_t>(val), alignment);
}
diff --git a/base/memory/aligned_memory_unittest.cc b/base/memory/aligned_memory_unittest.cc
index e067b4c..810f2e4 100644
--- a/base/memory/aligned_memory_unittest.cc
+++ b/base/memory/aligned_memory_unittest.cc
@@ -38,6 +38,10 @@
static_cast<float*>(AlignedAlloc(8, 8)));
EXPECT_TRUE(p.get());
EXPECT_TRUE(IsAligned(p.get(), 8));
+
+ // Make sure IsAligned() can check const pointers as well.
+ const float* const_p = p.get();
+ EXPECT_TRUE(IsAligned(const_p, 8));
}
TEST(AlignedMemoryTest, IsAligned) {
diff --git a/media/base/vector_math.cc b/media/base/vector_math.cc
index fabb796..a0333cb6 100644
--- a/media/base/vector_math.cc
+++ b/media/base/vector_math.cc
@@ -8,6 +8,7 @@
#include <algorithm>
#include "base/check_op.h"
+#include "base/memory/aligned_memory.h"
#include "build/build_config.h"
// NaCl does not allow intrinsics.
@@ -40,9 +41,8 @@
namespace vector_math {
void FMAC(const float src[], float scale, int len, float dest[]) {
- // Ensure |src| and |dest| are 16-byte aligned.
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
+ DCHECK(base::IsAligned(src, kRequiredAlignment));
+ DCHECK(base::IsAligned(dest, kRequiredAlignment));
return FMAC_FUNC(src, scale, len, dest);
}
@@ -52,9 +52,8 @@
}
void FMUL(const float src[], float scale, int len, float dest[]) {
- // Ensure |src| and |dest| are 16-byte aligned.
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
+ DCHECK(base::IsAligned(src, kRequiredAlignment));
+ DCHECK(base::IsAligned(dest, kRequiredAlignment));
return FMUL_FUNC(src, scale, len, dest);
}
@@ -65,8 +64,7 @@
std::pair<float, float> EWMAAndMaxPower(
float initial_value, const float src[], int len, float smoothing_factor) {
- // Ensure |src| is 16-byte aligned.
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
+ DCHECK(base::IsAligned(src, kRequiredAlignment));
return EWMAAndMaxPower_FUNC(initial_value, src, len, smoothing_factor);
}
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index a28321f8..002cd3b 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -20,6 +20,7 @@
#include "base/containers/queue.h"
#include "base/files/file_util.h"
#include "base/macros.h"
+#include "base/memory/aligned_memory.h"
#include "base/memory/ref_counted.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/memory/weak_ptr.h"
@@ -556,7 +557,7 @@
const char* src_ptr = &src_data[0];
for (size_t i = 0; i < num_planes; i++) {
// Assert that each plane of frame starts at required byte boundary.
- ASSERT_EQ(0u, dest_offset & (test::kPlatformBufferAlignment - 1))
+ ASSERT_TRUE(base::IsAligned(dest_offset, test::kPlatformBufferAlignment))
<< "Planes of frame should be mapped per platform requirements";
char* dst_ptr = &test_stream->aligned_in_file_data[dest_offset];
for (size_t j = 0; j < visible_plane_rows[i]; j++) {