Skip to content

Write barrier without any RWX pages #114982

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 37 commits into from
May 15, 2025
Merged
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
bfd57cd
Builds with write barrier moved
davidwrighton Apr 22, 2025
02b9ea6
More adjustment
davidwrighton Apr 22, 2025
273b640
Merge branch 'main' of https://github.com/dotnet/runtime into WriteBa…
davidwrighton Apr 22, 2025
17ad508
In theory all mucked up to make this work on Windows Amd64... Or at l…
davidwrighton Apr 23, 2025
4669265
Fix config settings for write barrier
davidwrighton Apr 23, 2025
a24a67e
Get the Arm64 build to work on Windows
davidwrighton Apr 23, 2025
a858993
Fix arm64 build
davidwrighton Apr 25, 2025
1c4c79a
Fix arm build
davidwrighton Apr 25, 2025
999b466
Fix RiscV build
davidwrighton Apr 25, 2025
547fb96
Fix Loongarch64 build
davidwrighton Apr 25, 2025
9fd2921
Fix Windows X86 build
davidwrighton Apr 26, 2025
9c2e247
Attempt to fix Windows Arm64 and Windows X86 issues
davidwrighton Apr 28, 2025
4601ff8
Attempt to fix Linux Arm build
davidwrighton Apr 28, 2025
ff8a695
Fix Linux Arm32
davidwrighton Apr 29, 2025
a882fbf
Alternative approach to fixing the EH issue that may fix OSX as well.…
davidwrighton Apr 29, 2025
f5a07a7
Revert "Alternative approach to fixing the EH issue that may fix OSX …
davidwrighton Apr 29, 2025
45a866b
Fix the Linux Arm32 Rhp write barrier to support FEATURE_USE_SOFTWARE…
davidwrighton Apr 29, 2025
516656e
Remove ALTERNATE_ENTRY AVLocations
davidwrighton Apr 30, 2025
2b791c6
Reapply "Alternative approach to fixing the EH issue that may fix OSX…
davidwrighton Apr 30, 2025
ecc06a7
Use the different style of lookup only on apple platforms on CoreCLR
davidwrighton Apr 30, 2025
e8c9a34
Fix build breaks
davidwrighton May 1, 2025
e992b86
Go back to using AVLocation alternate entries (The stae of Fix th Lin…
davidwrighton May 1, 2025
db5d24f
Attempt to fix arm32 build issue
davidwrighton May 1, 2025
f3f9320
Attempt to fix NullRefernce problem by moving ALTERNATE_ENTRY to star…
davidwrighton May 1, 2025
c35cbbd
Fix Windows X86 build
davidwrighton May 1, 2025
0fa2885
Linux X86 builds, and probably works
davidwrighton May 1, 2025
89422b6
Fix arm build
davidwrighton May 2, 2025
fd2cc83
Attempt to workaround build failures on apple platforms
davidwrighton May 2, 2025
4dd7420
Sigh...
davidwrighton May 2, 2025
5ab9e76
Fix more build breaks
davidwrighton May 2, 2025
9467e25
Put the write watch table update in the right spot
davidwrighton May 2, 2025
4e1ee53
Set UseGCWriteBarrierCopy to its production value
davidwrighton May 5, 2025
3383a68
Merge branch 'main' of github.com:dotnet/runtime into WriteBarrier_Wi…
davidwrighton May 5, 2025
6ca2479
Fix Windows X86 issue where the we failed to stack walk out of a writ…
davidwrighton May 5, 2025
435c220
Code review feedback
davidwrighton May 6, 2025
2950b1f
Try the cfi_startproc/cfi_endproc wrappers for ALTERNATE_ENTRY to see…
davidwrighton May 13, 2025
247ae5f
Merge branch 'main' of https://github.com/dotnet/runtime into WriteBa…
davidwrighton May 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/coreclr/inc/clrconfigvalues.h
Original file line number Diff line number Diff line change
@@ -254,6 +254,7 @@ CONFIG_DWORD_INFO(INTERNAL_FastGCCheckStack, W("FastGCCheckStack"), 0, "")
CONFIG_DWORD_INFO(INTERNAL_FastGCStress, W("FastGCStress"), 0, "Reduce the number of GCs done by enabling GCStress")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_GCBreakOnOOM, W("GCBreakOnOOM"), 0, "Does a DebugBreak at the soonest time we detect an OOM")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_gcConcurrent, W("gcConcurrent"), (DWORD)-1, "Enables/Disables concurrent GC")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_UseGCWriteBarrierCopy, W("UseGCWriteBarrierCopy"), 1, "Use a copy of the write barrier for the GC. This is somewhat faster and for optimizations where the barrier is mutated as the program runs. Setting this to 0 removes scenarios where the write barrier is ever mutable.")

#ifdef FEATURE_CONSERVATIVE_GC
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_gcConservative, W("gcConservative"), 0, "Enables/Disables conservative GC")
32 changes: 16 additions & 16 deletions src/coreclr/inc/jithelpers.h
Original file line number Diff line number Diff line change
@@ -184,11 +184,11 @@
JITHELPER(CORINFO_HELP_CHECK_OBJ, JIT_CheckObj, METHOD__NIL)

// GC Write barrier support
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF, JIT_WriteBarrier, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF, JIT_CheckedWriteBarrier,METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF, RhpAssignRef, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF, RhpCheckedAssignRef,METHOD__NIL)
JITHELPER(CORINFO_HELP_ASSIGN_REF_ENSURE_NONHEAP, JIT_WriteBarrierEnsureNonHeapTarget,METHOD__NIL)

DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_BYREF, JIT_ByRefWriteBarrier,METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_BYREF, RhpByRefAssignRef,METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_BULK_WRITEBARRIER, NULL, METHOD__BUFFER__MEMCOPYGC)

// Accessing fields
@@ -286,19 +286,19 @@
#endif // !FEATURE_EH_FUNCLETS

#ifdef TARGET_X86
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EAX, JIT_WriteBarrierEAX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EBX, JIT_WriteBarrierEBX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_ECX, JIT_WriteBarrierECX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_ESI, JIT_WriteBarrierESI, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EDI, JIT_WriteBarrierEDI, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EBP, JIT_WriteBarrierEBP, METHOD__NIL)

JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EAX, JIT_CheckedWriteBarrierEAX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EBX, JIT_CheckedWriteBarrierEBX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_ECX, JIT_CheckedWriteBarrierECX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_ESI, JIT_CheckedWriteBarrierESI, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EDI, JIT_CheckedWriteBarrierEDI, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EBP, JIT_CheckedWriteBarrierEBP, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EAX, RhpAssignRefEAX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EBX, RhpAssignRefEBX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_ECX, RhpAssignRefECX, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_ESI, RhpAssignRefESI, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EDI, RhpAssignRefEDI, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ASSIGN_REF_EBP, RhpAssignRefEBP, METHOD__NIL)

JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EAX, RhpCheckedAssignRefEAX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EBX, RhpCheckedAssignRefEBX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_ECX, RhpCheckedAssignRefECX, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_ESI, RhpCheckedAssignRefESI, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EDI, RhpCheckedAssignRefEDI, METHOD__NIL)
JITHELPER(CORINFO_HELP_CHECKED_ASSIGN_REF_EBP, RhpCheckedAssignRefEBP, METHOD__NIL)
#else
JITHELPER(CORINFO_HELP_ASSIGN_REF_EAX, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_ASSIGN_REF_EBX, NULL, METHOD__NIL)
4 changes: 3 additions & 1 deletion src/coreclr/jit/targetarm.h
Original file line number Diff line number Diff line change
@@ -138,7 +138,8 @@
// On exit:
// r0: trashed
// r3: trashed
// CORINFO_HELP_ASSIGN_BYREF (JIT_ByRefWriteBarrier):
// r12: trashed
// CORINFO_HELP_ASSIGN_BYREF (JIT_ByRefWriteBarrier):
// On entry:
// r0: the destination address (object reference written here)
// r1: the source address (points to object reference to write)
@@ -147,6 +148,7 @@
// r1: incremented by 4
// r2: trashed
// r3: trashed
// r12: trashed

#define REG_WRITE_BARRIER_DST REG_ARG_0
#define RBM_WRITE_BARRIER_DST RBM_ARG_0
2 changes: 1 addition & 1 deletion src/coreclr/nativeaot/Runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -213,7 +213,7 @@ list(APPEND RUNTIME_SOURCES_ARCH_ASM
${ARCH_SOURCES_DIR}/InteropThunksHelpers.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/StubDispatch.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/UniversalTransition.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/WriteBarriers.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/WriteBarriers.${ASM_SUFFIX}
)

if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)
7 changes: 7 additions & 0 deletions src/coreclr/nativeaot/Runtime/arm/AsmMacros_Shared.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// This file is used to allow sharing of assembly code between NativeAOT and CoreCLR, which have different conventions about how to ensure that constants offsets are accessible

#include "AsmOffsets.inc"
#include <unixasmmacros.inc>
6 changes: 6 additions & 0 deletions src/coreclr/nativeaot/Runtime/i386/AsmMacros_Shared.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// This file is used to allow sharing of assembly code between NativeAOT and CoreCLR, which have different conventions about how to ensure that constants offsets are accessible

// TODO: Implement
6 changes: 6 additions & 0 deletions src/coreclr/nativeaot/Runtime/i386/AsmMacros_Shared.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; Licensed to the .NET Foundation under one or more agreements.
; The .NET Foundation licenses this file to you under the MIT license.

; This file is used to allow sharing of assembly code between NativeAOT and CoreCLR, which have different conventions about how to ensure that constants offsets are accessible

include AsmMacros.inc
4 changes: 0 additions & 4 deletions src/coreclr/nativeaot/Runtime/i386/WriteBarriers.S

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// This file is used to allow sharing of assembly code between NativeAOT and CoreCLR, which have different conventions about how to ensure that constants offsets are accessible

#include <unixasmmacros.inc>
#include "AsmOffsets.inc"
7 changes: 7 additions & 0 deletions src/coreclr/nativeaot/Runtime/riscv64/AsmMacros_Shared.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// This file is used to allow sharing of assembly code between NativeAOT and CoreCLR, which have different conventions about how to ensure that constants offsets are accessible

#include <unixasmmacros.inc>
#include "AsmOffsets.inc"
18 changes: 18 additions & 0 deletions src/coreclr/pal/inc/unixasmmacrosarm.inc
Original file line number Diff line number Diff line change
@@ -44,10 +44,28 @@ C_FUNC(\Name\()_End):
nop
.endm

.macro GLOBAL_LABEL Name
.global C_FUNC(\Name)
C_FUNC(\Name):
.endm

.macro ALTERNATE_ENTRY Name
.global C_FUNC(\Name)
.type \Name, %function
C_FUNC(\Name):
.endm

.macro PREPARE_EXTERNAL_VAR Name, HelperReg
ldr \HelperReg, [pc, #C_FUNC(\Name)@GOTPCREL]
.endm

.macro PREPARE_EXTERNAL_VAR_INDIRECT Name, HelperReg
movw \HelperReg, #:lower16:C_FUNC(\Name) - (. + 12)
movt \HelperReg, #:upper16:C_FUNC(\Name) - (. + 8)
add \HelperReg, pc
ldr \HelperReg, [\HelperReg]
.endm

.macro push_nonvol_reg Register
push \Register
.save \Register
16 changes: 16 additions & 0 deletions src/coreclr/pal/inc/unixasmmacrosloongarch64.inc
Original file line number Diff line number Diff line change
@@ -17,6 +17,12 @@
C_FUNC(\Name):
.endm

.macro ALTERNATE_ENTRY Name
.global C_FUNC(\Name)
.hidden C_FUNC(\Name)
C_FUNC(\Name):
.endm

.macro LEAF_ENTRY Name, Section
.global C_FUNC(\Name)
.type \Name, %function
@@ -41,6 +47,16 @@ C_FUNC(\Name\()_End):
la.local \HelperReg, \Name
.endm

.macro PREPARE_EXTERNAL_VAR_INDIRECT Name, HelperReg
la.local \HelperReg, \Name
ld.d \HelperReg, \HelperReg, 0
.endm

.macro PREPARE_EXTERNAL_VAR_INDIRECT_W Name, HelperReg
la.local \HelperReg, \Name
ld.w \HelperReg, \HelperReg, 0
.endm

.macro PROLOG_STACK_ALLOC Size
addi.d $sp, $sp, -\Size
//.cfi_adjust_cfa_offset \Size
6 changes: 6 additions & 0 deletions src/coreclr/pal/inc/unixasmmacrosriscv64.inc
Original file line number Diff line number Diff line change
@@ -37,6 +37,12 @@ C_FUNC(\Name\()_End):
nop
.endm

.macro ALTERNATE_ENTRY Name
.global C_FUNC(\Name)
.hidden C_FUNC(\Name)
C_FUNC(\Name):
.endm

.macro PREPARE_EXTERNAL_VAR Name, HelperReg
lla \HelperReg, \Name
.endm
6 changes: 6 additions & 0 deletions src/coreclr/pal/inc/unixasmmacrosx86.inc
Original file line number Diff line number Diff line change
@@ -24,6 +24,12 @@ C_FUNC(\Name):
C_FUNC(\Name):
.endm

.macro ALTERNATE_ENTRY Name
.global C_FUNC(\Name)
.type \Name, %function
C_FUNC(\Name):
.endm

.macro LEAF_END Name, Section
.size \Name, .-\Name
.cfi_endproc
17 changes: 17 additions & 0 deletions src/coreclr/runtime/amd64/StubDispatch.S
Original file line number Diff line number Diff line change
@@ -6,6 +6,15 @@

#ifdef FEATURE_CACHED_INTERFACE_DISPATCH

#if defined(__APPLE__)
// Currently the build is failing without this due to an issue if the first method in the assembly file has an alternate entry at the start of the file.
// Fix, but adding an empty, unused method
LEAF_ENTRY RhpStubDispatchDoNotFailToBuild, _TEXT
ret
LEAF_END RhpStubDispatchDoNotFailToBuild, _TEXT
#endif


// trick to avoid PLT relocation at runtime which corrupts registers
#define REL_C_FUNC(name) C_FUNC(name)@gotpcrel

@@ -20,7 +29,15 @@ LEAF_ENTRY RhpInterfaceDispatch\entries, _TEXT
mov r10, [r11 + OFFSETOF__InterfaceDispatchCell__m_pCache]

// Load the MethodTable from the object instance in rdi.
#ifdef TARGET_APPLE
// Apple's linker has issues which break unwind info if
// an ALTERNATE_ENTRY is present in the middle of a function see https://github.com/dotnet/runtime/pull/114982#discussion_r2083272768
.cfi_endproc
#endif
ALTERNATE_ENTRY RhpInterfaceDispatchAVLocation\entries
#ifdef TARGET_APPLE
.cfi_startproc
#endif
mov rax, [rdi]

CurrentOffset = OFFSETOF__InterfaceDispatchCache__m_rgEntries
Original file line number Diff line number Diff line change
@@ -2,7 +2,15 @@
// The .NET Foundation licenses this file to you under the MIT license.

.intel_syntax noprefix
#include <unixasmmacros.inc>
#include "AsmMacros_Shared.h"

#if defined(__APPLE__)
// Currently the build is failing without this due to an issue if the first method in the assembly file has an alternate entry at the start of the file.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not failing in NativeAOT build today?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that I look at it, this probably isn't necessary in the amd64 write barrier since it wasn't complaining before.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This leads me to wonder if maybe the issue on MacOS arm64 with having an alternate entry as the first symbol in the object file was that since our alternate entry macro doesn't set the thumb bit, the offset for the alternate entry was before that of the normal function symbol for the first symbol in the object file. Time for an experiment. Sigh.

Copy link
Member

@filipnavara filipnavara May 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thumb bit is only relevant for arm32 so that should not matter here.

Also, the issue with first symbol in object file is known ld64 bug, see #114982 (comment).

// Fix, but adding an empty, unused method
LEAF_ENTRY RhpWriteBarriersDoNotFailToBuild, _TEXT
ret
LEAF_END RhpWriteBarriersDoNotFailToBuild, _TEXT
#endif

#ifdef WRITE_BARRIER_CHECK

@@ -261,7 +269,15 @@ LEAF_END RhpCheckedXchg, _TEXT
LEAF_ENTRY RhpByRefAssignRef, _TEXT
ALTERNATE_ENTRY RhpByRefAssignRefAVLocation1
mov rcx, [rsi]
#ifdef TARGET_APPLE
// Apple's linker has issues which break unwind info if
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the manifestation of the bad unwind info?

If it is just when single stepping in lldb, do we care?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The manifestation is that if we AV on this location, we are unable to unwind to the managed frame, so we failfast the process instead of producing a NullReferenceException which can be caught.

Copy link
Member

@jkotas jkotas May 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be better to use the same manual uwnind routine in regular CoreCLR as we use in NAOT to avoid this problem?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is another approach where we don't use libunwind for unwinding these entries, instead we use our own unwinder which is special cased to know what to do. (This is what NativeAot does.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Unlike NativeAOT, CoreCLR implements the Apple compact unwinding through a modified copy of the llvm-libunwind code; libunwind should not even come into play for this since it's covered by the compact codes.)

Copy link
Member

@filipnavara filipnavara May 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When I was doing fixes of the osx-arm64 NativeAOT port I found a bug in llvm-libunwind comparison of the boundary comparison for IP addresses and function start/end (cb6fb60#diff-fa7a2ccbf98ccd844bfc21e48f2bc700137c2903cf97d487fa011e16b1f9b3c0).

I looked at the custom unwinding code in CoreCLR and there are similar comparisons that look sketchy:

if (ip < funcStart || ip > funcEnd) {
ERROR("ip %p not in regular second level\n", (void*)ip);
return false;
}

if (ip < funcStart || ip > funcEnd) {
ERROR("ip %p not in compressed second level\n", (void*)ip);
return false;
}

(in both cases the condition should presumably be ip >= funcEnd, not ip > funcEnd; shouldn't really cause an error for alt_entry though..)

// an ALTERNATE_ENTRY is present in the middle of a function see https://github.com/dotnet/runtime/pull/114982#discussion_r2083272768
.cfi_endproc
#endif
ALTERNATE_ENTRY RhpByRefAssignRefAVLocation2
#ifdef TARGET_APPLE
.cfi_startproc
#endif
mov [rdi], rcx

// Check whether the writes were even into the heap. If not there's no card update required.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
;; Licensed to the .NET Foundation under one or more agreements.
;; The .NET Foundation licenses this file to you under the MIT license.

include AsmMacros.inc
include AsmMacros_Shared.inc

;; Macro used to copy contents of newly updated GC heap locations to a shadow copy of the heap. This is used
;; during garbage collections to verify that object references where never written to the heap without using a
3 changes: 1 addition & 2 deletions src/coreclr/runtime/arm/StubDispatch.S
Original file line number Diff line number Diff line change
@@ -4,8 +4,7 @@
.syntax unified
.thumb

#include <AsmOffsets.inc> // generated by the build from AsmOffsets.cpp
#include <unixasmmacros.inc>
#include "AsmMacros_Shared.h"

#ifdef FEATURE_CACHED_INTERFACE_DISPATCH

Loading
Oops, something went wrong.
Loading
Oops, something went wrong.