From fef1a9ea6bbf615cec28068717e48df5b19585eb Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Mon, 3 May 2021 10:56:08 -0700 Subject: [PATCH 01/17] Fix RHEL 8 ARM64 Clang on ARM64 places the .rodata section into the same segment as .text. On RHEL 8 ARM64, the kernel is configured for 64kB memory pages. When we flip the page protection of the page containing the GS cookie to RW and back to RO, we assume that the cookie lives in a non-executable memory. This assumption is broken on RHEL 8 and we end up setting protection of a part of the coreclr code to read only instead of back to RX. This change switches the linker we use to lld from the previously used gnu linker. That linker places .rodata into a different segment than .text by default. Moreover, I was planning to move to using lld anyways to use all build tools from LLVM. --- eng/native/configurecompiler.cmake | 2 ++ src/coreclr/vm/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 92a715f38d9324..fc70460a2d18e0 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -113,6 +113,8 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) + add_linker_flag(-fuse-ld=lld) + set(CLR_SANITIZE_CXX_OPTIONS "") set(CLR_SANITIZE_LINK_OPTIONS "") diff --git a/src/coreclr/vm/CMakeLists.txt b/src/coreclr/vm/CMakeLists.txt index f31e5a3ca12a68..d0f96523613bc5 100644 --- a/src/coreclr/vm/CMakeLists.txt +++ b/src/coreclr/vm/CMakeLists.txt @@ -855,7 +855,6 @@ elseif(CLR_CMAKE_TARGET_ARCH_ARM64) set(VM_SOURCES_DAC_AND_WKS_ARCH ${ARCH_SOURCES_DIR}/stubs.cpp exceptionhandling.cpp - gcinfodecoder.cpp ) set(VM_HEADERS_DAC_AND_WKS_ARCH @@ -865,6 +864,7 @@ elseif(CLR_CMAKE_TARGET_ARCH_ARM64) set(VM_SOURCES_WKS_ARCH ${ARCH_SOURCES_DIR}/profiler.cpp + gcinfodecoder.cpp ) if(CLR_CMAKE_HOST_UNIX) From 285cada6d1265c255f2ea632e94de4810993ccf6 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Tue, 4 May 2021 07:06:30 -0700 Subject: [PATCH 02/17] Fix ARM build to use PC relative addresses only The lld linker has revealed that we were using absolute addresses in some asm helpers and so load time relocation was necessary. This change fixes it by replacing all of those by PC relative ones. --- src/coreclr/vm/arm/asmhelpers.S | 5 +++-- src/coreclr/vm/arm/pinvokestubs.S | 15 +++++++++------ src/coreclr/vm/arm/stubs.cpp | 6 +++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/coreclr/vm/arm/asmhelpers.S b/src/coreclr/vm/arm/asmhelpers.S index 3faa8fe36846ed..f098901bb63e73 100644 --- a/src/coreclr/vm/arm/asmhelpers.S +++ b/src/coreclr/vm/arm/asmhelpers.S @@ -928,8 +928,9 @@ LOCAL_LABEL(CallCppHelper3): .endm .macro JIT_WRITEBARRIER_DESCRIPTOR name - .word \name - .word \name\()_End +1: + .word \name-1b + .word \name\()_End-1b .word __\name\()__g_lowest_address_offset .word __\name\()__g_highest_address_offset .word __\name\()__g_ephemeral_low_offset diff --git a/src/coreclr/vm/arm/pinvokestubs.S b/src/coreclr/vm/arm/pinvokestubs.S index 8e7c468c361631..d8551b5875c335 100644 --- a/src/coreclr/vm/arm/pinvokestubs.S +++ b/src/coreclr/vm/arm/pinvokestubs.S @@ -84,7 +84,9 @@ PROLOG_PUSH "{r4, lr}" - ldr r1, =s_gsCookie + ldr r1, =s_gsCookie-(1f+4) +1: + add r1, pc ldr r1, [r1] str r1, [r0] add r4, r0, SIZEOF__GSCookie @@ -92,7 +94,9 @@ // r4 = pFrame // set first slot to the value of InlinedCallFrame::`vftable' (checked by runtime code) - ldr r1, .L12 + ldr r1, =_ZTV16InlinedCallFrame+8-2f +2: + add r1, pc str r1, [r4] mov r1, 0 @@ -123,9 +127,6 @@ NESTED_END JIT_PInvokeBegin, _TEXT -.L12: - .word _ZTV16InlinedCallFrame+8 - // ------------------------------------------------------------------ // IN: // InlinedCallFrame (r0) = pointer to the InlinedCallFrame data, including the GS cookie slot (GS cookie right @@ -145,7 +146,9 @@ str r2, [r1, #Thread_m_fPreemptiveGCDisabled] // Check return trap - ldr r2, =g_TrapReturningThreads + ldr r2, =g_TrapReturningThreads-(1f+4) +1: + add r2, pc ldr r2, [r2] cbnz r2, LOCAL_LABEL(RarePath) diff --git a/src/coreclr/vm/arm/stubs.cpp b/src/coreclr/vm/arm/stubs.cpp index 6e62df2370338c..6b4f71f2455308 100644 --- a/src/coreclr/vm/arm/stubs.cpp +++ b/src/coreclr/vm/arm/stubs.cpp @@ -281,8 +281,8 @@ void StubLinkerCPU::Init(void) // value of the global into a register. struct WriteBarrierDescriptor { - BYTE * m_pFuncStart; // Pointer to the start of the barrier function - BYTE * m_pFuncEnd; // Pointer to the end of the barrier function + DWORD m_pFuncStart; // Offset to the start of the barrier function relative to this struct address + DWORD m_pFuncEnd; // Offset to the end of the barrier function relative to this struct address DWORD m_dw_g_lowest_address_offset; // Offset of the instruction reading g_lowest_address DWORD m_dw_g_highest_address_offset; // Offset of the instruction reading g_highest_address DWORD m_dw_g_ephemeral_low_offset; // Offset of the instruction reading g_ephemeral_low @@ -440,7 +440,7 @@ void UpdateGCWriteBarriers(bool postGrow = false) { // If the write barrier is being currently used (as in copied over to the patchable site) // then read the patch location from the table and use the offset to patch the target asm code - PBYTE to = FindWBMapping(pDesc->m_pFuncStart); + PBYTE to = FindWBMapping((BYTE *)pDesc + pDesc->m_pFuncStart); if(to) { to = (PBYTE)PCODEToPINSTR((PCODE)GetWriteBarrierCodeLocation(to)); From 9970b602bd1cdfbdc9d5a320e8b3ab93fe778d50 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 14 Jul 2021 15:48:39 -0700 Subject: [PATCH 03/17] Update docker images used for building runtime Use new images that have lld linker --- eng/common/templates/jobs/source-build.yml | 2 +- eng/pipelines/common/platform-matrix.yml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/common/templates/jobs/source-build.yml b/eng/common/templates/jobs/source-build.yml index 00aa98eb3bfd38..b7737ffec3ef48 100644 --- a/eng/common/templates/jobs/source-build.yml +++ b/eng/common/templates/jobs/source-build.yml @@ -14,7 +14,7 @@ parameters: # This is the default platform provided by Arcade, intended for use by a managed-only repo. defaultManagedPlatform: name: 'Managed' - container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343' + container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2' # Defines the platforms on which to run build jobs. One job is created for each platform, and the # object in this array is sent to the job template as 'platform'. If no platforms are specified, diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml index defd34be84ae2e..726dcf22bcf5ea 100644 --- a/eng/pipelines/common/platform-matrix.yml +++ b/eng/pipelines/common/platform-matrix.yml @@ -91,7 +91,7 @@ jobs: targetRid: linux-musl-x64 platform: Linux_musl_x64 container: - image: alpine-3.9-WithNode-20200602002639-0fc54a3 + image: alpine-3.9-WithNode-20210714125437-9b5bbc2 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -116,7 +116,7 @@ jobs: targetRid: linux-musl-arm platform: Linux_musl_arm container: - image: ubuntu-16.04-cross-arm-alpine-20210409142327-044d5b9 + image: ubuntu-16.04-cross-arm-alpine-20210528184631-044d5b9 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -143,7 +143,7 @@ jobs: targetRid: linux-musl-arm64 platform: Linux_musl_arm64 container: - image: ubuntu-16.04-cross-arm64-alpine-20200413125008-406629a + image: ubuntu-16.04-cross-arm64-alpine-20210528184631-b2c2436 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -169,7 +169,7 @@ jobs: targetRid: linux-x64 platform: Linux_x64 container: - image: centos-7-20201227183837-5fe0e50 + image: centos-7-20210714125435-9b5bbc2 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -193,7 +193,7 @@ jobs: targetRid: linux-x64 platform: Linux_x64 container: - image: centos-7-source-build-20210408124356-5d87b80 + image: centos-7-source-build-20210714125450-5d87b80 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} From 3bd6fbf7bc891287c23d629bf1e13e6cea195ab2 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 14 Jul 2021 15:54:42 -0700 Subject: [PATCH 04/17] Disable lld linker for s390x There is no support for lld on that platform yet --- eng/native/configurecompiler.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index fc70460a2d18e0..5b035f5089e0c6 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -113,7 +113,9 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) - add_linker_flag(-fuse-ld=lld) + if (NOT CLR_CMAKE_HOST_ARCH_S390X) + add_linker_flag(-fuse-ld=lld) + endif () set(CLR_SANITIZE_CXX_OPTIONS "") set(CLR_SANITIZE_LINK_OPTIONS "") From 0433807222cdc1851b569d95dc4286d9eab1ef1e Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 15 Jul 2021 01:19:12 -0700 Subject: [PATCH 05/17] Do not add the lld option for macOS and FreeBSD --- eng/native/configurecompiler.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 5b035f5089e0c6..6b9d122abdafc3 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -113,7 +113,7 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) - if (NOT CLR_CMAKE_HOST_ARCH_S390X) + if (NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) add_linker_flag(-fuse-ld=lld) endif () From 1ea2887ecb2a86f0792175397f9b58db90162780 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 15 Jul 2021 05:13:51 -0700 Subject: [PATCH 06/17] Make adding the lld only when compiling with Clang --- eng/native/configurecompiler.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 6b9d122abdafc3..b281c60b31c948 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -113,7 +113,7 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) - if (NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) + if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) add_linker_flag(-fuse-ld=lld) endif () From 9bfa3a0bafb7518dc2911d3bbb78f3a67e6cc570 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 15 Jul 2021 12:34:41 -0700 Subject: [PATCH 07/17] Move LLD configuration into configuretools.cmake Also update PGO stuff to not to use gold linker when lld is present. --- eng/native/configurecompiler.cmake | 4 ---- eng/native/configuretools.cmake | 28 +++++++++++++++++----------- eng/native/functions.cmake | 2 +- src/coreclr/pgosupport.cmake | 10 ++++++++-- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index b281c60b31c948..92a715f38d9324 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -113,10 +113,6 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) - if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) - add_linker_flag(-fuse-ld=lld) - endif () - set(CLR_SANITIZE_CXX_OPTIONS "") set(CLR_SANITIZE_LINK_OPTIONS "") diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 37f3b4932cd228..f7cbc7a5048ee1 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -64,17 +64,23 @@ if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER) endif() if (NOT CLR_CMAKE_HOST_WIN32) - # detect linker - set(ldVersion ${CMAKE_C_COMPILER};-Wl,--version) - execute_process(COMMAND ${ldVersion} - ERROR_QUIET - OUTPUT_VARIABLE ldVersionOutput) - if("${ldVersionOutput}" MATCHES "GNU ld" OR "${ldVersionOutput}" MATCHES "GNU gold" OR "${ldVersionOutput}" MATCHES "GNU linkers") - set(LD_GNU 1) - elseif("${ldVersionOutput}" MATCHES "Solaris Link") - set(LD_SOLARIS 1) - else(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) - set(LD_OSX 1) + if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) + add_linker_flag(-fuse-ld=lld) + set(LD_LLVM 1) + else() + # detect linker + set(ldVersion ${CMAKE_C_COMPILER};-Wl,--version) + execute_process(COMMAND ${ldVersion} + ERROR_QUIET + OUTPUT_VARIABLE ldVersionOutput) + + if("${ldVersionOutput}" MATCHES "GNU ld" OR "${ldVersionOutput}" MATCHES "GNU gold" OR "${ldVersionOutput}" MATCHES "GNU linkers") + set(LD_GNU 1) + elseif("${ldVersionOutput}" MATCHES "Solaris Link") + set(LD_SOLARIS 1) + else(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) + set(LD_OSX 1) + endif() endif() endif() diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake index 1ca230c3e534d7..0d03cc3d2d46eb 100644 --- a/eng/native/functions.cmake +++ b/eng/native/functions.cmake @@ -157,7 +157,7 @@ function(preprocess_files PreprocessedFilesList) endfunction() function(set_exports_linker_option exports_filename) - if(LD_GNU OR LD_SOLARIS) + if(LD_GNU OR LD_SOLARIS OR LD_LLVM) # Add linker exports file option if(LD_SOLARIS) set(EXPORTS_LINKER_OPTION -Wl,-M,${exports_filename} PARENT_SCOPE) diff --git a/src/coreclr/pgosupport.cmake b/src/coreclr/pgosupport.cmake index c0791c445f0828..1c1ce535518f51 100644 --- a/src/coreclr/pgosupport.cmake +++ b/src/coreclr/pgosupport.cmake @@ -23,7 +23,10 @@ function(add_pgo TargetName) else(CLR_CMAKE_HOST_WIN32) if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO) target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-generate) - set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fuse-ld=gold -fprofile-instr-generate") + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fprofile-instr-generate") + if(NOT LD_LLVM) + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold") + endif() endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO) endif(CLR_CMAKE_HOST_WIN32) elseif(CLR_CMAKE_PGO_OPTIMIZE) @@ -54,7 +57,10 @@ function(add_pgo TargetName) if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6)) if(HAVE_LTO) target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-use=${ProfilePath} -Wno-profile-instr-out-of-date -Wno-profile-instr-unprofiled) - set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fuse-ld=gold -fprofile-instr-use=${ProfilePath}") + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fprofile-instr-use=${ProfilePath}") + if(NOT LD_LLVM) + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold") + endif() else(HAVE_LTO) message(WARNING "LTO is not supported, skipping profile guided optimizations") endif(HAVE_LTO) From 99aa11126df4b8fac866f48d36d800d4bc724e34 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Mon, 19 Jul 2021 08:38:50 -0700 Subject: [PATCH 08/17] Update arm/arm64 docker images --- eng/pipelines/common/platform-matrix.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml index 726dcf22bcf5ea..15fe948e92967e 100644 --- a/eng/pipelines/common/platform-matrix.yml +++ b/eng/pipelines/common/platform-matrix.yml @@ -38,7 +38,7 @@ jobs: targetRid: linux-arm platform: Linux_arm container: - image: ubuntu-16.04-cross-20200413125008-09ec757 + image: ubuntu-16.04-cross-20210719121212-8a8d3be registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -64,7 +64,7 @@ jobs: targetRid: linux-arm64 platform: Linux_arm64 container: - image: ubuntu-16.04-cross-arm64-20201022204150-b2c2436 + image: ubuntu-16.04-cross-arm64-20210719121212-8a8d3be registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -116,7 +116,7 @@ jobs: targetRid: linux-musl-arm platform: Linux_musl_arm container: - image: ubuntu-16.04-cross-arm-alpine-20210528184631-044d5b9 + image: ubuntu-16.04-cross-arm-alpine-20210719121212-044d5b9 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} @@ -143,7 +143,7 @@ jobs: targetRid: linux-musl-arm64 platform: Linux_musl_arm64 container: - image: ubuntu-16.04-cross-arm64-alpine-20210528184631-b2c2436 + image: ubuntu-16.04-cross-arm64-alpine-20210719121212-b2c2436 registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} From 09c5999f50b79c8d1cdd06cfea5cecff2e32fe39 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Mon, 19 Jul 2021 14:56:51 -0700 Subject: [PATCH 09/17] Fix ARM reloc issue --- src/coreclr/vm/arm/asmhelpers.S | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/coreclr/vm/arm/asmhelpers.S b/src/coreclr/vm/arm/asmhelpers.S index f098901bb63e73..decc14d01ca7f9 100644 --- a/src/coreclr/vm/arm/asmhelpers.S +++ b/src/coreclr/vm/arm/asmhelpers.S @@ -979,14 +979,20 @@ g_rgWriteBarrierDescriptors: .global g_rgWriteBarrierDescriptors + .text + // ------------------------------------------------------------------ // __declspec(naked) void F_CALL_CONV JIT_WriteBarrier_Callable(Object **dst, Object* val) LEAF_ENTRY JIT_WriteBarrier_Callable // Branch to the write barrier - ldr r2, =JIT_WriteBarrier_Loc // or R3? See targetarm.h + ldr r2, 2f // or R3? See targetarm.h +1: + add r2, pc + ldr r2, [r2] ldr pc, [r2] - +2: + .long JIT_WriteBarrier_Loc(GOT_PREL)-((1b+4)-2b) LEAF_END JIT_WriteBarrier_Callable #ifdef FEATURE_READYTORUN From f1abcd31c55f34c404066819b261e1f53408eecb Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Tue, 20 Jul 2021 00:55:16 -0700 Subject: [PATCH 10/17] Limit the lld usage to Linux, fix arm32 issue --- eng/native/configuretools.cmake | 2 +- src/coreclr/vm/arm/asmhelpers.S | 5 +---- src/coreclr/vm/arm/pinvokestubs.S | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index f7cbc7a5048ee1..4382daf7a04ae3 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -65,7 +65,7 @@ endif() if (NOT CLR_CMAKE_HOST_WIN32) - if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT CLR_CMAKE_HOST_ARCH_S390X AND NOT CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_FREEBSD) + if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ARCH_S390X) add_linker_flag(-fuse-ld=lld) set(LD_LLVM 1) else() diff --git a/src/coreclr/vm/arm/asmhelpers.S b/src/coreclr/vm/arm/asmhelpers.S index decc14d01ca7f9..74c849402cbec2 100644 --- a/src/coreclr/vm/arm/asmhelpers.S +++ b/src/coreclr/vm/arm/asmhelpers.S @@ -986,13 +986,10 @@ g_rgWriteBarrierDescriptors: LEAF_ENTRY JIT_WriteBarrier_Callable // Branch to the write barrier - ldr r2, 2f // or R3? See targetarm.h + ldr r2, =JIT_WriteBarrier_Loc-(1f+4) // or R3? See targetarm.h 1: add r2, pc - ldr r2, [r2] ldr pc, [r2] -2: - .long JIT_WriteBarrier_Loc(GOT_PREL)-((1b+4)-2b) LEAF_END JIT_WriteBarrier_Callable #ifdef FEATURE_READYTORUN diff --git a/src/coreclr/vm/arm/pinvokestubs.S b/src/coreclr/vm/arm/pinvokestubs.S index d8551b5875c335..cd4928003b5932 100644 --- a/src/coreclr/vm/arm/pinvokestubs.S +++ b/src/coreclr/vm/arm/pinvokestubs.S @@ -94,7 +94,7 @@ // r4 = pFrame // set first slot to the value of InlinedCallFrame::`vftable' (checked by runtime code) - ldr r1, =_ZTV16InlinedCallFrame+8-2f + ldr r1, =_ZTV16InlinedCallFrame+8-(2f+4) 2: add r1, pc str r1, [r4] From e66eb50fbb9a66576878ee166c8d45cfa1a51b82 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 05:20:38 -0700 Subject: [PATCH 11/17] Disable lld for linux-musl until we move official builds to Alpine 3.13 --- eng/native/configuretools.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 4382daf7a04ae3..8e22ac311ef810 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -65,7 +65,7 @@ endif() if (NOT CLR_CMAKE_HOST_WIN32) - if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ARCH_S390X) + if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ALPINE_LINUX AND NOT CLR_CMAKE_HOST_ARCH_S390X) add_linker_flag(-fuse-ld=lld) set(LD_LLVM 1) else() From 33bb47ce1dffe5c2372afe0d982ea7cd39bc7358 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 08:54:34 -0700 Subject: [PATCH 12/17] Move lld setting to the runtime shell build scripts --- eng/native/build-commons.sh | 6 ++++++ eng/native/configuretools.cmake | 30 ++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh index e07b5e0048cf14..3e31e1dab1b9ff 100755 --- a/eng/native/build-commons.sh +++ b/eng/native/build-commons.sh @@ -94,6 +94,12 @@ build_native() cmakeArgs="-DCMAKE_SYSTEM_VARIANT=MacCatalyst $cmakeArgs" fi + if [[ "$__HostOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then + # When building on Linux, use the LLD linker + cmakeArgs="-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld $cmakeArgs" + fi + + if [[ "$__UseNinja" == 1 ]]; then generator="ninja" buildTool="$(command -v ninja || command -v ninja-build)" diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 8e22ac311ef810..7760ec5a229ad7 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -65,22 +65,20 @@ endif() if (NOT CLR_CMAKE_HOST_WIN32) - if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ALPINE_LINUX AND NOT CLR_CMAKE_HOST_ARCH_S390X) - add_linker_flag(-fuse-ld=lld) - set(LD_LLVM 1) - else() - # detect linker - set(ldVersion ${CMAKE_C_COMPILER};-Wl,--version) - execute_process(COMMAND ${ldVersion} - ERROR_QUIET - OUTPUT_VARIABLE ldVersionOutput) + # detect linker + separate_arguments(ldVersion NATIVE_COMMAND "${CMAKE_C_COMPILER} ${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version") + execute_process(COMMAND ${ldVersion} + ERROR_QUIET + OUTPUT_VARIABLE ldVersionOutput) - if("${ldVersionOutput}" MATCHES "GNU ld" OR "${ldVersionOutput}" MATCHES "GNU gold" OR "${ldVersionOutput}" MATCHES "GNU linkers") - set(LD_GNU 1) - elseif("${ldVersionOutput}" MATCHES "Solaris Link") - set(LD_SOLARIS 1) - else(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) - set(LD_OSX 1) - endif() + if("${ldVersionOutput}" MATCHES "LLD") + set(LD_LLVM 1) + elseif("${ldVersionOutput}" MATCHES "GNU ld" OR "${ldVersionOutput}" MATCHES "GNU gold" OR "${ldVersionOutput}" MATCHES "GNU linkers") + set(LD_GNU 1) + elseif("${ldVersionOutput}" MATCHES "Solaris Link") + set(LD_SOLARIS 1) + else(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) + set(LD_OSX 1) endif() + endif() From 3d1e65dc695bce6998404a0e752224edf651b9f1 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 09:48:24 -0700 Subject: [PATCH 13/17] Fix FreeBSD cross build --- eng/native/build-commons.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh index 3e31e1dab1b9ff..5c7f18bc9fee18 100755 --- a/eng/native/build-commons.sh +++ b/eng/native/build-commons.sh @@ -94,7 +94,7 @@ build_native() cmakeArgs="-DCMAKE_SYSTEM_VARIANT=MacCatalyst $cmakeArgs" fi - if [[ "$__HostOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then + if [[ "$targetOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then # When building on Linux, use the LLD linker cmakeArgs="-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld $cmakeArgs" fi From 5f0ff6d051fc6d2c396ce24f725aca340f91c918 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 10:41:13 -0700 Subject: [PATCH 14/17] Fix cmake 3.6 build issue --- eng/native/configuretools.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 7760ec5a229ad7..829574a94053bb 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -66,7 +66,7 @@ endif() if (NOT CLR_CMAKE_HOST_WIN32) # detect linker - separate_arguments(ldVersion NATIVE_COMMAND "${CMAKE_C_COMPILER} ${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version") + separate_arguments(ldVersion UNIX_COMMAND "${CMAKE_C_COMPILER} ${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version") execute_process(COMMAND ${ldVersion} ERROR_QUIET OUTPUT_VARIABLE ldVersionOutput) From bad50b6e69a15f06a57944074969ea789adbd9a6 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 13:24:09 -0700 Subject: [PATCH 15/17] Move LLD setting into init-compiler.sh --- eng/native/build-commons.sh | 6 ------ eng/native/init-compiler.sh | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh index 5c7f18bc9fee18..e07b5e0048cf14 100755 --- a/eng/native/build-commons.sh +++ b/eng/native/build-commons.sh @@ -94,12 +94,6 @@ build_native() cmakeArgs="-DCMAKE_SYSTEM_VARIANT=MacCatalyst $cmakeArgs" fi - if [[ "$targetOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then - # When building on Linux, use the LLD linker - cmakeArgs="-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld $cmakeArgs" - fi - - if [[ "$__UseNinja" == 1 ]]; then generator="ninja" buildTool="$(command -v ninja || command -v ninja-build)" diff --git a/eng/native/init-compiler.sh b/eng/native/init-compiler.sh index ca408e4d08816e..b58310a2b7e333 100755 --- a/eng/native/init-compiler.sh +++ b/eng/native/init-compiler.sh @@ -22,6 +22,12 @@ minorVersion="$4" # clear the existing CC and CXX from environment CC= CXX= +LDFLAGS= + +# if [[ "$targetOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then + # When building on Linux, use the LLD linker +# cmakeArgs="-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld $cmakeArgs" +# fi if [[ "$compiler" == "gcc" ]]; then cxxCompiler="g++"; fi @@ -106,6 +112,13 @@ if [[ -z "$CC" ]]; then exit 1 fi +if command -v "lld$desired_version" > /dev/null; then + # Only lld version >= 9 can be considered stable + if [[ "$majorVersion" -ge 9 ]]; then + LDFLAGS="-fuse-ld=lld" + fi +fi + SCAN_BUILD_COMMAND="$(command -v "scan-build$desired_version")" -export CC CXX SCAN_BUILD_COMMAND +export CC CXX LDFLAGS SCAN_BUILD_COMMAND From 0c4e7409ab249c2b0451d62e490474c667de75c5 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 21 Jul 2021 16:21:31 -0700 Subject: [PATCH 16/17] Cleanup of comments and spacing --- eng/native/configuretools.cmake | 2 -- eng/native/init-compiler.sh | 5 ----- src/coreclr/vm/arm/asmhelpers.S | 3 +-- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 829574a94053bb..136cd67925d0cb 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -64,7 +64,6 @@ if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER) endif() if (NOT CLR_CMAKE_HOST_WIN32) - # detect linker separate_arguments(ldVersion UNIX_COMMAND "${CMAKE_C_COMPILER} ${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version") execute_process(COMMAND ${ldVersion} @@ -80,5 +79,4 @@ if (NOT CLR_CMAKE_HOST_WIN32) else(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) set(LD_OSX 1) endif() - endif() diff --git a/eng/native/init-compiler.sh b/eng/native/init-compiler.sh index b58310a2b7e333..1a436cfd7b4ae9 100755 --- a/eng/native/init-compiler.sh +++ b/eng/native/init-compiler.sh @@ -24,11 +24,6 @@ CC= CXX= LDFLAGS= -# if [[ "$targetOS" == "Linux" && "$__DistroRid" != "linux-musl-"* ]]; then - # When building on Linux, use the LLD linker -# cmakeArgs="-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld $cmakeArgs" -# fi - if [[ "$compiler" == "gcc" ]]; then cxxCompiler="g++"; fi check_version_exists() { diff --git a/src/coreclr/vm/arm/asmhelpers.S b/src/coreclr/vm/arm/asmhelpers.S index 74c849402cbec2..2780f95912f173 100644 --- a/src/coreclr/vm/arm/asmhelpers.S +++ b/src/coreclr/vm/arm/asmhelpers.S @@ -979,8 +979,6 @@ g_rgWriteBarrierDescriptors: .global g_rgWriteBarrierDescriptors - .text - // ------------------------------------------------------------------ // __declspec(naked) void F_CALL_CONV JIT_WriteBarrier_Callable(Object **dst, Object* val) LEAF_ENTRY JIT_WriteBarrier_Callable @@ -990,6 +988,7 @@ g_rgWriteBarrierDescriptors: 1: add r2, pc ldr pc, [r2] + LEAF_END JIT_WriteBarrier_Callable #ifdef FEATURE_READYTORUN From 38566619bf79192d02491526af048dc13f21308a Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 22 Jul 2021 01:33:43 -0700 Subject: [PATCH 17/17] Use LLD only for builds with clang --- eng/native/init-compiler.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/eng/native/init-compiler.sh b/eng/native/init-compiler.sh index 1a436cfd7b4ae9..567d18da4747a1 100755 --- a/eng/native/init-compiler.sh +++ b/eng/native/init-compiler.sh @@ -107,10 +107,12 @@ if [[ -z "$CC" ]]; then exit 1 fi -if command -v "lld$desired_version" > /dev/null; then - # Only lld version >= 9 can be considered stable - if [[ "$majorVersion" -ge 9 ]]; then - LDFLAGS="-fuse-ld=lld" +if [[ "$compiler" == "clang" ]]; then + if command -v "lld$desired_version" > /dev/null; then + # Only lld version >= 9 can be considered stable + if [[ "$majorVersion" -ge 9 ]]; then + LDFLAGS="-fuse-ld=lld" + fi fi fi