| --- CMakeLists.txt 2018-10-30 12:00:24.000000000 +0800 |
| +++ CMakeLists.txt 2020-01-19 15:30:38.260000000 +0800 |
| @@ -104,8 +104,11 @@ |
| |
| if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
| #required by butil/crc32.cc to boost performance for 10x |
| - if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4)) |
| + if((CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4)) |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4 -msse4.2") |
| + elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")) |
| + # segmentation fault in libcontext |
| + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-gcse -w") |
| endif() |
| if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-aligned-new") |
| --- src/bthread/context.cpp 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/bthread/context.cpp 2020-01-19 15:48:18.070000000 +0800 |
| @@ -600,3 +600,106 @@ |
| ); |
| |
| #endif |
| + |
| +#if defined(BTHREAD_CONTEXT_PLATFORM_linux_arm64) && defined(BTHREAD_CONTEXT_COMPILER_gcc) |
| +__asm ( |
| +".cpu generic+fp+simd\n" |
| +".text\n" |
| +".align 2\n" |
| +".global bthread_jump_fcontext\n" |
| +".type bthread_jump_fcontext, %function\n" |
| +"bthread_jump_fcontext:\n" |
| +" # prepare stack for GP + FPU\n" |
| +" sub sp, sp, #0xb0\n" |
| +"# Because gcc may save integer registers in fp registers across a\n" |
| +"# function call we cannot skip saving the fp registers.\n" |
| +"#\n" |
| +"# Do not reinstate this test unless you fully understand what you\n" |
| +"# are doing.\n" |
| +"#\n" |
| +"# # test if fpu env should be preserved\n" |
| +"# cmp w3, #0\n" |
| +"# b.eq 1f\n" |
| +" # save d8 - d15\n" |
| +" stp d8, d9, [sp, #0x00]\n" |
| +" stp d10, d11, [sp, #0x10]\n" |
| +" stp d12, d13, [sp, #0x20]\n" |
| +" stp d14, d15, [sp, #0x30]\n" |
| +"1:\n" |
| +" # save x19-x30\n" |
| +" stp x19, x20, [sp, #0x40]\n" |
| +" stp x21, x22, [sp, #0x50]\n" |
| +" stp x23, x24, [sp, #0x60]\n" |
| +" stp x25, x26, [sp, #0x70]\n" |
| +" stp x27, x28, [sp, #0x80]\n" |
| +" stp x29, x30, [sp, #0x90]\n" |
| +" # save LR as PC\n" |
| +" str x30, [sp, #0xa0]\n" |
| +" # store RSP (pointing to context-data) in first argument (x0).\n" |
| +" # STR cannot have sp as a target register\n" |
| +" mov x4, sp\n" |
| +" str x4, [x0]\n" |
| +" # restore RSP (pointing to context-data) from A2 (x1)\n" |
| +" mov sp, x1\n" |
| +"# # test if fpu env should be preserved\n" |
| +"# cmp w3, #0\n" |
| +"# b.eq 2f\n" |
| +" # load d8 - d15\n" |
| +" ldp d8, d9, [sp, #0x00]\n" |
| +" ldp d10, d11, [sp, #0x10]\n" |
| +" ldp d12, d13, [sp, #0x20]\n" |
| +" ldp d14, d15, [sp, #0x30]\n" |
| +"2:\n" |
| +" # load x19-x30\n" |
| +" ldp x19, x20, [sp, #0x40]\n" |
| +" ldp x21, x22, [sp, #0x50]\n" |
| +" ldp x23, x24, [sp, #0x60]\n" |
| +" ldp x25, x26, [sp, #0x70]\n" |
| +" ldp x27, x28, [sp, #0x80]\n" |
| +" ldp x29, x30, [sp, #0x90]\n" |
| +" # use third arg as return value after jump\n" |
| +" # and as first arg in context function\n" |
| +" mov x0, x2\n" |
| +" # load pc\n" |
| +" ldr x4, [sp, #0xa0]\n" |
| +" # restore stack from GP + FPU\n" |
| +" add sp, sp, #0xb0\n" |
| +" ret x4\n" |
| +".size bthread_jump_fcontext,.-bthread_jump_fcontext\n" |
| +"# Mark that we don't need executable stack.\n" |
| +".section .note.GNU-stack,\"\",%progbits\n" |
| +); |
| + |
| +#endif |
| + |
| +#if defined(BTHREAD_CONTEXT_PLATFORM_linux_arm64) && defined(BTHREAD_CONTEXT_COMPILER_gcc) |
| +__asm ( |
| +".cpu generic+fp+simd\n" |
| +".text\n" |
| +".align 2\n" |
| +".global bthread_make_fcontext\n" |
| +".type bthread_make_fcontext, %function\n" |
| +"bthread_make_fcontext:\n" |
| +" # shift address in x0 (allocated stack) to lower 16 byte boundary\n" |
| +" and x0, x0, ~0xF\n" |
| +" # reserve space for context-data on context-stack\n" |
| +" sub x0, x0, #0xb0\n" |
| +" # third arg of bthread_make_fcontext() == address of context-function\n" |
| +" # store address as a PC to jump in\n" |
| +" str x2, [x0, #0xa0]\n" |
| +" # save address of finish as return-address for context-function\n" |
| +" # will be entered after context-function returns (LR register)\n" |
| +" adr x1, finish\n" |
| +" str x1, [x0, #0x98]\n" |
| +" ret x30 \n" |
| +"finish:\n" |
| +" # exit code is zero\n" |
| +" mov x0, #0\n" |
| +" # exit application\n" |
| +" bl _exit\n" |
| +".size bthread_make_fcontext,.-bthread_make_fcontext\n" |
| +"# Mark that we don't need executable stack.\n" |
| +".section .note.GNU-stack,\"\",%progbits\n" |
| +); |
| + |
| +#endif |
| --- src/bthread/context.h 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/bthread/context.h 2020-01-19 14:15:37.170000000 +0800 |
| @@ -30,6 +30,9 @@ |
| #elif __arm__ |
| #define BTHREAD_CONTEXT_PLATFORM_linux_arm32 |
| #define BTHREAD_CONTEXT_CALL_CONVENTION |
| + #elif __aarch64__ |
| + #define BTHREAD_CONTEXT_PLATFORM_linux_arm64 |
| + #define BTHREAD_CONTEXT_CALL_CONVENTION |
| #endif |
| |
| #elif defined(__MINGW32__) || defined (__MINGW64__) |
| --- src/bthread/processor.h 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/bthread/processor.h 2020-01-19 15:23:50.410000000 +0800 |
| @@ -20,9 +20,13 @@ |
| #define BTHREAD_PROCESSOR_H |
| |
| // Pause instruction to prevent excess processor bus usage, only works in GCC |
| -# ifndef cpu_relax |
| -# define cpu_relax() asm volatile("pause\n": : :"memory") |
| -# endif |
| +#ifndef cpu_relax |
| +#if defined(ARCH_CPU_ARM_FAMILY) |
| +# define cpu_relax() asm volatile("yield\n": : :"memory") |
| +#else |
| +#define cpu_relax() asm volatile("pause\n": : :"memory") |
| +#endif |
| +#endif |
| |
| // Compile read-write barrier |
| # ifndef barrier |
| --- src/butil/config.h 1970-01-01 08:00:00.000000000 +0800 |
| +++ src/butil/config.h 2020-01-19 12:39:01.070000000 +0800 |
| @@ -0,0 +1,6 @@ |
| +#ifndef BUTIL_CONFIG_H |
| +#define BUTIL_CONFIG_H |
| + |
| +#define BRPC_WITH_GLOG 1 |
| + |
| +#endif // BUTIL_CONFIG_H |
| --- src/butil/third_party/snappy/snappy-internal.h 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/butil/third_party/snappy/snappy-internal.h 2020-01-19 14:59:50.610000000 +0800 |
| @@ -132,7 +132,7 @@ |
| matched += 4; |
| } |
| if (LittleEndian::IsLittleEndian() && s2 <= s2_limit - 4) { |
| - uint32 x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched); |
| + uint32_t x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched); |
| int matching_bits = Bits::FindLSBSetNonZero(x); |
| matched += matching_bits >> 3; |
| } else { |
| --- src/butil/third_party/snappy/snappy-stubs-internal.h 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/butil/third_party/snappy/snappy-stubs-internal.h 2020-01-19 14:49:12.990000000 +0800 |
| @@ -35,6 +35,7 @@ |
| #include <assert.h> |
| #include <stdlib.h> |
| #include <string.h> |
| +#include <stdint.h> |
| #include "butil/compiler_specific.h" |
| #include "butil/basictypes.h" |
| #include "butil/sys_byteorder.h" |
| @@ -114,8 +115,8 @@ |
| // See if that would be more efficient on platforms supporting it, |
| // at least for copies. |
| |
| -inline uint64_tUNALIGNED_LOAD64(const void *p) { |
| - uint64_tt; |
| +inline uint64_t UNALIGNED_LOAD64(const void *p) { |
| + uint64_t t; |
| memcpy(&t, p, sizeof t); |
| return t; |
| } |
| @@ -141,8 +142,8 @@ |
| return t; |
| } |
| |
| -inline uint64_tUNALIGNED_LOAD64(const void *p) { |
| - uint64_tt; |
| +inline uint64_t UNALIGNED_LOAD64(const void *p) { |
| + uint64_t t; |
| memcpy(&t, p, sizeof t); |
| return t; |
| } |
| @@ -155,7 +156,7 @@ |
| memcpy(p, &v, sizeof v); |
| } |
| |
| -inline void UNALIGNED_STORE64(void *p, uint64_tv) { |
| +inline void UNALIGNED_STORE64(void *p, uint64_t v) { |
| memcpy(p, &v, sizeof v); |
| } |
| |
| --- src/CMakeLists.txt 2018-10-30 12:00:24.000000000 +0800 |
| +++ src/CMakeLists.txt 2020-01-19 15:58:52.000000000 +0800 |
| @@ -47,11 +47,13 @@ |
| target_link_libraries(protoc-gen-mcpack brpc-shared) |
| |
| #install directory |
| -install(TARGETS brpc-shared |
| - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| - ) |
| +if(BUILD_SHARED_LIBS) |
| + install(TARGETS brpc-shared |
| + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| + ) |
| +endif() |
| |
| install(TARGETS brpc-static |
| RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |