Consolidate byteorder code
Remove third_party/base/sys_byteorder.h and pull out the bits that are
being used to core/fxcrt/byteorder.h. This removes an unnecessary layer
of complexity, as most of third_party/base/sys_byteorder.h is not even
used, and the remaining code will eventually be replaced with C++23
std::byteswap().
Bug: pdfium:2127
Change-Id: Ibf9b2e2ad674e9c0f651f844cc588a37e4c8c19a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/116610
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/byteorder.h b/core/fxcrt/byteorder.h
index b830b56..0002058 100644
--- a/core/fxcrt/byteorder.h
+++ b/core/fxcrt/byteorder.h
@@ -5,12 +5,50 @@
#ifndef CORE_FXCRT_BYTEORDER_H_
#define CORE_FXCRT_BYTEORDER_H_
+#include <stdint.h>
+
#include "build/build_config.h"
#include "third_party/base/containers/span.h"
-#include "third_party/base/sys_byteorder.h"
+
+#if defined(COMPILER_MSVC)
+#include <stdlib.h>
+#endif
namespace fxcrt {
+namespace internal {
+
+#if defined(COMPILER_MSVC) && !defined(__clang__)
+// TODO(thestig): See
+// https://developercommunity.visualstudio.com/t/Mark-some-built-in-functions-as-constexp/362558
+// https://developercommunity.visualstudio.com/t/constexpr-byte-swapping-optimization/983963
+#define FXCRT_BYTESWAPS_CONSTEXPR
+#else
+#define FXCRT_BYTESWAPS_CONSTEXPR constexpr
+#endif
+
+// Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
+// TODO(thestig): Once C++23 is available, replace with std::byteswap.
+inline FXCRT_BYTESWAPS_CONSTEXPR uint16_t ByteSwap(uint16_t x) {
+#if defined(COMPILER_MSVC) && !defined(__clang__)
+ return _byteswap_ushort(x);
+#else
+ return __builtin_bswap16(x);
+#endif
+}
+
+inline FXCRT_BYTESWAPS_CONSTEXPR uint32_t ByteSwap(uint32_t x) {
+#if defined(COMPILER_MSVC) && !defined(__clang__)
+ return _byteswap_ulong(x);
+#else
+ return __builtin_bswap32(x);
+#endif
+}
+
+#undef FXCRT_BYTESWAPS_CONSTEXPR
+
+} // namespace internal
+
// NOTE: Prefer *Swap*() methods when data is known to be aligned.
// Converts the bytes in |x| from host order (endianness) to little endian, and
@@ -19,7 +57,7 @@
#if defined(ARCH_CPU_LITTLE_ENDIAN)
return x;
#else
- return pdfium::base::ByteSwap(x);
+ return internal::ByteSwap(x);
#endif
}
@@ -27,7 +65,7 @@
#if defined(ARCH_CPU_LITTLE_ENDIAN)
return x;
#else
- return pdfium::base::ByteSwap(x);
+ return internal::ByteSwap(x);
#endif
}
@@ -35,7 +73,7 @@
// returns the result.
inline uint16_t ByteSwapToBE16(uint16_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return pdfium::base::ByteSwap(x);
+ return internal::ByteSwap(x);
#else
return x;
#endif
@@ -43,7 +81,7 @@
inline uint32_t ByteSwapToBE32(uint32_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return pdfium::base::ByteSwap(x);
+ return internal::ByteSwap(x);
#else
return x;
#endif
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index e5adba1..33d0fa2 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -578,7 +578,6 @@
"base/numerics/safe_math_arm_impl.h",
"base/numerics/safe_math_clang_gcc_impl.h",
"base/numerics/safe_math_shared_impl.h",
- "base/sys_byteorder.h",
"base/template_util.h",
]
public_deps = [
diff --git a/third_party/base/sys_byteorder.h b/third_party/base/sys_byteorder.h
deleted file mode 100644
index d4989bef..0000000
--- a/third_party/base/sys_byteorder.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This header defines cross-platform ByteSwap() implementations for 16, 32 and
-// 64-bit values, and NetToHostXX() / HostToNextXX() functions equivalent to
-// the traditional ntohX() and htonX() functions.
-// Use the functions defined here rather than using the platform-specific
-// functions directly.
-
-#ifndef THIRD_PARTY_BASE_SYS_BYTEORDER_H_
-#define THIRD_PARTY_BASE_SYS_BYTEORDER_H_
-
-#include <stdint.h>
-
-#include "build/build_config.h"
-
-#if defined(COMPILER_MSVC)
-#include <stdlib.h>
-#endif
-
-#if defined(COMPILER_MSVC) && !defined(__clang__)
-// TODO(pkasting): See
-// https://developercommunity.visualstudio.com/t/Mark-some-built-in-functions-as-constexp/362558
-// https://developercommunity.visualstudio.com/t/constexpr-byte-swapping-optimization/983963
-#define BASE_BYTESWAPS_CONSTEXPR
-#else
-#define BASE_BYTESWAPS_CONSTEXPR constexpr
-#endif
-
-namespace pdfium {
-namespace base {
-
-// Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
-// TODO(pkasting): Once C++23 is available, replace with std::byteswap.
-inline BASE_BYTESWAPS_CONSTEXPR uint16_t ByteSwap(uint16_t x) {
-#if defined(COMPILER_MSVC) && !defined(__clang__)
- return _byteswap_ushort(x);
-#else
- return __builtin_bswap16(x);
-#endif
-}
-
-inline BASE_BYTESWAPS_CONSTEXPR uint32_t ByteSwap(uint32_t x) {
-#if defined(COMPILER_MSVC) && !defined(__clang__)
- return _byteswap_ulong(x);
-#else
- return __builtin_bswap32(x);
-#endif
-}
-
-inline BASE_BYTESWAPS_CONSTEXPR uint64_t ByteSwap(uint64_t x) {
- // Per build/build_config.h, clang masquerades as MSVC on Windows. If we are
- // actually using clang, we can rely on the builtin.
- //
- // This matters in practice, because on x86(_64), this is a single "bswap"
- // instruction. MSVC correctly replaces the call with an inlined bswap at /O2
- // as of 2021, but clang as we use it in Chromium doesn't, keeping a function
- // call for a single instruction.
-#if defined(COMPILER_MSVC) && !defined(__clang__)
- return _byteswap_uint64(x);
-#else
- return __builtin_bswap64(x);
-#endif
-}
-
-inline BASE_BYTESWAPS_CONSTEXPR uintptr_t ByteSwapUintPtrT(uintptr_t x) {
- // We do it this way because some build configurations are ILP32 even when
- // defined(ARCH_CPU_64_BITS). Unfortunately, we can't use sizeof in #ifs. But,
- // because these conditionals are constexprs, the irrelevant branches will
- // likely be optimized away, so this construction should not result in code
- // bloat.
- static_assert(sizeof(uintptr_t) == 4 || sizeof(uintptr_t) == 8,
- "Unsupported uintptr_t size");
- if (sizeof(uintptr_t) == 4)
- return ByteSwap(static_cast<uint32_t>(x));
- return ByteSwap(static_cast<uint64_t>(x));
-}
-
-// Converts the bytes in |x| from host order (endianness) to little endian, and
-// returns the result.
-inline BASE_BYTESWAPS_CONSTEXPR uint16_t ByteSwapToLE16(uint16_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return x;
-#else
- return ByteSwap(x);
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint32_t ByteSwapToLE32(uint32_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return x;
-#else
- return ByteSwap(x);
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint64_t ByteSwapToLE64(uint64_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return x;
-#else
- return ByteSwap(x);
-#endif
-}
-
-// Converts the bytes in |x| from network to host order (endianness), and
-// returns the result.
-inline BASE_BYTESWAPS_CONSTEXPR uint16_t NetToHost16(uint16_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint32_t NetToHost32(uint32_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint64_t NetToHost64(uint64_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-
-// Converts the bytes in |x| from host to network order (endianness), and
-// returns the result.
-inline BASE_BYTESWAPS_CONSTEXPR uint16_t HostToNet16(uint16_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint32_t HostToNet32(uint32_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-inline BASE_BYTESWAPS_CONSTEXPR uint64_t HostToNet64(uint64_t x) {
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
- return ByteSwap(x);
-#else
- return x;
-#endif
-}
-
-} // namespace base
-} // namespace pdfium
-
-#undef BASE_BYTESWAPS_CONSTEXPR
-
-#endif // THIRD_PARTY_BASE_SYS_BYTEORDER_H_