gollvm: add workaround for hard-wired cf-protection=branch Some newer linux distrubutions are shipping with -fcf-protection=branch hard-wired on; this causes problems with the gold linker when it is looking for split-stack prolog sequences. Until the upstream bug https://sourceware.org/bugzilla/show_bug.cgi?id=25921 is fixed, work around this problem via additional cmake rules to test if turning off cf-protection will allow split-stack examples to compile. Fixes golang/go#38728. Change-Id: Ie2d41d59d9e6ce8e9c616b73771055780f9c1e09 Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/232742 Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: eric fang <eric.fang@arm.com>
diff --git a/cmake/modules/AddGollvm.cmake b/cmake/modules/AddGollvm.cmake index 80e602e..6b4bb96 100644 --- a/cmake/modules/AddGollvm.cmake +++ b/cmake/modules/AddGollvm.cmake
@@ -21,6 +21,12 @@ set(GOLLVM_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}") set(GOLLVM_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/${libsubdir}") +# Check to see whether the build compiler supports -fcf-protection=branch +set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") +set(CMAKE_REQUIRED_FLAGS "-fcf-protection=branch") +check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" C_SUPPORTS_CF_PROTECTION_BRANCH) +set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}") + # We need to check if '-fsplit-stack' is supported with 'USING_SPLIT_STACK' # at compile time. So define this macro in GollvmConfig.h if it's supported. if(GOLLVM_USE_SPLIT_STACK) @@ -31,8 +37,25 @@ # splitting. So here we do this test with ld.gold linker. # FIXME: update here once one day there is a linker that supports '-fsplit-stack' # on arm64. - SET(CMAKE_REQUIRED_FLAGS "-fuse-ld=gold -fsplit-stack") - check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" C_SUPPORTS_SPLIT_STACK) + set(C_SUPPORTS_SPLIT_STACK 0) + set(CMAKE_REQUIRED_FLAGS "-fuse-ld=gold -fsplit-stack") + check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" SPLIT_STACK_FUNCTIONAL) + if(NOT SPLIT_STACK_FUNCTIONAL) + if(C_SUPPORTS_CF_PROTECTION_BRANCH) + # Try again with -fcf-protection=none, since that option + # can cause unpleasant interactions with gold (see + # https://sourceware.org/bugzilla/show_bug.cgi?id=25921 for details). + message(STATUS "trying -fcf-protection=none workaround") + SET(CMAKE_REQUIRED_FLAGS "-fuse-ld=gold -fsplit-stack -fcf-protection=none") + check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" SPLIT_STACK_WORKAROUND) + if(SPLIT_STACK_WORKAROUND) + message(STATUS "applying -fcf-protection=none workaround") + set(C_SUPPORTS_SPLIT_STACK 1) + endif() + endif() + else() + set(C_SUPPORTS_SPLIT_STACK 1) + endif() if(NOT C_SUPPORTS_SPLIT_STACK) message(SEND_ERROR "C compiler does not support -fsplit-stack") else()