Skip to content

Commit c5f6231

Browse files
dsmith111copybara-github
authored andcommitted
Add Compiler Condition to use inline assembly optimizations with ARM64 for Compatibility with MSVC (#17671)
#17665 **Problem** `google\protobuf\parse_context.h(721,10): error C2059: syntax error: ':'` `google\protobuf\parse_context.h(898,14): error C3861: 'Ubfx7': identifier not found` The latest protobuf versions fail to compile with MSVC on Windows ARM64 architecture. > Inline assembly is only available for x86 targets. For similar functionality in x64 or ARM64 code, use [compiler intrinsics](https://learn.microsoft.com/en-us/cpp/intrinsics/compiler-intrinsics?view=msvc-170). https://learn.microsoft.com/en-us/cpp/assembler/inline/writing-functions-with-inline-assembly?view=msvc-170 **Solution** As inline assembly for win ARM64 with MSVC as a compiler is not supported (even ARM specific assembly functions), a term has been added to the conditions in parse_context.h to prevent the assembly optimizations for arm64 from executing if the compiler is MSVC. Tested by compiling protobuf with MSVC on Windows ARM64 and AMD64 architecture. Compilation was a success. Closes #17671 COPYBARA_INTEGRATE_REVIEW=#17671 from dsmith111:smithdavi/msvc-compatibility-patch 765f8c8 PiperOrigin-RevId: 663262760
1 parent 5a22455 commit c5f6231

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

src/google/protobuf/parse_context.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ inline const char* VarintParseSlow(const char* p, uint32_t res, uint64_t* out) {
635635
return tmp.first;
636636
}
637637

638-
#ifdef __aarch64__
638+
#if defined(__aarch64__) && !defined(_MSC_VER)
639639
// Generally, speaking, the ARM-optimized Varint decode algorithm is to extract
640640
// and concatenate all potentially valid data bits, compute the actual length
641641
// of the Varint, and mask off the data bits which are not actually part of the
@@ -866,7 +866,7 @@ static const char* VarintParseSlowArm(const char* p, uint64_t* out,
866866
// The caller must ensure that p points to at least 10 valid bytes.
867867
template <typename T>
868868
PROTOBUF_NODISCARD const char* VarintParse(const char* p, T* out) {
869-
#if defined(__aarch64__) && defined(ABSL_IS_LITTLE_ENDIAN)
869+
#if defined(__aarch64__) && defined(ABSL_IS_LITTLE_ENDIAN) && !defined(_MSC_VER)
870870
// This optimization is not supported in big endian mode
871871
uint64_t first8;
872872
std::memcpy(&first8, p, sizeof(first8));

0 commit comments

Comments
 (0)