Merge pull request #5382 from davmason/filtering
authorDavid Mason <davmason@microsoft.com>
Fri, 3 Jun 2016 19:02:08 +0000 (12:02 -0700)
committerDavid Mason <davmason@microsoft.com>
Fri, 3 Jun 2016 19:02:08 +0000 (12:02 -0700)
Add filtering logic to XplatEventLogger

937 files changed:
BuildToolsVersion.txt
Documentation/README.md
Documentation/botr/ryujit-overview.md
Documentation/building/linux-instructions.md
Documentation/building/viewing-jit-dumps.md [new file with mode: 0644]
Documentation/building/windows-instructions.md
Documentation/building/windows-test-instructions.md
Documentation/install/get-dotnetcore-dnx-linux.md [deleted file]
Documentation/install/get-dotnetcore-dnx-osx.md [deleted file]
Documentation/install/get-dotnetcore-dnx-windows.md [deleted file]
Documentation/install/get-dotnetcore-windows.md [deleted file]
Documentation/project-docs/clr-complus-conf-docgen.sh
Documentation/project-docs/clr-configuration-knobs.md
DotnetCLIVersion.txt
README.md
build-packages.sh
build.cmd
build.sh
clrdefinitions.cmake
cross/arm-softfp/tryrun.cmake
cross/arm/tryrun.cmake
dir.props
init-tools.cmd
init-tools.sh
netci.groovy
src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.builds
src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj
src/.nuget/Microsoft.NETCore.ILAsm/fedora/23/Microsoft.NETCore.ILAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.ILAsm/opensuse/13.2/Microsoft.NETCore.ILAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.ILAsm/ubuntu/14.04/Microsoft.NETCore.ILAsm.pkgproj [moved from src/.nuget/Microsoft.NETCore.ILAsm/ubuntu/Microsoft.NETCore.ILAsm.pkgproj with 96% similarity]
src/.nuget/Microsoft.NETCore.ILAsm/ubuntu/16.04/Microsoft.NETCore.ILAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.builds
src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj
src/.nuget/Microsoft.NETCore.ILDAsm/fedora/23/Microsoft.NETCore.ILDAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.ILDAsm/opensuse/13.2/Microsoft.NETCore.ILDAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.ILDAsm/ubuntu/14.04/Microsoft.NETCore.ILDAsm.pkgproj [moved from src/.nuget/Microsoft.NETCore.ILDAsm/ubuntu/Microsoft.NETCore.ILDAsm.pkgproj with 96% similarity]
src/.nuget/Microsoft.NETCore.ILDAsm/ubuntu/16.04/Microsoft.NETCore.ILDAsm.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.builds
src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.pkgproj
src/.nuget/Microsoft.NETCore.Jit/fedora/23/Microsoft.NETCore.Jit.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Jit/opensuse/13.2/Microsoft.NETCore.Jit.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Jit/ubuntu/14.04/Microsoft.NETCore.Jit.pkgproj [moved from src/.nuget/Microsoft.NETCore.Jit/ubuntu/Microsoft.NETCore.Jit.pkgproj with 96% similarity]
src/.nuget/Microsoft.NETCore.Jit/ubuntu/16.04/Microsoft.NETCore.Jit.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.builds
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.pkgproj
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/fedora/23/Microsoft.NETCore.Runtime.CoreCLR.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/opensuse/13.2/Microsoft.NETCore.Runtime.CoreCLR.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/ubuntu/14.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj [moved from src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/ubuntu/Microsoft.NETCore.Runtime.CoreCLR.pkgproj with 98% similarity]
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/ubuntu/16.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj [new file with mode: 0644]
src/.nuget/Microsoft.TargetingPack.Private.CoreCLR/Microsoft.TargetingPack.Private.CoreCLR.pkgproj
src/.nuget/packages.builds [new file with mode: 0644]
src/ToolBox/SOS/Strike/strike.cpp
src/ToolBox/SOS/Strike/util.cpp
src/binder/assemblybinder.cpp
src/binder/clrprivbinderassemblyloadcontext.cpp
src/binder/clrprivbindercoreclr.cpp
src/binder/inc/assemblybinder.hpp
src/classlibnative/bcltype/stringnative.cpp
src/classlibnative/bcltype/stringnative.h
src/classlibnative/float/CMakeLists.txt
src/classlibnative/float/Float.nativeproj
src/classlibnative/float/floatdouble.cpp [new file with mode: 0644]
src/classlibnative/float/floatnative.cpp [deleted file]
src/classlibnative/float/floatnative.h [deleted file]
src/classlibnative/float/floatsingle.cpp [new file with mode: 0644]
src/classlibnative/inc/floatclass.h [deleted file]
src/classlibnative/inc/floatdouble.h [new file with mode: 0644]
src/classlibnative/inc/floatsingle.h [new file with mode: 0644]
src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp
src/corefx/System.Globalization.Native/configure.cmake
src/debug/debug-pal/unix/twowaypipe.cpp
src/debug/ee/debugger.cpp
src/debug/inc/twowaypipe.h
src/debug/shared/dbgtransportsession.cpp
src/dlls/mscoree/Native.rc
src/gc/sample/gcenv.h
src/ilasm/CMakeLists.txt
src/ildasm/exe/CMakeLists.txt
src/ildasm/rcdll/CMakeLists.txt
src/inc/clrconfigvalues.h
src/inc/new.hpp
src/inc/readytorun.h
src/inc/readytorunhelpers.h
src/inc/utilcode.h
src/jit/CMakeLists.txt
src/jit/ClrJit.PAL.exports [new file with mode: 0644]
src/jit/codegenarm64.cpp
src/jit/codegencommon.cpp
src/jit/codegenlegacy.cpp
src/jit/codegenxarch.cpp
src/jit/compiler.cpp
src/jit/compiler.h
src/jit/compiler.hpp
src/jit/ee_il_dll.cpp
src/jit/eeinterface.cpp
src/jit/flowgraph.cpp
src/jit/gentree.cpp
src/jit/gentree.h
src/jit/importer.cpp
src/jit/inline.cpp
src/jit/inline.def
src/jit/inline.h
src/jit/inlinepolicy.cpp
src/jit/inlinepolicy.h
src/jit/jit.h
src/jit/jitconfigvalues.h
src/jit/lclvars.cpp
src/jit/lowerarm64.cpp
src/jit/lsra.cpp
src/jit/morph.cpp
src/jit/optcse.cpp
src/jit/protojit/CMakeLists.txt
src/jit/regalloc.cpp
src/jit/scopeinfo.cpp
src/jit/simd.cpp
src/jit/standalone/CMakeLists.txt
src/jit/target.h
src/jit/utils.cpp
src/jit/utils.h
src/md/winmd/adapter.cpp
src/mscorlib/System.Private.CoreLib.csproj
src/mscorlib/facade/mscorlib.csproj
src/mscorlib/facade/project.json [new file with mode: 0644]
src/mscorlib/model.CoreLib.xml
src/mscorlib/model.xml
src/mscorlib/mscorlib.csproj
src/mscorlib/ref/mscorlib.cs
src/mscorlib/ref/mscorlib.csproj
src/mscorlib/src/System/Collections/Generic/Comparer.cs
src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs
src/mscorlib/src/System/Diagnostics/Eventing/EventSource.cs
src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs
src/mscorlib/src/System/String.cs
src/mscorlib/src/System/Threading/Tasks/Task.cs
src/mscorlib/src/System/Threading/Tasks/future.cs
src/mscorlib/src/mscorlib.Friends.cs
src/pal/inc/pal.h
src/pal/inc/unixasmmacrosamd64.inc
src/pal/prebuilt/inc/fxverstrings.h
src/pal/src/CMakeLists.txt
src/pal/src/arch/arm/exceptionhelper.S
src/pal/src/config.h.in
src/pal/src/configure.cmake
src/pal/src/cruntime/math.cpp [moved from src/pal/src/cruntime/finite.cpp with 70% similarity]
src/pal/src/exception/machexception.cpp
src/pal/src/exception/machexception.h
src/pal/src/exception/seh-unwind.cpp
src/pal/src/include/pal/palinternal.h
src/pal/src/include/pal/sharedmemory.h
src/pal/src/include/pal/sharedmemory.inl
src/pal/src/init/pal.cpp
src/pal/src/sharedmemory/sharedmemory.cpp
src/pal/src/synchobj/mutex.cpp
src/pal/src/thread/context.cpp
src/pal/src/thread/process.cpp
src/pal/tests/palsuite/DisabledTests.txt
src/pal/tests/palsuite/c_runtime/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/_finite/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/_finite/test1/test1.c
src/pal/tests/palsuite/c_runtime/_finite/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/_isnan/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/_isnan/test1/test1.c
src/pal/tests/palsuite/c_runtime/acos/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/acos/test1/test1.c
src/pal/tests/palsuite/c_runtime/acos/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/asin/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/asin/test1/test1.c
src/pal/tests/palsuite/c_runtime/asin/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/atan/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/atan/test1/test1.c
src/pal/tests/palsuite/c_runtime/atan/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/atan2/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/atan2/test1/test1.c
src/pal/tests/palsuite/c_runtime/ceil/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/ceil/test1/test1.c
src/pal/tests/palsuite/c_runtime/cos/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/cos/test1/test1.c
src/pal/tests/palsuite/c_runtime/cos/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/cosh/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/cosh/test1/test1.c
src/pal/tests/palsuite/c_runtime/cosh/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/exp/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/exp/test1/test1.c
src/pal/tests/palsuite/c_runtime/exp/test2/test2.c [deleted file]
src/pal/tests/palsuite/c_runtime/exp/test3/test3.c [deleted file]
src/pal/tests/palsuite/c_runtime/fabs/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/fabs/test1/test1.c
src/pal/tests/palsuite/c_runtime/fabs/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/fabsf/CMakeLists.txt [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/fabsf/test1/CMakeLists.txt [moved from src/pal/tests/palsuite/c_runtime/exp/test2/CMakeLists.txt with 50% similarity]
src/pal/tests/palsuite/c_runtime/fabsf/test1/test1.c [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/fabsf/test1/testinfo.dat [moved from src/pal/tests/palsuite/c_runtime/exp/test2/testinfo.dat with 59% similarity]
src/pal/tests/palsuite/c_runtime/floor/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/floor/test1/test1.c
src/pal/tests/palsuite/c_runtime/floor/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/fmod/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/fmod/test1/test1.c
src/pal/tests/palsuite/c_runtime/fmod/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/fmodf/CMakeLists.txt [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/fmodf/test1/CMakeLists.txt [moved from src/pal/tests/palsuite/c_runtime/pow/test2/CMakeLists.txt with 50% similarity]
src/pal/tests/palsuite/c_runtime/fmodf/test1/test1.c [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/fmodf/test1/testinfo.dat [moved from src/pal/tests/palsuite/c_runtime/pow/test3/testinfo.dat with 55% similarity]
src/pal/tests/palsuite/c_runtime/log/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/log/test1/test1.c
src/pal/tests/palsuite/c_runtime/log/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/log10/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/log10/test1/test1.c
src/pal/tests/palsuite/c_runtime/modf/test1/test1.c
src/pal/tests/palsuite/c_runtime/modff/CMakeLists.txt [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/modff/test1/CMakeLists.txt [moved from src/pal/tests/palsuite/c_runtime/exp/test3/CMakeLists.txt with 50% similarity]
src/pal/tests/palsuite/c_runtime/modff/test1/test1.c [new file with mode: 0644]
src/pal/tests/palsuite/c_runtime/modff/test1/testinfo.dat [moved from src/pal/tests/palsuite/c_runtime/exp/test3/testinfo.dat with 55% similarity]
src/pal/tests/palsuite/c_runtime/pow/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/pow/test1/test1.c
src/pal/tests/palsuite/c_runtime/pow/test2/test2.c [deleted file]
src/pal/tests/palsuite/c_runtime/pow/test2/testinfo.dat [deleted file]
src/pal/tests/palsuite/c_runtime/pow/test3/CMakeLists.txt [deleted file]
src/pal/tests/palsuite/c_runtime/pow/test3/test3.c [deleted file]
src/pal/tests/palsuite/c_runtime/sin/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/sin/test1/test1.c
src/pal/tests/palsuite/c_runtime/sin/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/sinh/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/sinh/test1/test1.c
src/pal/tests/palsuite/c_runtime/sinh/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/sqrt/test1/test1.c
src/pal/tests/palsuite/c_runtime/tan/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/tan/test1/test1.c
src/pal/tests/palsuite/c_runtime/tan/test1/testinfo.dat
src/pal/tests/palsuite/c_runtime/tanh/CMakeLists.txt
src/pal/tests/palsuite/c_runtime/tanh/test1/test1.c
src/pal/tests/palsuite/c_runtime/tanh/test1/testinfo.dat
src/pal/tests/palsuite/paltestlist.txt
src/pal/tests/palsuite/palverify.dat
src/pal/tests/palsuite/threading/NamedMutex/test1/namedmutex.cpp
src/palrt/guid.cpp
src/publish.proj
src/utilcode/clrhost_nodependencies.cpp
src/vm/amd64/JitHelpers_Fast.asm
src/vm/amd64/JitHelpers_InlineGetThread.asm
src/vm/amd64/JitHelpers_Slow.asm
src/vm/appdomain.cpp
src/vm/arm/asmhelpers.S
src/vm/arm64/crthelpers.asm
src/vm/array.cpp
src/vm/comdelegate.cpp
src/vm/compile.cpp
src/vm/compile.h
src/vm/debugdebugger.cpp
src/vm/ecalllist.h
src/vm/exceptionhandling.cpp
src/vm/gccover.cpp
src/vm/genericdict.cpp
src/vm/i386/jitinterfacex86.cpp
src/vm/jitinterface.cpp
src/vm/mscorlib.cpp
src/vm/mscorlib.h
src/vm/prestub.cpp
src/vm/readytoruninfo.cpp
src/vm/versionresilienthashcode.cpp
src/vm/versionresilienthashcode.h
src/zap/zapinfo.cpp
tests/arm64/Tests.lst
tests/buildtest.cmd
tests/runtest.cmd
tests/runtest.sh
tests/setup-runtime-dependencies.cmd
tests/setup-runtime-dependencies.sh
tests/src/CLRTest.Execute.Bash.targets
tests/src/CLRTest.Execute.Batch.targets
tests/src/Common/Coreclr.TestWrapper/CoreclrTestWrapperLib.cs
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceCtor1_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceCtor2_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceCtor2b_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceIsAlive_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceIsAliveb_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceTargetb_PSC.csproj
tests/src/CoreMangLib/cti/system/weakreference/WeakReferenceTrackResurrection_cti_PSC.csproj
tests/src/GC/Features/BackgroundGC/concurrentspin2.csproj
tests/src/GC/Features/BackgroundGC/foregroundgc.csproj
tests/src/GC/Features/Finalizer/finalizeio/finalizeio.csproj
tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.csproj
tests/src/GC/Features/Finalizer/finalizeother/finalizedest.csproj
tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.csproj
tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.csproj
tests/src/GC/Features/Finalizer/finalizeother/finalizenested.csproj
tests/src/GC/Features/HeapExpansion/Finalizer.csproj
tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj
tests/src/GC/Features/HeapExpansion/bestfit-finalize.csproj
tests/src/GC/Features/HeapExpansion/bestfit-threaded.csproj
tests/src/GC/Features/HeapExpansion/expandheap.csproj
tests/src/GC/Features/HeapExpansion/plug.csproj
tests/src/GC/Features/HeapExpansion/pluggaps.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.csproj
tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.csproj
tests/src/GC/Features/LOHCompaction/lohcompact_stress.csproj
tests/src/GC/Features/LOHCompaction/lohcompactapi.csproj
tests/src/GC/Features/LOHCompaction/lohcompactapi2.csproj
tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.csproj
tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.csproj
tests/src/GC/Features/LOHCompaction/lohpin.csproj
tests/src/GC/Features/LOHFragmentation/lohfragmentation.csproj
tests/src/GC/Features/PartialCompaction/eco1.csproj
tests/src/GC/Features/PartialCompaction/partialcompactiontest.csproj
tests/src/GC/Features/PartialCompaction/partialcompactionwloh.csproj
tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj
tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj
tests/src/GC/Features/SustainedLowLatency/scenario.csproj
tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.csproj
tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.csproj
tests/src/GC/LargeMemory/API/gc/collect.csproj
tests/src/GC/LargeMemory/API/gc/getgeneration.csproj
tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj
tests/src/GC/LargeMemory/API/gc/keepalive.csproj
tests/src/GC/LargeMemory/API/gc/largeobject.csproj
tests/src/GC/LargeMemory/API/gc/memcheck.csproj
tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj
tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj
tests/src/GC/LargeMemory/Allocation/finalizertest.csproj
tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj
tests/src/GC/LargeMemory/Allocation/largeobject.csproj
tests/src/GC/LargeMemory/Allocation/memcheck.csproj
tests/src/GC/LargeMemory/Regressions/largearraytest.csproj
tests/src/GC/LargeMemory/Regressions/pressureoverflow.csproj
tests/src/GC/Regressions/dev10bugs/536168/536168.csproj
tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj
tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj
tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj
tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj
tests/src/GC/Regressions/v2.0-beta2/445488/445488.csproj
tests/src/GC/Regressions/v2.0-beta2/460373/460373.csproj
tests/src/GC/Regressions/v2.0-beta2/462651/462651.csproj
tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj
tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj
tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj
tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj
tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj
tests/src/GC/Scenarios/Affinity/affinitizer.csproj
tests/src/GC/Scenarios/BaseFinal/basefinal.csproj
tests/src/GC/Scenarios/BinTree/bintree.csproj
tests/src/GC/Scenarios/BinTree/thdtree.csproj
tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.csproj
tests/src/GC/Scenarios/BinTree/thdtreelivingobj.csproj
tests/src/GC/Scenarios/Boxing/arrcpy.csproj
tests/src/GC/Scenarios/Boxing/doubLink.csproj
tests/src/GC/Scenarios/Boxing/gcvariant.csproj
tests/src/GC/Scenarios/Boxing/gcvariant2.csproj
tests/src/GC/Scenarios/Boxing/gcvariant3.csproj
tests/src/GC/Scenarios/Boxing/gcvariant4.csproj
tests/src/GC/Scenarios/Boxing/simpvariant.csproj
tests/src/GC/Scenarios/Boxing/vararystress.csproj
tests/src/GC/Scenarios/Boxing/variantint.csproj
tests/src/GC/Scenarios/Boxing/variantlinklist.csproj
tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj
tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj
tests/src/GC/Scenarios/DoublinkList/dlbigleak.csproj
tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.csproj
tests/src/GC/Scenarios/DoublinkList/dlbigleakthd_v2.csproj
tests/src/GC/Scenarios/DoublinkList/dlcollect.csproj
tests/src/GC/Scenarios/DoublinkList/doublinkgen.csproj
tests/src/GC/Scenarios/DoublinkList/doublinknoleak.csproj
tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.csproj
tests/src/GC/Scenarios/DoublinkList/doublinkstay.csproj
tests/src/GC/Scenarios/FinalNStruct/finalnstruct.csproj
tests/src/GC/Scenarios/FinalNStruct/nstructresur.csproj
tests/src/GC/Scenarios/FinalNStruct/nstructtun.csproj
tests/src/GC/Scenarios/FinalNStruct/strmap.csproj
tests/src/GC/Scenarios/FragMan/fragman.csproj
tests/src/GC/Scenarios/GCBase1/gc_base1.csproj
tests/src/GC/Scenarios/GCBase1/gc_base1_1.csproj
tests/src/GC/Scenarios/GCBench/gcbench.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_10.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_100.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_101.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_102.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_103.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_104.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_105.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_106.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_107.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_108.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_109.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_11.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_110.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_111.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_112.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_113.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_114.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_115.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_116.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_117.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_118.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_119.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_12.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_120.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_121.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_122.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_123.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_124.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_125.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_126.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_127.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_128.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_129.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_13.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_130.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_131.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_132.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_133.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_134.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_135.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_136.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_137.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_138.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_139.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_14.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_140.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_141.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_142.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_143.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_144.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_145.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_146.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_147.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_148.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_149.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_15.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_150.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_151.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_152.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_153.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_154.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_155.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_156.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_157.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_158.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_159.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_16.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_160.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_161.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_162.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_163.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_164.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_165.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_166.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_167.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_168.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_169.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_17.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_170.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_171.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_172.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_173.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_174.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_175.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_176.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_177.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_178.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_179.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_18.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_180.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_181.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_182.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_183.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_184.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_185.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_186.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_187.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_188.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_189.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_19.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_190.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_191.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_192.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_193.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_194.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_195.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_196.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_197.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_198.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_199.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_2.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_20.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_200.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_201.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_202.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_203.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_204.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_205.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_206.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_207.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_208.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_209.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_21.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_210.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_211.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_212.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_213.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_214.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_215.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_216.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_217.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_218.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_219.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_22.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_220.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_221.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_222.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_223.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_224.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_225.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_226.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_227.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_228.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_229.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_23.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_230.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_231.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_232.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_233.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_234.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_235.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_236.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_237.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_238.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_239.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_24.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_240.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_241.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_242.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_243.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_244.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_245.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_246.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_247.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_248.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_249.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_25.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_250.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_251.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_252.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_253.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_254.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_255.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_256.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_257.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_258.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_259.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_26.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_260.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_261.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_262.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_263.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_264.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_265.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_266.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_267.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_268.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_269.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_27.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_270.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_271.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_272.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_273.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_274.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_275.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_276.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_277.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_278.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_279.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_28.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_280.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_281.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_282.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_283.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_284.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_285.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_286.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_287.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_288.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_289.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_29.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_290.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_291.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_292.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_293.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_294.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_295.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_296.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_297.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_298.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_299.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_3.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_30.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_300.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_301.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_302.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_303.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_304.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_305.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_306.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_307.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_308.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_309.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_31.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_310.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_311.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_312.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_313.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_314.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_315.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_316.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_317.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_318.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_319.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_32.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_320.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_321.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_322.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_323.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_324.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_325.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_326.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_327.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_328.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_329.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_33.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_330.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_331.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_332.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_333.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_334.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_335.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_336.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_337.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_338.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_339.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_34.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_340.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_341.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_342.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_343.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_344.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_345.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_346.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_347.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_348.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_349.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_35.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_350.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_351.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_352.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_353.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_354.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_355.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_356.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_357.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_358.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_359.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_36.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_360.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_361.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_362.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_363.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_364.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_365.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_366.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_367.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_368.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_369.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_37.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_370.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_371.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_372.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_373.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_374.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_375.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_376.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_377.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_378.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_379.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_38.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_380.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_381.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_382.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_383.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_384.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_385.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_386.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_387.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_388.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_389.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_39.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_390.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_391.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_392.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_393.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_394.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_395.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_396.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_397.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_398.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_399.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_4.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_40.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_400.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_401.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_402.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_403.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_404.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_405.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_406.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_407.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_408.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_409.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_41.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_410.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_411.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_412.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_413.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_414.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_415.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_416.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_417.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_418.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_419.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_42.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_420.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_421.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_422.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_423.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_424.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_425.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_426.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_427.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_428.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_429.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_43.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_430.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_431.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_432.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_44.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_45.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_46.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_47.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_48.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_49.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_5.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_50.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_51.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_52.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_53.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_54.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_55.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_56.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_57.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_58.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_59.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_6.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_60.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_61.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_62.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_63.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_64.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_65.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_66.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_67.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_68.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_69.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_7.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_70.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_71.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_72.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_73.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_74.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_75.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_76.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_77.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_78.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_79.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_8.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_80.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_81.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_82.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_83.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_84.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_85.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_86.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_87.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_88.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_89.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_9.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_90.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_91.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_92.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_93.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_94.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_95.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_96.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_97.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_98.csproj
tests/src/GC/Scenarios/GCSimulator/GCSimulator_99.csproj
tests/src/GC/Scenarios/GCStress/gcstress.csproj
tests/src/GC/Scenarios/LeakGen/leakgen.csproj
tests/src/GC/Scenarios/LeakWheel/leakwheel.csproj
tests/src/GC/Scenarios/NDPin/ndpin.csproj
tests/src/GC/Scenarios/NDPin/ndpinfinal.csproj
tests/src/GC/Scenarios/RanCollect/rancollect.csproj
tests/src/GC/Scenarios/ReflectObj/reflectobj.csproj
tests/src/GC/Scenarios/Resurrection/continue.csproj
tests/src/GC/Scenarios/Rootmem/rootmem.csproj
tests/src/GC/Scenarios/Samples/gc.csproj
tests/src/GC/Scenarios/SingLinkList/singlinkgen.csproj
tests/src/GC/Scenarios/SingLinkList/singlinkstay.csproj
tests/src/GC/Scenarios/StringCreator/stringcreator.csproj
tests/src/GC/Scenarios/THDChaos/thdchaos.csproj
tests/src/GC/Scenarios/THDList/thdlist.csproj
tests/src/GC/Scenarios/WeakReference/weakreffinal.csproj
tests/src/GC/Scenarios/muldimjagary/muldimjagary.csproj
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AbsDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AcosDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AsinDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Atan2Double.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AtanDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CeilingDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CosDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CoshDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/ExpDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/FloorDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Log10Double.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/LogDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/PowDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/RoundDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinhDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SqrtDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanhDouble.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.csproj [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/MathTests.cs [new file with mode: 0644]
tests/src/JIT/Performance/CodeQuality/Math/Functions/Single/AbsSingle.cs [new file with mode: 0644]
tests/src/JIT/Performance/RunBenchmarks/benchmarks.xml
tests/src/JIT/Performance/RunBenchmarks/coreclr_benchmarks.xml
tests/src/JIT/Regression/CLR-x86-JIT/V1.2-Beta1/b103058/b103058.csproj
tests/src/JIT/Regression/CLR-x86-JIT/V1.2-M01/b05623/b05623.il [deleted file]
tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.il [new file with mode: 0644]
tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.ilproj [new file with mode: 0644]
tests/src/JIT/Regression/JitBlue/GitHub_5164/app.config [moved from tests/src/JIT/Regression/CLR-x86-JIT/V1.2-M01/b05623/app.config with 100% similarity]
tests/src/JIT/Regression/VS-ia64-JIT/M00/b98431/ConsoleApplication2.il
tests/src/JIT/Regression/VS-ia64-JIT/M00/b99403/cbyte7a.il
tests/src/JIT/SIMD/Ctors.cs
tests/src/JIT/SIMD/Ctors_r.csproj
tests/src/JIT/SIMD/Ctors_ro.csproj
tests/src/JIT/SIMD/VectorAbs.cs
tests/src/JIT/SIMD/VectorAdd.cs
tests/src/JIT/SIMD/VectorArray.cs
tests/src/JIT/SIMD/VectorArrayInit.cs
tests/src/JIT/SIMD/VectorCopyToArray.cs
tests/src/JIT/SIMD/VectorDiv.cs
tests/src/JIT/SIMD/VectorDot.cs
tests/src/JIT/SIMD/VectorGet.cs
tests/src/JIT/SIMD/VectorInitN.cs
tests/src/JIT/SIMD/VectorMax.cs
tests/src/JIT/SIMD/VectorMin.cs
tests/src/JIT/SIMD/VectorMul.cs
tests/src/JIT/SIMD/VectorRelOp.cs
tests/src/JIT/SIMD/VectorUtil.cs
tests/src/JIT/SIMD/dir.props [new file with mode: 0644]
tests/src/JIT/SIMD/project.json
tests/src/JIT/config/extra/project.json
tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.cs [new file with mode: 0644]
tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.csproj [new file with mode: 0644]
tests/src/JIT/opt/perf/doublealign/Locals.csproj
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep.il [new file with mode: 0644]
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep.ilproj [moved from tests/src/Loader/classloader/rmv/il/RMV-4-1-6d-two.ilproj with 78% similarity]
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep2.cs [new file with mode: 0644]
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep2.csproj [moved from tests/src/Loader/classloader/rmv/il/RMV-4-1-6b.ilproj with 81% similarity]
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep3.cs [new file with mode: 0644]
tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep3.csproj [moved from tests/src/Loader/classloader/rmv/il/RMV-4-CA.ilproj with 89% similarity]
tests/src/Loader/classloader/TypeForwarding/UnitTest/UnitTest.il [new file with mode: 0644]
tests/src/Loader/classloader/TypeForwarding/UnitTest/UnitTest.ilproj [moved from tests/src/Loader/classloader/rmv/il/RMV-4-1-6a.ilproj with 82% similarity]
tests/src/Loader/classloader/TypeForwarding/UnitTest/app.config [new file with mode: 0644]
tests/src/Loader/classloader/TypeForwarding/UnitTest/project.json [new file with mode: 0644]
tests/src/Loader/classloader/generics/Variance/Regressions/dev10_468712/dev10_468712.il
tests/src/Loader/classloader/regressions/163172/MethodImplFinal.il
tests/src/Loader/classloader/rmv/il/RMV-4-1-6a.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6b.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6d-two.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-2-4.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-2-4.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-4.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-4.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-7.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-7.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-8.il [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-3-8.ilproj [deleted file]
tests/src/Loader/classloader/rmv/il/RMV-4-CA.il [deleted file]
tests/src/readytorun/generics.cs
tests/src/readytorun/generics.csproj
tests/src/readytorun/genericsload/app.config [new file with mode: 0644]
tests/src/readytorun/genericsload/callgenericctor.cs [new file with mode: 0644]
tests/src/readytorun/genericsload/callgenericctor.csproj [new file with mode: 0644]
tests/src/readytorun/genericsload/genericslib.il [new file with mode: 0644]
tests/src/readytorun/genericsload/genericslib.ilproj [moved from tests/src/JIT/Regression/CLR-x86-JIT/V1.2-M01/b05623/b05623.ilproj with 93% similarity]
tests/src/readytorun/genericsload/project.json [new file with mode: 0644]
tests/src/readytorun/genericsload/usegenericfield.cs [new file with mode: 0644]
tests/src/readytorun/genericsload/usegenericfield.csproj [new file with mode: 0644]
tests/src/readytorun/main.cs
tests/src/readytorun/mainv1.csproj
tests/src/readytorun/mainv2.csproj
tests/src/readytorun/project.json
tests/src/readytorun/test.cs
tests/testsUnsupportedOutsideWindows.txt
tests/x86_jit32_issues.targets

index 2f83d6d..b0cf27d 100644 (file)
@@ -1 +1 @@
-1.0.25-prerelease-00419-02
+1.0.25-prerelease-00429-01
index 9c326ef..67e79d3 100644 (file)
@@ -8,19 +8,12 @@ Intro to .NET Core
 
 .NET Core is a self-contained .NET runtime and framework that implements [ECMA 335](project-docs/dotnet-standards.md). It can be (and has been) ported to multiple architectures and platforms. It supports a variety of installation options, having no specific deployment requirements itself.
 
-Learn about .NET Core
-====================
+Getting Started
+===============
 
+- [Installing the .NET Core SDK](https://www.microsoft.com/net/core)
 - [[WIP] Official .NET Core Docs](http://dotnet.github.io/docs/)
 
-Get .NET Core
-=============
-
-- [Get .NET Core DNX SDK on Windows](install/get-dotnetcore-dnx-windows.md)
-- [Get .NET Core DNX SDK on OS X](install/get-dotnetcore-dnx-osx.md)
-- [Get .NET Core DNX SDK on Linux](install/get-dotnetcore-dnx-linux.md)
-- [Get .NET Core (Raw) on Windows](install/get-dotnetcore-windows.md)
-
 Project Docs
 ============
 
index a084879..ee84a9a 100644 (file)
@@ -488,63 +488,27 @@ Debug info consists primarily of two types of information in the JIT:
 
 Exception handling information is captured in an `EHblkDsc` for each exception handling region. Each region includes the first and last blocks of the try and handler regions, exception type, enclosing region, among other things. Look at [jiteh.h](https://github.com/dotnet/coreclr/blob/master/src/jit/jiteh.h) and [jiteh.cpp](https://github.com/dotnet/coreclr/blob/master/src/jit/jiteh.cpp), especially, for details. Look at `Compiler::fgVerifyHandlerTab()` to see how the exception table constraints are verified.
 
-# Dumps and Other Tools
-
-The behavior of the JIT can be controlled via a number of configuration variables. These are declared in [inc/clrconfigvalues.h](https://github.com/dotnet/coreclr/blob/master/src/inc/clrconfigvalues.h). When used as an environment variable, the string name generally has “COMPlus_” prepended. When used as a registry value name, the configuration name is used directly.
-
-## Setting configuration variables
-
-These can be set in one of three ways:
-
-* Setting the environment variable `COMPlus_<flagname>`. For example, the following will set the `JitDump` flag so that the compilation of all methods named ‘Main’ will be dumped:
-
-    set COMPlus_JitDump=Main
-
-* Setting the registry key `HKCU\Software\Microsoft\.NETFramework`, Value `<flagName>`, type `REG_SZ` or `REG_DWORD` (depending on the flag).
-* Setting the registry key `HKLM\Software\Microsoft\.NETFramework`, Value `<flagName>`, type `REG_SZ` or `REG_DWORD` (depending on the flag).
-
-## Specifying method names
-
-The complete syntax for specifying a single method name (for a flag that takes a method name, such as `COMPlus_JitDump`) is:
-
-               [[<Namespace>.]<ClassName>::]<MethodName>[([<types>)]
-
-For example
-
-               System.Object::ToString(System.Object)
-
-The namespace, class name, and argument types are optional, and if they are not present, default to a wildcard. Thus stating:
-
-               Main
-
-will match all methods named Main from any class and any number of arguments.
-
-<types> is a comma separated list of type names. Note that presently only the number of arguments and not the types themselves are used to distinguish methods. Thus, Main(Foo, Bar), and Main(int, int) will both match any main method with two arguments.
-
-The wildcard character ‘*’ can be used for <ClassName> and <MethodName>. In particular * by itself indicates every method.
+# Reading a JitDump
 
-## Useful COMPlus variables
+One of the best ways of learning about the JIT compiler is examining a compilation dump in detail. The dump shows you all the really important details of the basic data structures without all the implementation detail of the code. Debugging a JIT bug almost always begins with a JitDump. Only after the problem is isolated by the dump does it make sense to start debugging the JIT code itself.
 
-Below are some of the most useful `COMPlus` variables. Where {method-list} is specified in the list below, you can supply a space-separated list of either fully-qualified or simple method names (the former is useful when running something that has many methods of the same name), or you can specific ‘*’ to mean all methods.
+Dumps are also useful because they give you good places to place breakpoints. If you want to see what is happening at some point in the dump, simply search for the dump text in the source code. This gives you a great place to put a conditional breakpoint.
 
-* `COMPlus_JitDump`={method-list} – dump lots of useful information about what the JIT is doing (see below).
-* `COMPlus_JitDisasm`={method-list} – dump a disassembly listing of each method.
-* `COMPlus_JitDiffableDasm` – set to 1 to tell the JIT to avoid printing things like pointer values that can change from one invocation to the next, so that the disassembly can be more easily compared.
-* `COMPlus_JitGCDump`={method-list} – dump the GC information.
-* `COMPlus_JitUnwindDump`={method-list} – dump the unwind tables.
-* `COMPlus_JitEHDump`={method-list} – dump the exception handling tables.
-* `COMPlus_JitTimeLogFile`={file name} – this specifies a log file to which timing information is written.
-* `COMPlus_JitTimeLogCsv`={file name} – this specifies a log file to which summary timing information can be written, in CSV form.
+There is not a strong convention about what or how the information is dumped, but generally you can find phase-specific information by searching for the phase name. Some useful points follow.
 
-See also: [CLR Configuration Knobs](../project-docs/clr-configuration-knobs.md)
+## How to create a JitDump
 
-# Reading a JitDump
+You can enable dumps by setting the `COMPlus_JitDump` environment variable to a space-separated list of the method(s) you want to dump. For example:
 
-One of the best ways of learning about the JIT compiler is examining a compilation dump in detail. The dump shows you all the really important details of the basic data structures without all the implementation detail of the code. Debugging a JIT bug almost always begins with a JitDump. Only after the problem is isolated by the dump does it make sense to start debugging the JIT code itself.
+```cmd
+:: Print out lots of useful info when
+:: compiling methods named Main/GetEnumerator
+set "COMPlus_JitDump=Main GetEnumerator"
+```
 
-Dumps are also useful because they give you good places to place breakpoints. If you want to see what is happening at some point in the dump, simply search for the dump text in the source code. This gives you a great place to put a conditional breakpoint.
+See [Setting configuration variables](../building/viewing-jit-dumps.md#setting-configuration-variables) for more details on this.
 
-There is not a strong convention about what or how the information is dumped, but generally you can find phase-specific information by searching for the phase name. Some useful points follow.
+Full instructions for dumping the compilation of some managed code can be found here: [viewing-jit-dumps.md](../building/viewing-jit-dumps.md)
 
 ## Reading expression trees
 
index 1d95e93..ece8dd8 100644 (file)
@@ -108,3 +108,46 @@ index 1ed3dbf..c643032 100644
        *(unw_word_t *) addr = *val;
      }
 ```
+
+How to enable -O3 optimization level for ARM/Linux
+==================================================
+
+Currently, we can build coreclr with -O1 flag of clang in release build mode for Linux/ARM. This instruction is to enable -O3 optimization level of clang on ARM/Linux by fixing the bug of llvm.
+
+First, download latest version from the clang-3.6/llvm-3.6 upstream: 
+```
+lgs@ubuntu cd /work/dotnet/
+lgs@ubuntu wget http://llvm.org/releases/3.6.2/llvm-3.6.2.src.tar.xz
+lgs@ubuntu tar xJf llvm-3.6.2.src.tar.xz
+lgs@ubuntu cd ./llvm-3.6.2.src/tools/
+lgs@ubuntu wget http://llvm.org/releases/3.6.2/cfe-3.6.2.src.tar.xz
+lgs@ubuntu tar xJf cfe-3.6.2.src.tar.xz\
+lgs@ubuntu mv cfe-3.6.2 clang
+```
+
+Second, expand the coverage of the upstream patch by:
+https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1584089
+
+Third, build clang-3.6/llvm-3.6 source as following: 
+```
+lgs@ubuntu cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="all" -DCMAKE_INSTALL_PREFIX=~/llvm-3.6.2 \
+-DLLVM_BUILD_LLVM_DYLIB=1 -DLLDB_DISABLE_LIBEDIT=1 -DLLDB_DISABLE_CURSES=1 -DLLDB_DISABLE_PYTHON=1 \
+-DLLVM_ENABLE_DOXYGEN=0 -DLLVM_ENABLE_TERMINFO=0 -DLLVM_INCLUDE_EXAMPLES=0 -DLLVM_BUILD_RUNTIME=0 \
+-DLLVM_INCLUDE_TESTS=0 -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 /work/dotnet/llvm-3.6.2.src
+lgs@ubuntu  
+lgs@ubuntu sudo ln -sf /usr/bin/ld /usr/bin/ld.gold
+lgs@ubuntu time make -j8
+lgs@ubuntu time make -j8 install 
+lgs@ubuntu
+lgs@ubuntu sudo apt-get remove clang-3.6 llvm-3.6
+lgs@ubuntu  vi ~/.bashrc (or /etc/profile)
+# Setting new clang/llvm version
+export PATH=$HOME/llvm-3.6.2/bin/:$PATH
+export LD_LIBRARY_PATH=$HOME/llvm-3.6.2/lib:$LD_LIBRARY_PATH
+```
+
+Finally, let's build coreclr with updated clang/llvm. From now on, you may change the optimization level of coreclr from -O1 to -O3 in ./src/pal/tools/clang-compiler-override.txt. If you meet a lldb related error message at build-time, try to build coreclr with "skipgenerateversion" option. 
+```
+lgs@ubuntu time ROOTFS_DIR=/work/dotnet/rootfs-coreclr/arm ./build.sh arm release clean cross 
+```
+
diff --git a/Documentation/building/viewing-jit-dumps.md b/Documentation/building/viewing-jit-dumps.md
new file mode 100644 (file)
index 0000000..5303b47
--- /dev/null
@@ -0,0 +1,173 @@
+# Viewing JIT Dumps
+
+This document is intended for people interested in seeing the disassembly, GC info, or other details the JIT generates for a managed program.
+
+To make sense of the results, it is recommended you also read the [Reading a JitDump](../botr/ryujit-overview.md#reading-a-jitdump) section of the RyuJIT Overview.
+
+## Setting up our environment
+
+The first thing we want to do is setup the .NET Core app we want to dump. Here are the steps to do this, if you don't have one ready:
+
+* Perform a debug build of the CoreCLR repo
+* Install the [.NET CLI](http://microsoft.com/net/core), which we'll use to compile/publish our app
+* `cd` to where you want your app to be placed, and run `dotnet new`
+* Modify your `project.json` file so that it contains a RID (runtime ID) corresponding to the OS you're using in the `runtimes` section. For example, I have a Windows 10 x64 machine, so here's my project file:
+
+```json
+{
+  "buildOptions": {
+    "emitEntryPoint": true
+  },
+  "dependencies": {
+    "Microsoft.NETCore.App": "1.0.0-*"
+  },
+  "frameworks": {
+    "netcoreapp1.0": {
+      "imports": [
+        "dnxcore50",
+        "portable-net45+win8"
+      ]
+    }
+  },
+  "runtimes": {
+    "win10-x64": {}
+  }
+}
+```
+
+You can find a list of RIDs and their corresponding OSes [here](http://dotnet.github.io/docs/core-concepts/rid-catalog.html).
+
+* Edit `Program.cs`, and call the method(s) you want to dump in there. Make sure they are, directly or indirectly, called from `Main`. In this example, we'll be looking at the disassembly of our custom function `InefficientJoin`:
+
+```cs
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace ConsoleApplication
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            Console.WriteLine(InefficientJoin(args));
+        }
+        
+        // Add NoInlining to prevent this from getting
+        // mixed up with the rest of the code in Main
+        [MethodImpl(MethodImplOptions.NoInlining)]
+        private static string InefficientJoin(IEnumerable<string> args)
+        {
+            var result = string.Empty;
+            foreach (var arg in args) result += (arg + ' ');
+            return result.Substring(0, result.Length - 1);
+        }
+    }
+}
+```
+
+* After you've finished editing the code, run `dotnet publish -c Release`. This should drop all of the binaries needed to run your app in `bin/Release/<configuration>/<rid>/publish`.
+* Overwrite the CLR dlls with the ones you've built locally. If you're a fan of the command line, here are some shell commands for doing this:
+
+```shell
+# Windows
+robocopy /e <coreclr path>\bin\Product\Windows_NT.<arch>.Debug <app root>\bin\Release\netcoreapp1.0\<rid>\publish > NUL
+
+# Unix
+cp -rT <coreclr path>/bin/Product/<OS>.<arch>.Debug <app root>/bin/Release/netcoreapp1.0/<rid>/publish
+```
+
+* Set the configuration knobs you need (see below) and run your published app. The info you want should be dumped to stdout.
+
+Here's some sample output on my machine showing the disassembly for `InefficientJoin`:
+
+```asm
+G_M2530_IG01:
+       55                   push     rbp
+       4883EC40             sub      rsp, 64
+       488D6C2440           lea      rbp, [rsp+40H]
+       33C0                 xor      rax, rax
+       488945F8             mov      qword ptr [rbp-08H], rax
+       488965E0             mov      qword ptr [rbp-20H], rsp
+
+G_M2530_IG02:
+       49BB60306927E5010000 mov      r11, 0x1E527693060
+       4D8B1B               mov      r11, gword ptr [r11]
+       4C895DF8             mov      gword ptr [rbp-08H], r11
+       49BB200058F7FD7F0000 mov      r11, 0x7FFDF7580020
+       3909                 cmp      dword ptr [rcx], ecx
+       41FF13               call     gword ptr [r11]System.Collections.Generic.IEnumerable`1[__Canon][System.__Canon]:GetEnumerator():ref:this
+       488945F0             mov      gword ptr [rbp-10H], rax
+
+; ...
+```
+
+## Setting configuration variables
+
+The behavior of the JIT can be controlled via a number of configuration variables. These are declared in [inc/clrconfigvalues.h](https://github.com/dotnet/coreclr/blob/master/src/inc/clrconfigvalues.h). When used as an environment variable, the string name generally has “COMPlus_” prepended. When used as a registry value name, the configuration name is used directly.
+
+These can be set in one of three ways:
+
+* Setting the environment variable `COMPlus_<flagname>`. For example, the following will set the `JitDump` flag so that the compilation of all methods named ‘Main’ will be dumped:
+
+```shell
+# Windows
+set COMPlus_JitDump=Main
+
+# Unix
+export COMPlus_JitDump=Main
+```
+
+* *Windows-only:* Setting the registry key `HKCU\Software\Microsoft\.NETFramework`, Value `<flagName>`, type `REG_SZ` or `REG_DWORD` (depending on the flag).
+* *Windows-only:* Setting the registry key `HKLM\Software\Microsoft\.NETFramework`, Value `<flagName>`, type `REG_SZ` or `REG_DWORD` (depending on the flag).
+
+## Specifying method names
+
+The complete syntax for specifying a single method name (for a flag that takes a method name, such as `COMPlus_JitDump`) is:
+
+```
+[[<Namespace>.]<ClassName>::]<MethodName>[([<types>)]
+```
+
+For example
+
+```
+System.Object::ToString(System.Object)
+```
+
+The namespace, class name, and argument types are optional, and if they are not present, default to a wildcard. Thus stating:
+
+```
+Main
+```
+
+will match all methods named Main from any class and any number of arguments.
+
+<types> is a comma separated list of type names. Note that presently only the number of arguments and not the types themselves are used to distinguish methods. Thus, `Main(Foo, Bar)` and `Main(int, int)` will both match any main method with two arguments.
+
+The wildcard character ‘*’ can be used for <ClassName> and <MethodName>. In particular * by itself indicates every method.
+
+## Useful COMPlus variables
+
+Below are some of the most useful `COMPlus` variables. Where {method-list} is specified in the list below, you can supply a space-separated list of either fully-qualified or simple method names (the former is useful when running something that has many methods of the same name), or you can specific ‘*’ to mean all methods.
+
+* `COMPlus_JitDump`={method-list} – dump lots of useful information about what the JIT is doing. See [Reading a JitDump](../botr/ryujit-overview.md#reading-a-jitdump) for more on how to analyze this data.
+* `COMPlus_JitDisasm`={method-list} – dump a disassembly listing of each method.
+* `COMPlus_JitDiffableDasm` – set to 1 to tell the JIT to avoid printing things like pointer values that can change from one invocation to the next, so that the disassembly can be more easily compared.
+* `COMPlus_JitGCDump`={method-list} – dump the GC information.
+* `COMPlus_JitUnwindDump`={method-list} – dump the unwind tables.
+* `COMPlus_JitEHDump`={method-list} – dump the exception handling tables.
+* `COMPlus_JitTimeLogFile`={file name} – this specifies a log file to which timing information is written.
+* `COMPlus_JitTimeLogCsv`={file name} – this specifies a log file to which summary timing information can be written, in CSV form.
+
+See also: [CLR Configuration Knobs](../project-docs/clr-configuration-knobs.md)
+
+## Dumping native images
+
+If you followed the tutorial above and ran the sample app, you may be wondering why the disassembly for methods like `Substring` didn't show up in the output. This is because `Substring` lives in mscorlib, which (by default) is compiled ahead-of-time to a native image via [crossgen](../building/crossgen.md). Telling crossgen to dump the info works slightly differently.
+
+* First, perform a debug build of the native parts of the repo: `build skipmscorlib skiptests`.
+  * This should produce the binaries for crossgen in `bin/Product/<OS>.<arch>.Debug`.
+* Next, set the appropriate configuration knob for the info you want to dump. Usually, this is just the same as the corresponding JIT knob, except prefixed with `Ngen`; for example, to show the disassembly listing of a particular method you would `set COMPlus_NgenDisasm=Foo`.
+* Run crossgen on the assembly you want to dump: `crossgen MyLibrary.dll`
+  * If you want to see the output of crossgen specifically for mscorlib, invoke `build skipnative skiptests` from the repo root. The dumps should be written to a file in `bin/Logs` that you can just view.
index bdde500..e53dfcc 100644 (file)
@@ -46,8 +46,10 @@ Git Setup
 
 Clone the CoreCLR and CoreFX repositories (either upstream or a fork).
 
-    C:\git>git clone https://github.com/dotnet/coreclr
-    C:\git>git clone https://github.com/dotnet/corefx
+```bat
+C:\git>git clone https://github.com/dotnet/coreclr
+C:\git>git clone https://github.com/dotnet/corefx
+```
 
 This guide assumes that you've cloned the CoreCLR and CoreFX repositories into C:\git using the default repo names. If your setup is different, you'll need to pay attention to the commands you run. The guide will always show you the current directory.
 
@@ -58,15 +60,10 @@ Demo directory
 
 In order to keep everything tidy, create a new directory for the files that you will build or acquire.
 
-       c:\git>mkdir \coreclr-demo\runtime
-       c:\git>mkdir \coreclr-demo\packages
-
-NuGet
------
-
-NuGet is required to acquire any .NET assembly dependency that is not built by these instructions.
-
-Download the [NuGet client](https://nuget.org/nuget.exe) and copy to c:\coreclr-demo. Alternatively, you can download nuget.exe, put it somewhere else, and add it to your PATH.
+```bat
+c:\git>mkdir \coreclr-demo\runtime
+c:\git>mkdir \coreclr-demo\ref
+```
 
 Build the Runtime
 =================
@@ -100,10 +97,13 @@ You will see several files. The interesting ones are:
 
 Copy these files into the demo directory.
 
-       C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\clrjit.dll \coreclr-demo\runtime
-       C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\CoreRun.exe \coreclr-demo\runtime
-       C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\coreclr.dll \coreclr-demo\runtime
-       C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\mscorlib.dll \coreclr-demo\runtime
+```bat
+C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\clrjit.dll \coreclr-demo\runtime
+C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\CoreRun.exe \coreclr-demo\runtime
+C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\coreclr.dll \coreclr-demo\runtime
+C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\mscorlib.dll \coreclr-demo\runtime
+C:\git\coreclr>copy bin\Product\Windows_NT.x64.debug\System.Private.CoreLib.dll \coreclr-demo\runtime
+```
 
 Build the Framework
 ===================
@@ -123,82 +123,62 @@ It's also possible to add /t:rebuild to build.cmd to force it to delete the prev
 
 For the purposes of this demo, you need to copy a few required assemblies to the demo folder.
 
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Console\System.Console.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Diagnostics.Debug\System.Diagnostics.Debug.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Threading\System.Threading.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.IO\System.IO.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.IO.FileSystem.Primitives\System.IO.FileSystem.Primitives.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Runtime\System.Runtime.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Runtime.Extensions\System.Runtime.Extensions.dll \coreclr-demo\runtime    C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Runtime.InteropServices\System.Runtime.InteropServices.dll \coreclr-demo\runtime
-       C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Threading.Tasks\System.Threading.Tasks.dll \coreclr-demo\runtime  
-
-Restore NuGet Packages
-======================
-
-You need to restore/download the rest of the demo dependencies via NuGet, as they are not yet part of the CoreFX repo. At present, these NuGet dependencies contain facades (type forwarders) that point to mscorlib.
-
-Make a packages/packages.config file with the following XML. These packages are the required dependencies of this particular app. Different apps will have different dependencies and require different packages.config - see [Issue #480](https://github.com/dotnet/coreclr/issues/480).
-
-```
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="System.Console" version="4.0.0-beta-23516" />
-  <package id="System.Diagnostics.Contracts" version="4.0.1-beta-23516" />
-  <package id="System.Diagnostics.Debug" version="4.0.11-beta-23516" />
-  <package id="System.Diagnostics.Tools" version="4.0.1-beta-23516" />
-  <package id="System.Globalization" version="4.0.11-beta-23516" />
-  <package id="System.IO" version="4.0.11-beta-23516" />
-  <package id="System.IO.FileSystem.Primitives" version="4.0.1-beta-23516" />
-  <package id="System.Runtime" version="4.0.21-beta-23516" />
-  <package id="System.Runtime.Extensions" version="4.0.11-beta-23516" />
-  <package id="System.Runtime.Handles" version="4.0.1-beta-23516" />
-  <package id="System.Runtime.InteropServices" version="4.0.21-beta-23516" />
-  <package id="System.Text.Encoding" version="4.0.11-beta-23516" />
-  <package id="System.Text.Encoding.Extensions" version="4.0.11-beta-23516" />
-  <package id="System.Threading" version="4.0.11-beta-23516" />
-  <package id="System.Threading.Tasks" version="4.0.11-beta-23516" />
-</packages>
+```bat
+C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Console\System.Console.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\Windows_NT.AnyCPU.Debug\System.Diagnostics.Debug\System.Diagnostics.Debug.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.IO\System.IO.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.IO.FileSystem.Primitives\System.IO.FileSystem.Primitives.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Runtime\System.Runtime.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Runtime.InteropServices\System.Runtime.InteropServices.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Text.Encoding\System.Text.Encoding.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Text.Encoding.Extensions\System.Text.Encoding.Extensions.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Threading\System.Threading.dll \coreclr-demo\runtime
+C:\git\corefx>copy bin\AnyOS.AnyCPU.Debug\System.Threading.Tasks\System.Threading.Tasks.dll \coreclr-demo\runtime
 ```
 
-And restore the packages with the packages.config:
+You also need to copy reference assemblies, which will be used during compilation.
 
-       C:\coreclr-demo>nuget restore packages\packages.config -Source https://api.nuget.org/v3/index.json -PackagesDirectory packages
+```bat
+C:\git\corefx>copy bin\ref\System.Runtime\4.0.0.0\System.Runtime.dll \coreclr-demo\ref
+C:\git\corefx>copy bin\ref\System.Console\4.0.0.0\System.Console.dll \coreclr-demo\ref
+```
 
 Compile the Demo
 ================
 
 Now you need a Hello World application to run. You can write your own, if you'd like. Here's a very simple one:
 
-       using System;
-
-       public class Program
-       {
-           public static void Main (string[] args)
-           {
-               Console.WriteLine("Hello, Windows");
-               Console.WriteLine("Love from CoreCLR.");
-           }   
-       } 
+```C#
+using System;
+
+public class Program
+{
+    public static void Main()
+    {
+        Console.WriteLine("Hello, Windows");
+        Console.WriteLine("Love from CoreCLR.");
+    }
+}
+```
 
 Personally, I'm partial to the one on corefxlab which will print a picture for you. Download the [corefxlab demo](https://raw.githubusercontent.com/dotnet/corefxlab/master/demos/CoreClrConsoleApplications/HelloWorld/HelloWorld.cs) to `\coreclr-demo`.
 
-Then you just need to build it, with csc, the .NET Framework C# compiler. It may be easier to do this step within the "Developer Command Prompt for VS2013", if csc is not in your path. Because you need to compile the app against the .NET Core surface area, you need to pass references to the contract assemblies you restored using NuGet:
+Then you just need to build it, with csc, the .NET Framework C# compiler. It may be easier to do this step within the "Developer Command Prompt for VS2015", if csc is not in your path. Because you need to compile the app against the .NET Core surface area, you need to pass references to the contract assemblies you restored using NuGet:
 
-```
-csc /nostdlib /noconfig /r:packages\System.Runtime.4.0.21-beta-23516\ref\dotnet5.1\System.Runtime.dll /r:packages\System.Console.4.0.0-beta-23516\ref\dotnet5.1\System.Console.dll /out:runtime\hello.exe hello.cs
+```bat
+csc /nostdlib /noconfig /r:ref\System.Runtime.dll /r:ref\System.Console.dll /out:runtime\hello.exe hello.cs
 ```
 
 Run the demo
 ============
 
-You'll also need the following facade assemblies from your packages folder:
-
-    C:\coreclr-demo>copy packages\System.Text.Encoding.4.0.11-beta-23516\lib\netcore50\System.Text.Encoding.dll runtime
-    C:\coreclr-demo>copy packages\System.Text.Encoding.Extensions.4.0.11-beta-23516\lib\netcore50\System.Text.Encoding.Extensions.dll runtime
-
 You're ready to run Hello World! To do that, run corerun, passing the path to the managed exe, plus any arguments. In this case, no arguments are necessary.
 
-       C:\coreclr-demo>cd runtime
-       C:\coreclr-demo\runtime>CoreRun.exe HelloWorld.exe
+```bat
+C:\coreclr-demo>cd runtime
+C:\coreclr-demo\runtime>CoreRun.exe hello.exe
+```
+
+If `CoreRun.exe` fails for some reason, you will see an empty output. To diagnose the issue, you can use `/v` to switch verbose mode on: `CoreRun.exe /v hello.exe`.
 
 Over time, this process will get easier. Thanks for trying out CoreCLR. Feel free to try a more interesting demo.
index 166d07b..0e3bc26 100644 (file)
@@ -25,12 +25,6 @@ This will use crossgen.exe to precompile the test executables before they are ex
 
 The number '2' is just an example. The default value (if no priority is specified) is 0. To clarify, if '2' is specified, all tests with CLRTestPriorty 0, 1 AND 2 will be built and consequently run.
 
-*Specify GCStress Level*
-
-    C:\git\coreclr>tests\buildtest.cmd gcstresslevel 2
-
-GCStress is used to help with identifying GC holes in the implementation of the managed runtime or GC life-time reporting done by the JIT. Valid values are the values supported by GCStressFlags enum in src/vm/eeconfig.h.
-
 **Example**
 
 To run a clean, priority 1, crossgen test pass:
diff --git a/Documentation/install/get-dotnetcore-dnx-linux.md b/Documentation/install/get-dotnetcore-dnx-linux.md
deleted file mode 100644 (file)
index a26f8a9..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-Get the .NET Core DNX SDK on Linux
-==================================
-
-These instructions will lead you through acquiring the .NET Core DNX SDK via the [.NET Version Manager (DNVM)](https://github.com/aspnet/dnvm)  and running a "Hello World" demo on Linux. The instructions use a particular set of paths. You'll need to adjust if you want to use a different set.
-
-These instructions are for .NET Core console apps. If you want to try out ASP.NET 5 on top of .NET Core - which is a great idea - check out the [ASP.NET 5 instructions](https://github.com/aspnet/home).
-
-.NET Core NuGet packages and the .NET Core DNX SDKs are available on the [ASP.NET 'vnext' myget feed](https://www.myget.org/F/aspnetvnext), which you can more easily view on [gallery](https://www.myget.org/gallery/aspnetvnext) for the feed.
-
-You can also [build from source](../building/linux-instructions.md). 
-
-Environment
-===========
-
-These instructions are written assuming the Ubuntu 14.04 LTS, since that's the distro the team uses. Pull Requests are welcome to address other environments as long as they don't break the ability to use Ubuntu 14.04 LTS.
-
-Packages
---------
-
-Install the `libunwind8`, `libssl-dev` and `unzip` packages:
-
-       sudo apt-get install libunwind8 libssl-dev unzip
-
-You also need a latest version of Mono, which is required for DNU. This is a temporary requirement.
-
-       sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
-       echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
-       sudo apt-get update
-       sudo apt-get install mono-complete
-
-Certificates
-------------
-
-You need to import trusted root certificates in order to restore NuGet packages. You can do that with the `mozroots` tool.
-
-       mozroots --import --sync
-
-Installing DNVM
-===============
-
-You need DNVM to acquire a (or multiple) .NET Execution Environment (DNX) SDKs. DNVM is simply a script, which doesn't depend on .NET.
-
-       curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
-
-You can see the currently installed DNX versions with `dnvm list`, which will display an empty set of installed runtimes.
-
-       dnvm list
-
-Installing the .NET Core DNX SDK
-================================
-
-You first need to acquire the Mono DNX. It doesn't include Mono, but is needed to use the DNX tools on top of Mono. In particular, the DNU command is not yet supported on .NET Core, requiring us to use Mono for this purpose (until DNU runs on .NET Core). Mono is the default DNX, do you can acquire it via `dnvm upgrade`.
-
-       dnvm upgrade -u
-
-Next, acquire the latest .NET Core DNX SDK.
-
-       dnvm install latest -r coreclr -u
-
-You can see the currently installed DNX versions with `dnvm list` (your display may vary as new versions of the DNX are published):
-
-       dnvm list
-
-```
-Active Version              Runtime Architecture OperatingSystem Alias
------- -------              ------- ------------ --------------- -----
-  *    1.0.0-beta8-15613    coreclr x64          linux           
-       1.0.0-beta8-15613    mono                 linux/osx       default
-```
-
-Write your App
-==============
-
-You need a Hello World application to run. You can write your own, if you'd like. Here's a very simple one:
-
-```csharp
-using System;
-
-public class Program
-{
-    public static void Main (string[] args)
-    {
-        Console.WriteLine("Hello, Linux");
-        Console.WriteLine("Love from CoreCLR.");
-    }
-}
-```
-
-Some people on the .NET Core team are partial to a demo console app on corefxlab repo which will print a picture for you. Download the [corefxlab demo](https://raw.githubusercontent.com/dotnet/corefxlab/master/demos/CoreClrConsoleApplications/HelloWorld/HelloWorld.cs) to the demo directory.
-
-You need a `project.json` that matches your app. Use this one. It will work for both of the apps provided/referenced above. Save the project.json beside your app.
-
-```
-{
-    "version": "1.0.0-*",
-    "dependencies": {
-    },
-    "frameworks" : {
-        "dnx451" : { },
-        "dnxcore50" : {
-            "dependencies": {
-                "System.Console": "4.0.0-beta-*"
-            }
-        }
-    }
-}
-```
-
-Run your App
-============
-
-You need to restore packages for your app, based on your project.json, with `dnu restore`. You will need to run this command under the Mono DNX. Make sure that you are using that one.
-
-       dnvm use 1.0.0-beta8-15613 -r mono
-       dnu restore
-
-You can run your app with .NET Core, although make sure to switch to that DNX.
-
-    dnvm use 1.0.0-beta8-15613 -r coreclr
-       dnx run
-
-       Hello, Linux
-       Love from CoreCLR.
diff --git a/Documentation/install/get-dotnetcore-dnx-osx.md b/Documentation/install/get-dotnetcore-dnx-osx.md
deleted file mode 100644 (file)
index ed97068..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-Get the .NET Core DNX SDK on OS X
-=================================
-
-These instructions will lead you through acquiring the .NET Core DNX SDK via the [.NET Version Manager (DNVM)](https://github.com/aspnet/dnvm)  and running a "Hello World" demo on OS X. The instructions use a particular set of paths. You'll need to adjust if you want to use a different set.
-
-These instructions are for .NET Core console apps. If you want to try out ASP.NET 5 on top of .NET Core - which is a great idea - check out the [ASP.NET 5 instructions](https://github.com/aspnet/home).
-
-.NET Core NuGet packages and the .NET Core DNX SDKs are available on the [ASP.NET 'vnext' myget feed](https://www.myget.org/F/aspnetvnext), which you can more easily view on [gallery](https://www.myget.org/gallery/aspnetvnext) for the feed.
-
-You can also [build from source](../building/osx-instructions.md). 
-
-Installing DNVM
-===============
-
-You need DNVM to acquire a (or multiple) .NET Execution Environment (DNX). DNVM is simply a script, which doesn't depend on .NET. On OS X the best way to get DNVM is to use [Homebrew](http://www.brew.sh). If you don't have Homebrew installed then follow the [Homebrew installation instructions](http://www.brew.sh). Once you have Homebrew then run the following commands:
-
-       brew tap aspnet/dnx
-       brew update
-       brew install dnvm
-
-You will likely need to register the dnvm command:
-
-       source dnvm.sh
-
-Installing the .NET Core DNX SDK
-================================
-
-You first need to acquire the Mono DNX. It includes a specfic version of Mono, and is needed to use the DNX tools that are not yet supported on .NET Core. Mono is the default DNX, so you can acquire it via `dnvm upgrade`.
-
-       dnvm upgrade -u
-
-Next, acquire the latest .NET Core DNX SDK.
-
-       dnvm install latest -r coreclr -u
-
-You can see the currently installed DNX versions with `dnvm list` (your display may vary as new versions of the DNX are published):
-
-       dnvm list
-
-```
-Active Version              Runtime Arch Location             Alias
------- -------              ------- ---- --------             -----
-  *    1.0.0-beta7-12364    coreclr x64  ~/.dnx/runtimes
-       1.0.0-beta7-12364    mono         ~/.dnx/runtimes      default
-```
-
-Write your App
-==============
-
-You need a Hello World application to run. You can write your own, if you'd like. Here's a very simple one:
-
-```csharp
-using System;
-
-public class Program
-{
-    public static void Main (string[] args)
-    {
-        Console.WriteLine("Hello, OS X");
-        Console.WriteLine("Love from CoreCLR.");
-    }
-}
-```
-
-Some people on the .NET Core team are partial to a demo console app on corefxlab repo which will print a picture for you. Download the [corefxlab demo](https://raw.githubusercontent.com/dotnet/corefxlab/master/demos/CoreClrConsoleApplications/HelloWorld/HelloWorld.cs) to the demo directory.
-
-You need a `project.json` that matches your app. Use this one. It will work for both of the apps provided/referenced above. Save the project.json beside your app.
-
-```
-{
-    "version": "1.0.0-*",
-    "dependencies": {
-    },
-    "frameworks" : {
-        "dnx451" : { },
-        "dnxcore50" : {
-            "dependencies": {
-                "System.Console": "4.0.0-beta-*"
-            }
-        }
-    }
-}
-```
-
-Run your App
-============
-
-You need to restore packages for your app, based on your project.json, with `dnu restore`. You will need to run this command under the Mono DNX. Make sure that you are using that one.
-
-       dnvm use 1.0.0-beta7-12364 -r mono
-       dnu restore
-
-You can run your app with .NET Core, although make sure to switch to that DNX.
-
-    dnvm use 1.0.0-beta7-12364 -r coreclr
-       dnx run
-
-       Hello, OSX
-       Love from CoreCLR.
diff --git a/Documentation/install/get-dotnetcore-dnx-windows.md b/Documentation/install/get-dotnetcore-dnx-windows.md
deleted file mode 100644 (file)
index 6edadc5..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-Get the .NET Core DNX SDK on Windows
-====================================
-
-These instructions will lead you through acquiring the .NET Core DNX SDK via the [.NET Version Manager (DNVM)](https://github.com/aspnet/dnvm)  and running a "Hello World" demo on Windows. The instructions use a particular set of paths. You'll need to adjust if you want to use a different set.
-
-These instructions are for .NET Core console apps. If you want to try out ASP.NET 5 on top of .NET Core - which is a great idea - check out the [ASP.NET 5 instructions](https://github.com/aspnet/home).
-
-.NET Core NuGet packages and the .NET Core DNX SDKs are available on the [ASP.NET 'vnext' myget feed](https://www.myget.org/F/aspnetvnext), which you can more easily view on [gallery](https://www.myget.org/gallery/aspnetvnext) for the feed.
-
-You can also acquire .NET Core directly via [NuGet restore](get-dotnetcore-windows.md) or [build from source](../building/windows-instructions.md). 
-
-Installing DNVM
-===============
-
-You need DNVM as a starting point. DNVM enables you to acquire a (or multiple) .NET Execution Environment (DNX). DNVM is simply a script, which doesn't depend on .NET. You can install it via a PowerShell command. You can find alternate DNVM install instructions at the [ASP.NET Home repo](https://github.com/aspnet/home).
-
-       C:\coreclr-demo> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "&{$Branch='dev';iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1'))}"
-
-You must close your command-prompt and start a new one in order for the user-wide environment variables to take effect.
-
-You can see the currently installed DNX versions with `dnvm list`, which will display an empty set of installed runtimes.
-
-       C:\coreclr-demo> dnvm list
-
-Installing a .NET Core DNX
-==========================
-
-It's easy to install the latest .NET Core-based DNX, using the `dnvm install` command. The `-u` (or `-Unstable`) parameter installs latest unstable version.
-
-       C:\coreclr-demo> dnvm install -r coreclr latest -u
-
-This will install the 32-bit version of .NET Core. If you want the 64-bit version, you can specify processor architecture:
-
-       C:\coreclr-demo> dnvm install -r coreclr -arch x64 latest -u
-
-You can see the currently installed DNX versions with `dnvm list` (your display may vary as new versions of the DNX are published):
-
-       C:\coreclr-demo>dnvm list
-
-```
-Active Version           Runtime Architecture Location                       Alias
------- -------           ------- ------------ --------                       -----
-        1.0.0-beta7-12364 coreclr x86          C:\Users\rlander\.dnx\runtimes
-        1.0.0-beta7-12364 coreclr x64          C:\Users\rlander\.dnx\runtimes
-```
-
-You can choose which of these DNXs you want to use with `dnvm use`, with similar arguments.
-
-```
-C:\coreclr-demo>dnvm use -r coreclr -arch x86 1.0.0-beta7-12364
-Adding C:\Users\rlander\.dnx\runtimes\dnx-coreclr-win-x86.1.0.0-beta7-12364\bin
-to process PATH
-
-C:\coreclr-demo>dnvm list
-
-Active Version           Runtime Architecture Location                       Alias
------- -------           ------- ------------ --------                       -----
-   *    1.0.0-beta7-12364 coreclr x86          C:\Users\rlander\.dnx\runtimes
-        1.0.0-beta7-12364 coreclr x64          C:\Users\rlander\.dnx\runtimes
-```
-
-Write your App
-==============
-
-You need a Hello World application to run. You can write your own, if you'd like. Here's a very simple one:
-
-```csharp
-using System;
-
-public class Program
-{
-    public static void Main (string[] args)
-    {
-        Console.WriteLine("Hello, Windows");
-        Console.WriteLine("Love from CoreCLR.");
-    }
-}
-```
-
-Some people on the .NET Core team are partial to a demo console app on corefxlab repo which will print a picture for you. Download the [corefxlab demo](https://raw.githubusercontent.com/dotnet/corefxlab/master/demos/CoreClrConsoleApplications/HelloWorld/HelloWorld.cs) to `C:\coreclr-demo`.
-
-You need a `project.json` that matches your app. Use this one. It will work for both of the apps provided/referenced above. Save the project.json beside your app.
-
-```
-{
-    "version": "1.0.0-*",
-    "dependencies": {
-    },
-    "frameworks" : {
-        "dnx451" : { },
-        "dnxcore50" : {
-            "dependencies": {
-                "System.Console": "4.0.0-beta-*"
-            }
-        }
-    }
-}
-```
-
-Run your App
-============
-
-You need to restore packages for your app, based on your project.json, with `dnu restore`.
-
-       C:\coreclr-demo> dnu restore
-
-You can run your app with the DNX command.
-
-       C:\coreclr-demo> dnx run
-       Hello, Windows
-       Love from CoreCLR.
diff --git a/Documentation/install/get-dotnetcore-windows.md b/Documentation/install/get-dotnetcore-windows.md
deleted file mode 100644 (file)
index bf0a0ce..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-Get .NET Core on Windows - Raw Experience
-=========================================
-
-These instructions will lead you through acquiring .NET Core directly via NuGet restore and running a "Hello World" demo on Windows. The instructions use a particular set of directory paths. You'll need to adjust if you want to use a different set.
-
-These instructions are for .NET Core console apps. If you want to try out ASP.NET 5 on top of .NET Core - which is a great idea - check out the [ASP.NET 5 instructions](https://github.com/aspnet/home).
-
-.NET Core NuGet packages are available on the [.NET Core myget feed](https://www.myget.org/F/dotnet-core), which you can more easily view on [gallery](https://www.myget.org/gallery/dotnet-core) for the feed.
-
-The preferred approach to acquire .NET Core is via the [.NET Core DNX SDK](get-dotnetcore-dnx-windows.md). It's the easiest approach. Alternatively, you can [build from source](../building/windows-instructions.md). This "raw" approach falls between the two in difficulty.
-
-NuGet Restore Packages
-======================
-
-Given that NuGet is the .NET Core distribution mechanism, you need a packages.config to restore the packages. The following packages.config is the most minimal one you can have for console apps. You will need to add packages if your app needs it Save this XML to `c:\coreclr-demo\packages\packages.config`.
-
-```
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="System.Console" version="4.0.0-beta-22713" />
-  <package id="System.Diagnostics.Contracts" version="4.0.0-beta-22713" />
-  <package id="System.Diagnostics.Debug" version="4.0.10-beta-22713" />
-  <package id="System.Diagnostics.Tools" version="4.0.0-beta-22713" />
-  <package id="System.Globalization" version="4.0.10-beta-22713" />
-  <package id="System.IO" version="4.0.10-beta-22713" />
-  <package id="System.IO.FileSystem.Primitives" version="4.0.0-beta-22713" />
-  <package id="System.Reflection" version="4.0.10-beta-22713" />
-  <package id="System.Runtime" version="4.0.20-beta-22713" />
-  <package id="System.Runtime.Extensions" version="4.0.10-beta-22713" />
-  <package id="System.Runtime.InteropServices" version="4.0.20-beta-22713" />
-  <package id="System.Text.Encoding" version="4.0.10-beta-22713" />
-  <package id="System.Text.Encoding.Extensions" version="4.0.10-beta-22713" />
-  <package id="System.Threading" version="4.0.10-beta-22713" />
-  <package id="System.Threading.Tasks" version="4.0.10-beta-22713" />
-  <package id="Microsoft.NETCore.Runtime.CoreCLR.ConsoleHost-x64" version="1.0.0-beta-22819" />
-  <package id="Microsoft.NETCore.Runtime.CoreCLR-x64" version="1.0.0-beta-22819"/>
-  <package id="Microsoft.NETCore.Runtime.ApiSets-x64" version="1.0.0-beta-22819" /><!-- only required on Windows 7 -->
-</packages>
-```
-
-You will need to update the version numbers to acquire later versions of the NuGet packages. If you do, you'll need to update the copy commands later in the instructions to reflect these changes. NuGet supports wildcard versions, such as `version="4.0.0-beta-*`, which can be helpful.
-
-Download the [NuGet client](https://nuget.org/nuget.exe) if you don't already have it in your path. You can grab it from: https://nuget.org/nuget.exe. Save it to `c:\coreclr-demo`.
-
-You need to restore the packages to the packages directory.
-
-       C:\coreclr-demo> nuget restore packages\packages.config -Source https://www.myget.org/F/dotnet-core/ -PackagesDirectory packages
-
-Write your App
-==============
-
-You need a Hello World application to run. You can write your own, if you'd like. Here's a very simple one:
-
-```csharp
-using System;
-
-public class Program
-{
-    public static void Main (string[] args)
-    {
-        Console.WriteLine("Hello, Windows");
-        Console.WriteLine("Love from CoreCLR.");
-    }
-}
-```
-
-**Another Option:** Some people on the .NET Core team are partial to a demo console app on corefxlab repo which will print a picture for you. To try it, download [corefxlab demo's HelloWorld.cs](https://raw.githubusercontent.com/dotnet/corefxlab/master/demos/CoreClrConsoleApplications/HelloWorld/HelloWorld.cs) to `C:\coreclr-demo`.
-
-Compile your App
-================
-
-You need to build your app with csc, the .NET Framework C# compiler. It may be easier to do this step within the "Developer Command Prompt for VS2013", if csc is not in your path. You need to pass references to the reference assemblies you restored using NuGet in order to compile the app against the .NET Core surface area:
-
-       C:\coreclr-demo> md app
-
-       C:\coreclr-demo> csc /nostdlib /noconfig /r:packages\System.Runtime.4.0.20-beta-22713\ref\any\System.Runtime.dll  /r:packages\System.Console.4.0.0-beta-22713\ref\any\System.Console.dll /out:app/HelloWorld.dll HelloWorld.cs
-
-It might seem odd, but this command compiles your app to a DLL. That's intended.
-
-Prepare the demo
-================
-
-You need to copy the NuGet package assemblies over to the app folder. You need to run a few commands, including a little batch magic.
-
-       C:\coreclr-demo> for /r packages %k in (*.dll) do echo "%k" | findstr "\lib\any\ \lib\netcore50\ \lib\any~win\\" && copy /Y "%k" app
-
-       C:\coreclr-demo> copy packages\Microsoft.NETCore.Runtime.CoreCLR.ConsoleHost-x64.1.0.0-beta-22819\native\win\x64\CoreConsole.exe app\HelloWorld.exe
-
-This last step might be a bit surprising, copying `CoreConsole.exe` to MyApp.exe, in this case `HelloWorld.exe`. This is closely related to compiling the app, in the instructions above, to MyApp.dll, in this case to `HelloWorld.dll`.
-
-We've grown very fond of creating and using managed EXEs that don't require a separate launcher with the .NET Framework on Windows. We wanted the same experience for .NET Core. To enable the experience, we created a launcher that expects a managed assembly of the same name, compiled with a static main method. As a case in point, if you run `CoreConsole.exe` without renaming it, it will expect a `CoreConsole.dll`. The renaming step, which you see above, needs to match the main assembly, compiled as a DLL, and you get an experience that feels launcher-less.
-
-Lastly, if you're a Windows 7 user, you'll need to copy over some API DLLS:
-
-       C:\coreclr-demo> copy packages\Microsoft.NETCore.Runtime.ApiSets-x64.1.0.0-beta-22819\native\x64\*.dll app
-
-Run the demo
-============
-
-You're ready to run Hello World!
-
-       C:\coreclr-demo> app\HelloWorld.exe
-       Hello, Windows
-       Love from CoreCLR.
-
-Thanks for trying out CoreCLR. Feel free to try a more interesting demo.
index ab1d3f6..2ee3f9b 100755 (executable)
@@ -62,7 +62,7 @@ GENERATEDTABLEINFO="This table is machine-generated from commit $COMMIT on ${DAT
 read -r -d '' CLRCONFIGSECTIONCONTENTS << "EOF"
 When using these configurations from environment variables, the variables need to have the `COMPlus_` prefix in their names. e.g. To set DumpJittedMethods to 1, add the environment variable `COMPlus_DumpJittedMethods=1`.
 
-See also [Dumps and Other Tools](../botr/ryujit-overview.md#dumps-and-other-tools) for more information.
+See also [Setting configuration variables](../building/viewing-jit-dumps.md#setting-configuration-variables) for more information.
 
 Name | Description | Type | Class | Default Value | Flags 
 -----|-------------|------|-------|---------------|-------
index 2669873..63f094b 100644 (file)
@@ -14,11 +14,11 @@ System.Threading.ThreadPool.MaxThreads|Override MaxThreads for the ThreadPool wo
 
 ## Environment/Registry Configuration Knobs
 
-This table is machine-generated from commit ae2d2f3 on 04/20/16. It might be out of date.
+This table is machine-generated from commit 82ed770 on 05/31/16. It might be out of date.
 
 When using these configurations from environment variables, the variables need to have the `COMPlus_` prefix in their names. e.g. To set DumpJittedMethods to 1, add the environment variable `COMPlus_DumpJittedMethods=1`.
 
-See also [Dumps and Other Tools](../botr/ryujit-overview.md#dumps-and-other-tools) for more information.
+See also [Setting configuration variables](../building/viewing-jit-dumps.md#setting-configuration-variables) for more information.
 
 Name | Description | Type | Class | Default Value | Flags 
 -----|-------------|------|-------|---------------|-------
@@ -133,7 +133,6 @@ Name | Description | Type | Class | Default Value | Flags
 `DbgTransportLogClass` | mask to control what is logged in DbgTransportLog | DWORD | INTERNAL | | 
 `DbgTransportProxyAddress` | allows specifying the transport proxy address | STRING | UNSUPPORTED | | REGUTIL_default
 `DbgTrapOnSkip` | allows breaking when we skip a breakpoint | DWORD | INTERNAL | 0 | REGUTIL_default
-`DbgWaitForDebuggerAttach` | Makes CoreCLR wait for a managed debugger to attach on process start (1) or regular process start (0) | DWORD | UNSUPPORTED | 0 | 
 `DbgWaitTimeout` | specifies the timeout value for waits | DWORD | INTERNAL | 1 | REGUTIL_default
 `DbgWFDETimeout` | specifies the timeout value for wait when waiting for a debug event | DWORD | UNSUPPORTED | 25 | REGUTIL_default
 `RaiseExceptionOnAssert` | Raise a first chance (if set to 1) or second chance (if set to 2) exception on asserts. | DWORD | INTERNAL | 0 | REGUTIL_default
index 34a7239..dd7bc31 100644 (file)
@@ -1 +1 @@
-1.0.0-beta-002173
\ No newline at end of file
+1.0.0-preview2-002733
\ No newline at end of file
index b8fd518..a39377c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ Build Status
 |**openSUSE 13.2**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_opensuse13.2.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_opensuse13.2)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_opensuse13.2.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_opensuse13.2)|
 |**OS X 10.11**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_osx.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_osx)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_osx.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_osx)|
 |**Red Hat 7.2**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_rhel7.2.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_rhel7.2)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_rhel7.2.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_rhel7.2)|
+|**Fedora 23**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_fedora23.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_fedora23)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_fedora23.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_fedora23)|
 |**Ubuntu 14.04**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_ubuntu.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_ubuntu)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_ubuntu.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_ubuntu)|
 |**Ubuntu 16.04**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_ubuntu16.04.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_ubuntu16.04)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_ubuntu16.04.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_ubuntu16.04)|
 |**Windows 8.1**|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/debug_windows_nt.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/debug_windows_nt)<br/>[![arm64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/arm64_cross_debug_windows_nt.svg?label=arm64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/arm64_cross_debug_windows_nt)|[![x64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/release_windows_nt.svg?label=x64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/release_windows_nt)<br/>[![arm64 status](https://img.shields.io/jenkins/s/http/dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/arm64_cross_release_windows_nt.svg?label=arm64)](http://dotnet-ci.cloudapp.net/job/dotnet_coreclr/job/master/job/arm64_cross_release_windows_nt)|
index c6580bd..0403c3f 100755 (executable)
@@ -103,18 +103,13 @@ case $OSName in
 esac
 
 if [ "$__BuildOS" == "Linux" ]; then
-        # Detect Distro
-        if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
-            export __DistroName=ubuntu
-        elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
-            export __DistroName=rhel
-        elif [ "$(cat /etc/*-release | grep -cim1 rhel)" -eq 1 ]; then
-            export __DistroName=rhel
-        elif [ "$(cat /etc/*-release | grep -cim1 debian)" -eq 1 ]; then
-            export __DistroName=debian
-        else
-            export __DistroName=""
-        fi
+    if [ ! -e /etc/os-release ]; then
+        echo "WARNING: Can not determine runtime id for current distro."
+        export __DistroRid=""
+    else
+        source /etc/os-release
+        export __DistroRid="$ID.$VERSION_ID-$__BuildArch"
+    fi
 fi
 
 __IntermediatesDir="$__ProjectRoot/bin/obj/$__BuildOS.$__BuildArch.$__BuildType"
index c3cb4a0..76b82a6 100644 (file)
--- a/build.cmd
+++ b/build.cmd
@@ -69,7 +69,6 @@ set __BuildArchArm64=0
 set __BuildTypeDebug=0
 set __BuildTypeChecked=0
 set __BuildTypeRelease=0
-set __GCStressLevel=0
 set __BuildJit32="-DBUILD_JIT32=0"
 
 REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
@@ -120,7 +119,6 @@ if /i "%1" == "skipbuildpackages"   (set __SkipBuildPackages=1&shift&goto Arg_Lo
 if /i "%1" == "sequential"          (set __BuildSequential=1&shift&goto Arg_Loop)
 if /i "%1" == "disableoss"          (set __SignTypeReal="/p:SignType=real"&shift&goto Arg_Loop)
 if /i "%1" == "priority"            (set __TestPriority=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
-if /i "%1" == "gcstresslevel"       (set __GCStressLevel=%2&set __PassThroughArgs=%__PassThroughArgs% %2&shift&shift&goto Arg_Loop)
 if /i "%1" == "buildjit32"          (set __BuildJit32="-DBUILD_JIT32=1"&shift&goto Arg_Loop)
 
 @REM For backwards compatibility, continue accepting "skiptestbuild", which was the original name of the option.
@@ -458,7 +456,7 @@ echo %__MsgPrefix%Generating native image of System.Private.CoreLib for %__Build
 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\System.Private.CoreLib.ni.dll" "%__BinDir%\System.Private.CoreLib.dll" > "%__CrossGenCoreLibLog%" 2>&1
-if NOT errorlevel 0 (
+if %errorlevel% NEQ 0 (
     echo %__MsgPrefix%Error: CrossGen System.Private.CoreLib build failed. Refer to the build log file for details:
     echo     %__CrossGenCoreLibLog%
     exit /b 1
@@ -469,7 +467,7 @@ echo %__MsgPrefix%Generating native image of MScorlib facade for %__BuildOS%.%__
 set "__CrossGenCoreLibLog=%__LogsDir%\CrossgenMSCoreLib_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
 set "__CrossgenExe=%__CrossComponentBinDir%\crossgen.exe"
 "%__CrossgenExe%" /Platform_Assemblies_Paths "%__BinDir%" /out "%__BinDir%\mscorlib.ni.dll" "%__BinDir%\mscorlib.dll" > "%__CrossGenCoreLibLog%" 2>&1
-if NOT errorlevel 0 (
+if %errorlevel% NEQ 0 (
     echo %__MsgPrefix%Error: CrossGen mscorlib facade build failed. Refer to the build log file for details:
     echo     %__CrossGenCoreLibLog%
     exit /b 1
@@ -491,51 +489,17 @@ set __msbuildLogArgs=^
 /consoleloggerparameters:Summary ^
 /verbosity:minimal
 
-if not defined __SkipCoreLibBuild (
-       set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.Runtime.CoreClr\Microsoft.NETCore.Runtime.CoreCLR.builds" /p:Platform=%__BuildArch%
-       %_msbuildexe% !__msbuildArgs! %__msbuildLogArgs%
-       if errorlevel 1 (
-           echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
-           echo     %__BuildLog%
-           echo     %__BuildWrn%
-           echo     %__BuildErr%
-           exit /b 1
-       )
-)
-
-if not defined __SkipNativeBuild (
-       set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.Jit\Microsoft.NETCore.Jit.builds" /p:Platform=%__BuildArch%
-       %_msbuildexe% !__msbuildArgs! %__msbuildLogArgs%
-       if errorlevel 1 (
-           echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
-           echo     %__BuildLog%
-           echo     %__BuildWrn%
-           echo     %__BuildErr%
-           exit /b 1
-       )
-)
-
-rem Build the ILAsm package
-set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.ILAsm\Microsoft.NETCore.ILAsm.builds" /p:Platform=%__BuildArch%
-%_msbuildexe% %__msbuildArgs% %__msbuildLogArgs%
+REM The conditions as to what to build are captured in the builds file.
+set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\packages.builds" /p:Platform=%__BuildArch%
+%_msbuildexe% !__msbuildArgs! %__msbuildLogArgs%
 if errorlevel 1 (
-    echo %__MsgPrefix%Error: ILAsm Nuget package generation failed build failed. Refer to the build log files for details:
+    echo %__MsgPrefix%Error: Nuget package generation failed build failed. Refer to the build log files for details:
     echo     %__BuildLog%
     echo     %__BuildWrn%
     echo     %__BuildErr%
     exit /b 1
 )
 
-rem Build the ILDAsm package
-set __msbuildArgs="%__ProjectFilesDir%\src\.nuget\Microsoft.NETCore.ILDAsm\Microsoft.NETCore.ILDAsm.builds" /p:Platform=%__BuildArch%
-%_msbuildexe% %__msbuildArgs% %__msbuildLogArgs%
-if errorlevel 1 (
-    echo %__MsgPrefix%Error: ILDAsm Nuget package generation failed build failed. Refer to the build log files for details:
-    echo     %__BuildLog%
-    echo     %__BuildWrn%
-    echo     %__BuildErr%
-    exit /b 1
-)
 
 :SkipNuget
 
@@ -571,10 +535,6 @@ if defined __TestPriority (
     set "__BuildtestArgs=%__BuildtestArgs% Priority %__TestPriority%"
 )
 
-if %__GCStressLevel% GTR 0 (
-    set "__BuildtestArgs=%__BuildtestArgs% gcstresslevel %__GCStressLevel%"   
-)
-
 rem arm64 builds currently use private toolset which has not been released yet
 REM TODO, remove once the toolset is open.
 if /i "%__BuildArch%" == "arm64" call :PrivateToolSet 
@@ -702,7 +662,6 @@ echo     or windowsmscorlib. If one of these is passed, only System.Private.Core
 echo     for the specified platform ^(FreeBSD, Linux, NetBSD, OS X or Windows,
 echo     respectively^).
 echo priority ^<N^> : specify a set of test that will be built and run, with priority N.
-echo gcstresslevel ^<N^> : specify the GCStress level the tests should run under.
 echo sequential: force a non-parallel build ^(default is to build in parallel
 echo     using all processors^).
 echo configureonly: skip all builds; only run CMake ^(default: CMake and builds are run^)
index 87d01b0..61ee3c1 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -29,20 +29,15 @@ usage()
     exit 1
 }
 
-initDistroName()
+initDistroRid()
 {
     if [ "$__BuildOS" == "Linux" ]; then
-        # Detect Distro
-        if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
-            export __DistroName=ubuntu
-        elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
-            export __DistroName=rhel
-        elif [ "$(cat /etc/*-release | grep -cim1 rhel)" -eq 1 ]; then
-            export __DistroName=rhel
-        elif [ "$(cat /etc/*-release | grep -cim1 debian)" -eq 1 ]; then
-            export __DistroName=debian
+        if [ ! -e /etc/os-release ]; then
+            echo "WARNING: Can not determine runtime id for current distro."
+            export __DistroRid=""
         else
-            export __DistroName=""
+            source /etc/os-release
+            export __DistroRid="$ID.$VERSION_ID-$__HostArch"
         fi
     fi
 }
@@ -214,31 +209,35 @@ isMSBuildOnNETCoreSupported()
     # This needs to be updated alongwith corresponding changes to netci.groovy.
     __isMSBuildOnNETCoreSupported=0
 
-    if [ "$__BuildArch" == "x64" ]; then
-        if [ "$__BuildOS" == "Linux" ]; then
-            if [ "$__DistroName" == "ubuntu" ]; then
-                __OSVersion=$(lsb_release -rs)
-                if [ "$__OSVersion" == "14.04" ]; then
+    if [ "$__HostArch" == "x64" ]; then
+        if [ "$__HostOS" == "Linux" ]; then
+            case "$__DistroRid" in
+                "centos.7-x64")
                     __isMSBuildOnNETCoreSupported=1
-                elif [ "$(cat /etc/*-release | grep -cim1 14.04)" -eq 1 ]; then
-                    # Linux Mint based on Ubuntu 14.04
+                    ;;
+                "debian.8-x64")
                     __isMSBuildOnNETCoreSupported=1
-                fi
-            elif [ "$__DistroName" == "rhel" ]; then
-                __isMSBuildOnNETCoreSupported=1
-            elif [ "$__DistroName" == "debian" ]; then
-                __isMSBuildOnNETCoreSupported=1
-            fi
-        elif [ "$__BuildOS" == "OSX" ]; then
+                    ;;
+                "fedora.23-x64")
+                    __isMSBuildOnNETCoreSupported=1
+                    ;;
+                "opensuse.13.2-x64")
+                    __isMSBuildOnNETCoreSupported=1
+                    ;;
+                "rhel.7.2-x64")
+                    __isMSBuildOnNETCoreSupported=1
+                    ;;
+                "ubuntu.14.04-x64")
+                    __isMSBuildOnNETCoreSupported=1
+                    ;;
+                "ubuntu.16.04-x64")
+                    __isMSBuildOnNETCoreSupported=1
+                    ;;
+                *)
+            esac
+        elif [ "$__HostOS" == "OSX" ]; then
             __isMSBuildOnNETCoreSupported=1
         fi
-    elif [ "$__BuildArch" == "arm" ] || [ "$__BuildArch" == "arm64" ] ; then
-        if [ "$__BuildOS" == "Linux" ]; then
-            if [ "$__DistroName" == "ubuntu" ]; then
-                __isMSBuildOnNETCoreSupported=1
-            fi
-        fi
-
     fi
 }
 
@@ -326,45 +325,20 @@ generate_NugetPackages()
         return
     fi
 
-    echo "Generating nuget packages for "$__BuildOS
-
     if [ $__SkipMSCorLib == 1 ]; then
         # Restore buildTools, since we skipped doing so with the mscorlib build.
-
         restoreBuildTools
 
        echo "Unable to generate Microsoft.NETCore.Runtime.CoreCLR nuget package since mscorlib was not built."
-    else
-        # Build the CoreCLR packages
-        $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir /p:BuildNugetPackage=false /p:UseSharedCompilation=false
-
-        if [ $? -ne 0 ]; then
-            echo "Failed to generate Nuget packages."
-            exit 1
-        fi
-    fi
-
-    # Build the JIT packages
-    $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:BuildNugetPackage=false /p:__RootBinDir=$__RootBinDir /p:UseSharedCompilation=false
-
-    if [ $? -ne 0 ]; then
-        echo "Failed to generate Nuget packages."
-        exit 1
     fi
 
-    # Build the ILAsm package
-    $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:BuildNugetPackage=false /p:__RootBinDir=$__RootBinDir /p:UseSharedCompilation=false
-
-    if [ $? -ne 0 ]; then
-        echo "Failed to generate ILAsm Nuget packages."
-        exit 1
-    fi
+    echo "Generating nuget packages for "$__BuildOS
 
-    # Build the ILDAsm package
-    $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:BuildNugetPackage=false /p:__RootBinDir=$__RootBinDir /p:UseSharedCompilation=false
+    # Build the packages
+    $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/src/.nuget/packages.builds" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/Nuget_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:__RootBinDir=$__RootBinDir /p:BuildNugetPackage=false /p:UseSharedCompilation=false
 
     if [ $? -ne 0 ]; then
-        echo "Failed to generate ILDAsm Nuget packages."
+        echo "Failed to generate Nuget packages."
         exit 1
     fi
 }
@@ -424,31 +398,38 @@ OSName=$(uname -s)
 case $OSName in
     Linux)
         __BuildOS=Linux
+        __HostOS=Linux
         ;;
 
     Darwin)
         __BuildOS=OSX
+        __HostOS=OSX
         ;;
 
     FreeBSD)
         __BuildOS=FreeBSD
+        __HostOS=FreeBSD
         ;;
 
     OpenBSD)
         __BuildOS=OpenBSD
+        __HostOS=OpenBSD
         ;;
 
     NetBSD)
         __BuildOS=NetBSD
+        __HostOS=NetBSD
         ;;
 
     SunOS)
         __BuildOS=SunOS
+        __HostOS=SunOS
         ;;
 
     *)
         echo "Unsupported OS $OSName detected, configuring as if for Linux"
         __BuildOS=Linux
+        __HostOS=Linux
         ;;
 esac
 
@@ -478,7 +459,7 @@ __ClangMajorVersion=0
 __ClangMinorVersion=0
 __MSBuildPath=$__ProjectRoot/Tools/MSBuild.exe
 __NuGetPath="$__PackagesDir/NuGet.exe"
-__DistroName=""
+__DistroRid=""
 __cmakeargs=""
 __OfficialBuildIdArg=
 __SkipGenerateVersion=0
@@ -673,7 +654,7 @@ if [[ $__ConfigureOnly == 1 && $__SkipConfigure == 1 ]]; then
 fi
 
 # init the distro name
-initDistroName
+initDistroRid
 
 # Set the remaining variables based upon the determined build configuration
 __BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
index 0b34e57..ea65682 100644 (file)
@@ -114,9 +114,9 @@ if(CLR_CMAKE_PLATFORM_UNIX)
 endif(CLR_CMAKE_PLATFORM_UNIX)
 add_definitions(-DFEATURE_EXCEPTIONDISPATCHINFO)
 # NetBSD doesn't implement this feature
-if(NOT CLR_CMAKE_PLATFORM_UNIX_ARM AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+if(NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
     add_definitions(-DFEATURE_HIJACK)
-endif(NOT CLR_CMAKE_PLATFORM_UNIX_ARM AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+endif(NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
 add_definitions(-DFEATURE_HOST_ASSEMBLY_RESOLVER)
 add_definitions(-DFEATURE_ICASTABLE)
 if (CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_TARGET_ARCH_ARM64)
index 5994e08..3eb00f1 100644 (file)
@@ -114,3 +114,18 @@ SET( HAVE_CLOCK_MONOTONIC_COARSE_EXITCODE
      0
      CACHE STRING "Result from TRY_RUN" FORCE)
 
+SET( HAVE_PROCFS_CTL_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_MAPS_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_STAT_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_STATUS_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
index 5994e08..3eb00f1 100644 (file)
@@ -114,3 +114,18 @@ SET( HAVE_CLOCK_MONOTONIC_COARSE_EXITCODE
      0
      CACHE STRING "Result from TRY_RUN" FORCE)
 
+SET( HAVE_PROCFS_CTL_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_MAPS_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_STAT_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
+
+SET( HAVE_PROCFS_STATUS_EXITCODE
+     1
+     CACHE STRING "Result from TRY_RUN" FORCE)
index fad1e0d..ac110e5 100644 (file)
--- a/dir.props
+++ b/dir.props
@@ -7,25 +7,25 @@
     <OsEnvironment Condition="'$(OsEnvironment)'=='' and '$(OS)'=='OSX'">Unix</OsEnvironment>
     <OsEnvironment Condition="'$(OsEnvironment)'==''">$(OS)</OsEnvironment>
   </PropertyGroup>
-  
+
   <!-- Build Tools Versions -->
   <PropertyGroup>
     <RoslynVersion>1.0.0-rc3-20150510-01</RoslynVersion>
     <RoslynPackageName>Microsoft.Net.ToolsetCompilers</RoslynPackageName>
   </PropertyGroup>
 
-    <!-- 
-     Switching to the .NET Core version of the BuildTools tasks seems to break numerous scenarios, such as VS intellisense and resource designer 
-     as well as runnning the build on mono. Until we can get these sorted out we will continue using the .NET 4.5 version of the tasks. 
-     --> 
+    <!--
+     Switching to the .NET Core version of the BuildTools tasks seems to break numerous scenarios, such as VS intellisense and resource designer
+     as well as runnning the build on mono. Until we can get these sorted out we will continue using the .NET 4.5 version of the tasks.
+     -->
   <PropertyGroup>
-    <BuildToolsTargets45>true</BuildToolsTargets45> 
+    <BuildToolsTargets45>true</BuildToolsTargets45>
   </PropertyGroup>
-  
+
   <!-- Common properties -->
   <PropertyGroup>
     <!-- Set basic properties and normalize -->
-    
+
     <BuildArch>$(__BuildArch)</BuildArch>
     <BuildArch Condition="'$(__BuildArch)'==''">x64</BuildArch>
     <BuildArch Condition="'$(__BuildArch)' == 'amd64'">x64</BuildArch>
     -->
     <PackagesBinDir>$(__PackagesBinDir)</PackagesBinDir>
     <PackagesBinDir Condition="'$(__PackagesBinDir)'==''">$(BinDir).nuget\</PackagesBinDir>
-    
-    <ToolsDir Condition="'$(ToolsDir)'==''">$(ProjectDir)Tools/</ToolsDir> 
-    <DotnetCliPath Condition="'$(DotnetCliPath)'==''">$(ToolsDir)dotnetcli/</DotnetCliPath> 
+
+    <ToolsDir Condition="'$(ToolsDir)'==''">$(ProjectDir)Tools/</ToolsDir>
+    <DotnetCliPath Condition="'$(DotnetCliPath)'==''">$(ToolsDir)dotnetcli/</DotnetCliPath>
     <BuildToolsSemaphore Condition="'$(BuildToolsSemaphore)' == ''">$(ToolsDir)Microsoft.DotNet.Build.Tasks.dll</BuildToolsSemaphore>
-    
+
     <TestWorkingDir>$(__TestWorkingDir)\</TestWorkingDir>
     <TestWorkingDir Condition="'$(__TestWorkingDir)'==''">$(RootBinDir)tests\$(BuildOS).$(BuildArch).$(BuildType)\</TestWorkingDir>
     <BuildToolsTaskDir Condition="'$(BuildToolsTargets45)' == 'true'">$(ToolsDir)net45/</BuildToolsTaskDir>
 
     <Platform Condition="'$(Platform)' == ''">$(BuildArch)</Platform>
     <Platform Condition="'$(Platform)' == 'amd64'">x64</Platform>
-    
+
   </PropertyGroup>
 
   <!-- Output paths -->
   </PropertyGroup>
 
   <Import Condition="Exists('$(ToolsDir)BuildVersion.targets')" Project="$(ToolsDir)BuildVersion.targets" />
-  
-  <!-- Import Build tools common props file where repo-independent properties are found -->  
-  <Import Condition="Exists('$(ToolsDir)Build.Common.props')" Project="$(ToolsDir)Build.Common.props" />  
 
-  
+  <!-- Import Build tools common props file where repo-independent properties are found -->
+  <Import Condition="Exists('$(ToolsDir)Build.Common.props')" Project="$(ToolsDir)Build.Common.props" />
+
+
   <!-- Common nuget properties -->
   <PropertyGroup>
     <NuGetToolPath Condition="'$(NuGetToolPath)'==''">$(PackagesDir)NuGet.exe</NuGetToolPath>
     <NugetRestoreCommand>$(NugetRestoreCommand) -Verbosity detailed</NugetRestoreCommand>
     <NugetRestoreCommand Condition="'$(OsEnvironment)'=='Unix'">mono $(NuGetRestoreCommand)</NugetRestoreCommand>
   </PropertyGroup>
-  
+
   <PropertyGroup>
-    <DotnetToolCommand Condition="'$(DotnetToolCommand)'=='' and '$(OsEnvironment)'!='Unix'">$(DotnetCliPath)dotnet.exe</DotnetToolCommand>  
-    <DotnetToolCommand Condition="'$(DotnetToolCommand)'=='' and '$(OsEnvironment)'=='Unix'">$(DotnetCliPath)dotnet</DotnetToolCommand>  
+    <DotnetToolCommand Condition="'$(DotnetToolCommand)'=='' and '$(OsEnvironment)'!='Unix'">$(DotnetCliPath)dotnet.exe</DotnetToolCommand>
+    <DotnetToolCommand Condition="'$(DotnetToolCommand)'=='' and '$(OsEnvironment)'=='Unix'">$(DotnetCliPath)dotnet</DotnetToolCommand>
 
-    <DnuRestoreCommand>$(DnuRestoreCommand) "$(DotnetToolCommand)"</DnuRestoreCommand> 
+    <DnuRestoreCommand>$(DnuRestoreCommand) "$(DotnetToolCommand)"</DnuRestoreCommand>
     <DnuRestoreCommand>$(DnuRestoreCommand) restore</DnuRestoreCommand>
     <DnuRestoreCommand>$(DnuRestoreCommand) --packages "$(PackagesDir.TrimEnd('\\'))"</DnuRestoreCommand>
   </PropertyGroup>
-  
+
   <!--
     Set up Roslyn predefines
   -->
     <TargetsNetBSD Condition="'$(BuildOS)' == 'NetBSD'">true</TargetsNetBSD>
     <TargetsOSX Condition="'$(BuildOS)' == 'OSX'">true</TargetsOSX>
     <TargetsWindows Condition="'$(BuildOS)' == 'Windows_NT'">true</TargetsWindows>
-    
+
     <TargetsUnix Condition="'$(TargetsFreeBSD)' == 'true' or '$(TargetsLinux)' == 'true' or '$(TargetsNetBSD)' == 'true' or '$(TargetsOSX)' == 'true'">true</TargetsUnix>
 
     <!-- We are only tracking Linux Distributions for Nuget RID mapping -->
-    <DistroName Condition="'$(TargetsLinux)' == 'true'">$(__DistroName)</DistroName>
+    <DistroRid Condition="'$(TargetsLinux)' == 'true'">$(__DistroRid)</DistroRid>
 
   </PropertyGroup>
 
     <PackageDescriptionFile>$(SourceDir).nuget/descriptions.json</PackageDescriptionFile>
     <PackageLicenseFile>$(SourceDir).nuget/dotnet_library_license.txt</PackageLicenseFile>
     <PackageThirdPartyNoticesFile>$(SourceDir).nuget/ThirdPartyNotices.txt</PackageThirdPartyNoticesFile>
-    
+
     <!-- This should be kept in sync with package details in src/.nuget/init/project.json -->
     <RuntimeIdGraphDefinitionFile>$(PackagesDir)/Microsoft.NETCore.Platforms/1.0.1-rc2-23712/runtime.json</RuntimeIdGraphDefinitionFile>
 
     <PackagePlatform Condition="'$(PackagePlatform)' == ''">$(Platform)</PackagePlatform>
     <PackagePlatform Condition="'$(PackagePlatform)' == 'amd64'">x64</PackagePlatform>
     <PackageOutputPath>$(PackagesBinDir)/pkg/</PackageOutputPath>
-    <SymbolPackageOutputPath>$(PackagesBinDir)/symbolpkg/</SymbolPackageOutputPath> 
+    <SymbolPackageOutputPath>$(PackagesBinDir)/symbolpkg/</SymbolPackageOutputPath>
   </PropertyGroup>
 
+  <!-- Add required legal files to packages -->
+  <ItemGroup Condition="'$(MSBuildProjectExtension)' == '.pkgproj'">
+    <File Condition="Exists('$(PackageLicenseFile)')"
+          Include="$(PackageLicenseFile)" >
+        <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    </File>
+    <File Condition="Exists('$(PackageThirdPartyNoticesFile)')"
+          Include="$(PackageThirdPartyNoticesFile)" >
+        <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    </File>
+  </ItemGroup>
+
 </Project>
index d15c641..abc34f9 100644 (file)
@@ -45,10 +45,10 @@ echo Installing dotnet cli...
 if NOT exist "%DOTNET_PATH%" mkdir "%DOTNET_PATH%"
 set /p DOTNET_VERSION=< "%~dp0DotnetCLIVersion.txt"
 set DOTNET_ZIP_NAME=dotnet-dev-win-x64.%DOTNET_VERSION%.zip
-set DOTNET_REMOTE_PATH=https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/%DOTNET_VERSION%/%DOTNET_ZIP_NAME%
+set DOTNET_REMOTE_PATH=https://dotnetcli.blob.core.windows.net/dotnet/preview/Binaries/%DOTNET_VERSION%/%DOTNET_ZIP_NAME%
 set DOTNET_LOCAL_PATH=%DOTNET_PATH%%DOTNET_ZIP_NAME%
 echo Installing '%DOTNET_REMOTE_PATH%' to '%DOTNET_LOCAL_PATH%' >> "%INIT_TOOLS_LOG%"
-powershell -NoProfile -ExecutionPolicy unrestricted -Command "(New-Object Net.WebClient).DownloadFile('%DOTNET_REMOTE_PATH%', '%DOTNET_LOCAL_PATH%'); Add-Type -Assembly 'System.IO.Compression.FileSystem' -ErrorVariable AddTypeErrors; if ($AddTypeErrors.Count -eq 0) { [System.IO.Compression.ZipFile]::ExtractToDirectory('%DOTNET_LOCAL_PATH%', '%DOTNET_PATH%') } else { (New-Object -com shell.application).namespace('%DOTNET_PATH%').CopyHere((new-object -com shell.application).namespace('%DOTNET_LOCAL_PATH%').Items(),16) }" >> "%INIT_TOOLS_LOG%"
+powershell -NoProfile -ExecutionPolicy unrestricted -Command "$retryCount = 0; $success = $false; do { try { (New-Object Net.WebClient).DownloadFile('%DOTNET_REMOTE_PATH%', '%DOTNET_LOCAL_PATH%'); $success = $true; } catch { if ($retryCount -ge 6) { throw; } else { $retryCount++; Start-Sleep -Seconds (5 * $retryCount); } } } while ($success -eq $false); Add-Type -Assembly 'System.IO.Compression.FileSystem' -ErrorVariable AddTypeErrors; if ($AddTypeErrors.Count -eq 0) { [System.IO.Compression.ZipFile]::ExtractToDirectory('%DOTNET_LOCAL_PATH%', '%DOTNET_PATH%') } else { (New-Object -com shell.application).namespace('%DOTNET_PATH%').CopyHere((new-object -com shell.application).namespace('%DOTNET_LOCAL_PATH%').Items(),16) }" >> "%INIT_TOOLS_LOG%"
 if NOT exist "%DOTNET_LOCAL_PATH%" (
   echo ERROR: Could not install dotnet cli correctly. See '%INIT_TOOLS_LOG%' for more details.
   set TOOLS_INIT_RETURN_CODE=1
index 759a2ec..647eba6 100755 (executable)
@@ -3,17 +3,12 @@
 initDistroName()
 {
     if [ "$1" == "Linux" ]; then
-        # Detect Distro
-        if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
-            export __DistroName=ubuntu
-        elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
-            export __DistroName=centos
-        elif [ "$(cat /etc/*-release | grep -cim1 rhel)" -eq 1 ]; then
-            export __DistroName=rhel
-        elif [ "$(cat /etc/*-release | grep -cim1 debian)" -eq 1 ]; then
-            export __DistroName=debian
+        if [ ! -e /etc/os-release ]; then
+            echo "WARNING: Can not determine runtime id for current distro."
+            export __DistroRid=""
         else
-            export __DistroName=""
+            source /etc/os-release
+            export __DistroRid="$ID.$VERSION_ID-x64"
         fi
     fi
 }
@@ -41,7 +36,7 @@ __BUILD_TOOLS_PATH=$__PACKAGES_DIR/Microsoft.DotNet.BuildTools/$__BUILD_TOOLS_PA
 __PROJECT_JSON_PATH=$__TOOLRUNTIME_DIR/$__BUILD_TOOLS_PACKAGE_VERSION
 __PROJECT_JSON_FILE=$__PROJECT_JSON_PATH/project.json
 __PROJECT_JSON_CONTENTS="{ \"dependencies\": { \"Microsoft.DotNet.BuildTools\": \"$__BUILD_TOOLS_PACKAGE_VERSION\" }, \"frameworks\": { \"dnxcore50\": { } } }"
-__DistroName=""
+__DistroRid=""
 
 OSName=$(uname -s)
 case $OSName in
@@ -52,26 +47,26 @@ case $OSName in
 
     Linux)
         OS=Linux
-        __DOTNET_PKG=dotnet-dev-ubuntu-x64
+
+        if [ ! -e /etc/os-release ]; then
+            echo "Cannot determine Linux distribution, asuming Ubuntu 14.04."
+            __DOTNET_PKG=dotnet-dev-ubuntu.14.04-x64
+        else
+            source /etc/os-release
+            __DOTNET_PKG="dotnet-dev-$ID.$VERSION_ID-x64"
+        fi
         ;;
 
     *)
         echo "Unsupported OS $OSName detected. Downloading ubuntu-x64 tools"
         OS=Linux
-        __DOTNET_PKG=dotnet-dev-ubuntu-x64
+        __DOTNET_PKG=dotnet-dev-ubuntu.14.04-x64
         ;;
 esac
 
 # Initialize Linux Distribution name and .NET CLI package name.
 
 initDistroName $OS
-if [ "$__DistroName" == "centos" ]; then
-    __DOTNET_PKG=dotnet-dev-centos-x64
-fi
-
-if [ "$__DistroName" == "rhel" ]; then
-    __DOTNET_PKG=dotnet-dev-centos-x64
-fi
 
 # Work around mac build issue 
 if [ "$OS"=="OSX" ]; then
@@ -80,7 +75,7 @@ if [ "$OS"=="OSX" ]; then
   ulimit -n 2048
 fi
 
-__CLIDownloadURL=https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz
+__CLIDownloadURL=https://dotnetcli.blob.core.windows.net/dotnet/preview/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz
 echo ".NET CLI will be downloaded from $__CLIDownloadURL"
 echo "Locating $__PROJECT_JSON_FILE to see if we already downloaded .NET CLI tools..." 
 
@@ -96,8 +91,8 @@ if [ ! -e $__PROJECT_JSON_FILE ]; then
           wget -q -O $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL
           echo "wget -q -O $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL"
         else
-          curl -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL
-          echo "curl -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL"
+          curl --retry 10 -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL
+          echo "curl --retry 10 -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar $__CLIDownloadURL"
         fi
         cd $__DOTNET_PATH
         tar -xf $__DOTNET_PATH/dotnet.tar
index 5440ff9..d2c9246 100755 (executable)
@@ -181,15 +181,15 @@ def static genStressModeScriptStep(def os, def stressModeName, def stressModeVar
         }
     }
     else {
-        // For these we don't use a script, we use directly
         stepScript += "echo Setting variables for ${stressModeName}\n"
-        stepScript += "rm -f ${stepScriptLocation}\n"
+        stepScript += "echo \\#\\!/usr/bin/env bash > ${stepScriptLocation}\n"
         stressModeVars.each{ k, v -> 
             // Write out what we are writing to the script file
             stepScript += "echo Setting ${k}=${v}\n"
             // Write out the set itself to the script file`
             stepScript += "echo export ${k}=${v} >> ${stepScriptLocation}\n"
         }
+        stepScript += "chmod +x ${stepScriptLocation}\n"
     }
     return stepScript
 }
@@ -1264,6 +1264,12 @@ combinedScenarios.each { scenario ->
                         }
                     }
                     else {
+                        // If this is a r2r jitstress, jitstressregs, jitminopts or forcerelocs scenario
+                        // and configuration is not Checked, bail out.
+                        if (configuration != 'Checked' && Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
+                            return;
+                        }
+
                         // Skip scenarios
                         switch (scenario) {
                             case 'pri1':
@@ -1405,7 +1411,7 @@ combinedScenarios.each { scenario ->
                                     // binaries are sent to a default directory whose name is about
                                     // 35 characters long.
 
-                                    else if (scenario == 'pri1' || scenario == 'pri1r2r' || scenario == 'coverage') {
+                                    else if (scenario == 'pri1' || scenario == 'pri1r2r' || scenario == 'gcstress15_pri1r2r'|| scenario == 'coverage') {
                                         buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} Priority 1"
                                     }
                                     else if (scenario == 'ilrt') {
@@ -1413,11 +1419,6 @@ combinedScenarios.each { scenario ->
                                         buildCommands += "build.cmd ${lowerConfiguration} ${arch} skiptests"
                                         buildCommands += "set __TestIntermediateDir=int&&tests\\buildtest.cmd ${lowerConfiguration} ${arch} ilasmroundtrip"
                                     }
-                                    else if (scenario == 'gcstress15_pri1r2r') {
-                                        //Build pri1 R2R tests with GC stress level 15
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} skiptests"
-                                        buildCommands += "set __TestIntermediateDir=int&&tests\\buildtest.cmd ${lowerConfiguration} ${arch}  Priority 1 gcstresslevel 0xf"
-                                    }
                                     else if (scenario == 'longgc') {
                                         buildCommands += "build.cmd ${lowerConfiguration} ${arch} skiptests"
                                         buildCommands += "set __TestIntermediateDir=int&&tests\\buildtest.cmd ${lowerConfiguration} ${arch} longgctests"
@@ -1442,6 +1443,8 @@ combinedScenarios.each { scenario ->
                                         def runjitstressregsStr = ''
                                         def runjitmioptsStr = ''
                                         def runjitforcerelocsStr = ''
+                                        def gcstressStr = ''
+                                        def runtestArguments = ''
 
                                         if (scenario == 'r2r' ||
                                             scenario == 'pri1r2r' ||
@@ -1484,6 +1487,11 @@ combinedScenarios.each { scenario ->
                                                     runjitforcerelocsStr = 'jitforcerelocs'
                                                 }
                                         }
+                                        if (scenario == 'gcstress15_pri1r2r')
+                                        {
+                                           gcstressStr = 'gcstresslevel 0xF'
+                                        }
+                                         runtestArguments = "${lowerConfiguration} ${arch} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr}"
                                         if (Constants.jitStressModeScenarios.containsKey(scenario)) {
                                             if (enableCorefxTesting) {
                                                 // Sync to corefx repo
@@ -1504,34 +1512,34 @@ combinedScenarios.each { scenario ->
                                                 
                                                 // Run tests with the 
                                                 
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} TestEnv ${stepScriptLocation}"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} TestEnv ${stepScriptLocation}"
                                             }                                            
                                         }
                                         else if (architecture == 'x64') {
                                             if (isLongGc(scenario)) {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} longgctests sequential"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} longgctests sequential"
                                             } 
                                             else {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch}"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments}"
                                             }
                                         }                                        
                                         else if (architecture == 'x86ryujit') {
                                             def testEnvLocation = "%WORKSPACE%\\tests\\x86\\ryujit_x86_testenv.cmd"
                                             
                                             if (isLongGc(scenario)) {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} longgctests sequential TestEnv ${testEnvLocation}"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} longgctests sequential TestEnv ${testEnvLocation}"
                                             } 
                                             else {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} TestEnv ${testEnvLocation}"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} TestEnv ${testEnvLocation}"
                                             }
                                         }
 
                                         else if (architecture == 'x86lb') {
                                             if (isLongGc(scenario)) {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} longgctests sequential"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} longgctests sequential"
                                             } 
                                             else {
-                                                buildCommands += "tests\\runtest.cmd ${lowerConfiguration} ${arch} Exclude0 x86_legacy_backend_issues.targets"
+                                                buildCommands += "tests\\runtest.cmd ${runtestArguments} Exclude0 x86_legacy_backend_issues.targets"
                                             }
                                         }
                                     }
@@ -1547,8 +1555,11 @@ combinedScenarios.each { scenario ->
                                         // 10s of thousands of files around.
                                         buildCommands += "powershell -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${arch}.${configuration}', '.\\bin\\tests\\tests.zip')\"";
                                         
-                                        // For windows, pull full test results and test drops for x86/x64
-                                        Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip")
+                                        if (!Constants.jitStressModeScenarios.containsKey(scenario)) {
+                                            // For windows, pull full test results and test drops for x86/x64.
+                                            // No need to pull for stress mode scenarios (downstream builds use the default scenario)
+                                            Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip")
+                                        }
                                         
                                         if (!isBuildOnly) {
                                             if (architecture == 'x64' || !isPR) {
@@ -1711,7 +1722,7 @@ combinedScenarios.each { scenario ->
                                     }
                                     else {
                                         // Unmount previously mounted rootfs and mount the Linux ARM emulator rootfs at /opt/linux-arm-emulator-root/
-                                        buildCommands += "sudo umount /opt/linux-arm-emulator-root/; sudo mount /opt/linux-arm-emulator/platform/rootfs-t30.ext4 /opt/linux-arm-emulator-root/"
+                                        buildCommands += "if grep -qs '/opt/linux-arm-emulator-root' /proc/mounts; then sudo umount /opt/linux-arm-emulator-root; fi ; sudo mount /opt/linux-arm-emulator/platform/rootfs-t30.ext4 /opt/linux-arm-emulator-root/"
                                         // Remove old copy of coreclr and copy the latest version of coreclr
                                         // This need to be done as it is not possible to clone the repository inside the chroot jail
                                         buildCommands += "sudo rm -rf /opt/linux-arm-emulator-root/home/coreclr; sudo mkdir /opt/linux-arm-emulator-root/home/coreclr; sudo cp -R ./ /opt/linux-arm-emulator-root/home/coreclr"
@@ -1781,6 +1792,11 @@ combinedScenarios.each { scenario ->
                             return
                         }
                     }
+                    // If this is a r2r jitstress, jitstressregs, jitminopts or forcerelocs scenario
+                    // and configuration is not Checked, bail out.
+                    else if (configuration != 'Checked' && Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
+                        return;
+                    }
                     // For CentOS, we only want Checked/Release pri1 builds.
                     else if (os == 'CentOS7.1') {
                         if (scenario != 'pri1' &&
@@ -1879,7 +1895,7 @@ combinedScenarios.each { scenario ->
                     // so we didn't create a build only job for windows_nt specific to that stress mode.  Just copy
                     // from the default scenario
                     def testBuildScenario = scenario
-                    if (testBuildScenario == 'coverage' || testBuildScenario == 'pri1r2r') {
+                    if (testBuildScenario == 'coverage' || testBuildScenario == 'pri1r2r'|| testBuildScenario == 'gcstress15_pri1r2r') {
                         testBuildScenario = 'pri1'
                     }
                     else if ( testBuildScenario == 'r2r'){
@@ -1916,6 +1932,7 @@ combinedScenarios.each { scenario ->
                     def runjitstressregsStr = ''
                     def runjitmioptsStr = ''
                     def runjitforcerelocsStr = ''
+                    def gcstressStr = ''
 
                     if (scenario == 'r2r' ||
                         scenario == 'pri1r2r' ||
@@ -1958,6 +1975,10 @@ combinedScenarios.each { scenario ->
                                 runjitforcerelocsStr = '--jitforcerelocs'
                             }
                     }
+                    if  (scenario == 'gcstress15_pri1r2r')
+                    {
+                        gcstressStr = '--gcstresslevel=0xF'
+                    }
 
                     if (isLongGc(scenario)) {
                         // Long GC tests behave very poorly when they are not
@@ -2116,7 +2137,7 @@ combinedScenarios.each { scenario ->
                 --mscorlibDir=\"\${WORKSPACE}/bin/Product/${osGroup}.${architecture}.${configuration}\" \\
                 --coreFxBinDir=\"\${WORKSPACE}/bin/${osGroup}.AnyCPU.Release;\${WORKSPACE}/bin/Unix.AnyCPU.Release;\${WORKSPACE}/bin/AnyOS.AnyCPU.Release\" \\
                 --coreFxNativeBinDir=\"\${WORKSPACE}/bin/${osGroup}.${architecture}.Release\" \\
-                ${testEnvOpt} ${serverGCString} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${sequentialString} ${playlistString}""")
+                ${testEnvOpt} ${serverGCString} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${sequentialString} ${playlistString}""")
                             }
                         }
                     }
index 2d45d6b..ff5bc80 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'rhel'" Include="rhel/Microsoft.NETCore.ILAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.ILAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'debian'" Include="debian/Microsoft.NETCore.ILAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'fedora.23-x64'" Include="fedora/23/Microsoft.NETCore.ILAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'ubuntu'" Include="ubuntu/Microsoft.NETCore.ILAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'opensuse.13.2-x64'" Include="opensuse/13.2/Microsoft.NETCore.ILAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and $(DistroRid.StartsWith('rhel.7'))" Include="rhel/Microsoft.NETCore.ILAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.14.04-x64'" Include="ubuntu/14.04/Microsoft.NETCore.ILAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.16.04-x64'" Include="ubuntu/16.04/Microsoft.NETCore.ILAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
index f635d19..c31aec4 100644 (file)
     <ProjectReference Include="win\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>arm</Platform>
     </ProjectReference>
+    <ProjectReference Include="debian\Microsoft.NETCore.ILAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="fedora\23\Microsoft.NETCore.ILAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="opensuse\13.2\Microsoft.NETCore.ILAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
     <ProjectReference Include="rhel\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="debian\Microsoft.NETCore.ILAsm.pkgproj">
+    <ProjectReference Include="ubuntu\14.04\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="osx\Microsoft.NETCore.ILAsm.pkgproj">
+    <ProjectReference Include="ubuntu\16.04\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="ubuntu\Microsoft.NETCore.ILAsm.pkgproj">
+    <ProjectReference Include="osx\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
   </ItemGroup>
diff --git a/src/.nuget/Microsoft.NETCore.ILAsm/fedora/23/Microsoft.NETCore.ILAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILAsm/fedora/23/Microsoft.NETCore.ILAsm.pkgproj
new file mode 100644 (file)
index 0000000..df59a83
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>fedora.23-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ilasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/src/.nuget/Microsoft.NETCore.ILAsm/opensuse/13.2/Microsoft.NETCore.ILAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILAsm/opensuse/13.2/Microsoft.NETCore.ILAsm.pkgproj
new file mode 100644 (file)
index 0000000..dd38e08
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>opensuse.13.2-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ilasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
@@ -26,7 +26,7 @@
     <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
-    <ArchitectureSpecificNativeSymbol Include="..\_.pdb"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
 
     <File Include="@(ArchitectureSpecificNativeSymbol)">
       <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
diff --git a/src/.nuget/Microsoft.NETCore.ILAsm/ubuntu/16.04/Microsoft.NETCore.ILAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILAsm/ubuntu/16.04/Microsoft.NETCore.ILAsm.pkgproj
new file mode 100644 (file)
index 0000000..b06cb2d
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>ubuntu.16.04-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ilasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
index dc74183..30694e9 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'rhel'" Include="rhel/Microsoft.NETCore.ILDAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.ILDAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'debian'" Include="debian/Microsoft.NETCore.ILDAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'fedora.23-x64'" Include="fedora/23/Microsoft.NETCore.ILDAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'ubuntu'" Include="ubuntu/Microsoft.NETCore.ILDAsm.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'opensuse.13.2-x64'" Include="opensuse/13.2/Microsoft.NETCore.ILDAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and $(DistroRid.StartsWith('rhel.7'))" Include="rhel/Microsoft.NETCore.ILDAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.14.04-x64'" Include="ubuntu/14.04/Microsoft.NETCore.ILDAsm.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.16.04-x64'" Include="ubuntu/16.04/Microsoft.NETCore.ILDAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
index 4df4010..42207c6 100644 (file)
     <ProjectReference Include="win\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>arm</Platform>
     </ProjectReference>
+    <ProjectReference Include="debian\Microsoft.NETCore.ILDAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="fedora\23\Microsoft.NETCore.ILDAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="opensuse\13.2\Microsoft.NETCore.ILDAsm.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
     <ProjectReference Include="rhel\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="debian\Microsoft.NETCore.ILDAsm.pkgproj">
+    <ProjectReference Include="ubuntu\14.04\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="osx\Microsoft.NETCore.ILDAsm.pkgproj">
+    <ProjectReference Include="ubuntu\16.04\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="ubuntu\Microsoft.NETCore.ILDAsm.pkgproj">
+    <ProjectReference Include="osx\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
   </ItemGroup>
diff --git a/src/.nuget/Microsoft.NETCore.ILDAsm/fedora/23/Microsoft.NETCore.ILDAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILDAsm/fedora/23/Microsoft.NETCore.ILDAsm.pkgproj
new file mode 100644 (file)
index 0000000..49bd448
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>fedora.23-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ildasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/src/.nuget/Microsoft.NETCore.ILDAsm/opensuse/13.2/Microsoft.NETCore.ILDAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILDAsm/opensuse/13.2/Microsoft.NETCore.ILDAsm.pkgproj
new file mode 100644 (file)
index 0000000..bc04cc1
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>opensuse.13.2-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ildasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
@@ -26,7 +26,7 @@
     <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
-    <ArchitectureSpecificNativeSymbol Include="..\_.pdb"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
 
     <File Include="@(ArchitectureSpecificNativeSymbol)">
       <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
diff --git a/src/.nuget/Microsoft.NETCore.ILDAsm/ubuntu/16.04/Microsoft.NETCore.ILDAsm.pkgproj b/src/.nuget/Microsoft.NETCore.ILDAsm/ubuntu/16.04/Microsoft.NETCore.ILDAsm.pkgproj
new file mode 100644 (file)
index 0000000..038b26f
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>ubuntu.16.04-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)ildasm"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
index a0a56fd..f742b49 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'rhel'" Include="rhel/Microsoft.NETCore.Jit.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.Jit.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'debian'" Include="debian/Microsoft.NETCore.Jit.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'fedora.23-x64'" Include="fedora/23/Microsoft.NETCore.Jit.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'ubuntu'" Include="ubuntu/Microsoft.NETCore.Jit.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'opensuse.13.2-x64'" Include="opensuse/13.2/Microsoft.NETCore.Jit.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and $(DistroRid.StartsWith('rhel.7'))" Include="rhel/Microsoft.NETCore.Jit.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.14.04-x64'" Include="ubuntu/14.04/Microsoft.NETCore.Jit.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.16.04-x64'" Include="ubuntu/16.04/Microsoft.NETCore.Jit.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
index 3ff2bd7..76b10fc 100644 (file)
     <ProjectReference Include="win\Microsoft.NETCore.Jit.pkgproj">
       <Platform>arm</Platform>
     </ProjectReference>
+    <ProjectReference Include="debian\Microsoft.NETCore.Jit.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="fedora\23\Microsoft.NETCore.Jit.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="opensuse\13.2\Microsoft.NETCore.Jit.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
     <ProjectReference Include="rhel\Microsoft.NETCore.Jit.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="debian\Microsoft.NETCore.Jit.pkgproj">
+    <ProjectReference Include="ubuntu\14.04\Microsoft.NETCore.Jit.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="osx\Microsoft.NETCore.Jit.pkgproj">
+    <ProjectReference Include="ubuntu\16.04\Microsoft.NETCore.Jit.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="ubuntu\Microsoft.NETCore.Jit.pkgproj">
+    <ProjectReference Include="osx\Microsoft.NETCore.Jit.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
   </ItemGroup>
diff --git a/src/.nuget/Microsoft.NETCore.Jit/fedora/23/Microsoft.NETCore.Jit.pkgproj b/src/.nuget/Microsoft.NETCore.Jit/fedora/23/Microsoft.NETCore.Jit.pkgproj
new file mode 100644 (file)
index 0000000..18d9dff
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>fedora.23-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libclrjit.so"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/src/.nuget/Microsoft.NETCore.Jit/opensuse/13.2/Microsoft.NETCore.Jit.pkgproj b/src/.nuget/Microsoft.NETCore.Jit/opensuse/13.2/Microsoft.NETCore.Jit.pkgproj
new file mode 100644 (file)
index 0000000..dfc3ba1
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>opensuse.13.2-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libclrjit.so"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
@@ -26,7 +26,7 @@
     <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
-    <ArchitectureSpecificNativeSymbol Include="..\_.pdb"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
 
     <File Include="@(ArchitectureSpecificNativeSymbol)">
       <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
diff --git a/src/.nuget/Microsoft.NETCore.Jit/ubuntu/16.04/Microsoft.NETCore.Jit.pkgproj b/src/.nuget/Microsoft.NETCore.Jit/ubuntu/16.04/Microsoft.NETCore.Jit.pkgproj
new file mode 100644 (file)
index 0000000..d3d36bf
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>ubuntu.16.04-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libclrjit.so"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
index 93757aa..fe468ec 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
 
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'rhel'" Include="rhel/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'debian'" Include="debian/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'fedora.23-x64'" Include="fedora/23/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
-    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroName)' == 'ubuntu'" Include="ubuntu/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'opensuse.13.2-x64'" Include="opensuse/13.2/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and $(DistroRid.StartsWith('rhel.7'))" Include="rhel/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.14.04-x64'" Include="ubuntu/14.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <OSGroup>Linux</OSGroup>
+      <Platform>amd64</Platform>
+    </Project>
+    <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'ubuntu.16.04-x64'" Include="ubuntu/16.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
     </Project>
index 11d593f..1d233b1 100644 (file)
     <ProjectReference Include="win\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>arm</Platform>
     </ProjectReference>
+    <ProjectReference Include="debian\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="fedora\23\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
+    <ProjectReference Include="opensuse\13.2\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <Platform>amd64</Platform>
+    </ProjectReference>
     <ProjectReference Include="rhel\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="debian\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <ProjectReference Include="ubuntu\14.04\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="osx\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <ProjectReference Include="ubuntu\16.04\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
-    <ProjectReference Include="ubuntu\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+    <ProjectReference Include="osx\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
   </ItemGroup>
diff --git a/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/fedora/23/Microsoft.NETCore.Runtime.CoreCLR.pkgproj b/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/fedora/23/Microsoft.NETCore.Runtime.CoreCLR.pkgproj
new file mode 100644 (file)
index 0000000..c56905a
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>fedora.23-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclr.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclrtraceptprovider.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libdbgshim.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordaccore.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordbi.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsos.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsosplugin.so"/>
+    <NativeSplittableBinary Include="$(BinDir)System.Globalization.Native.so"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)sosdocsunix.txt"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)mscorlib.ni.dll"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)System.Private.CoreLib.ni.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)System.Private.CoreLib.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)mscorlib.dll"/>
+    <ArchitectureSpecificToolFile Include="$(BinDir)crossgen"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+
+    <!-- Using lib/netstandard1.0 here.  There is no TFM for this since it is a runtime itself. -->
+    <File Include="@(ArchitectureSpecificLibFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/lib/netstandard1.0</TargetPath>
+    </File>
+
+    <!-- No reference: don't permit reference to the implementation from lib -->
+    <File Include="$(PlaceholderFile)">
+      <TargetPath>ref/netstandard1.0</TargetPath>
+    </File>
+
+    <File Include="@(ArchitectureSpecificToolFile)">
+      <TargetPath>tools</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\sosdocsunix.txt"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\crossgen"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/opensuse/13.2/Microsoft.NETCore.Runtime.CoreCLR.pkgproj b/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/opensuse/13.2/Microsoft.NETCore.Runtime.CoreCLR.pkgproj
new file mode 100644 (file)
index 0000000..227639d
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>opensuse.13.2-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclr.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclrtraceptprovider.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libdbgshim.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordaccore.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordbi.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsos.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsosplugin.so"/>
+    <NativeSplittableBinary Include="$(BinDir)System.Globalization.Native.so"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)sosdocsunix.txt"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)mscorlib.ni.dll"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)System.Private.CoreLib.ni.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)System.Private.CoreLib.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)mscorlib.dll"/>
+    <ArchitectureSpecificToolFile Include="$(BinDir)crossgen"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+
+    <!-- Using lib/netstandard1.0 here.  There is no TFM for this since it is a runtime itself. -->
+    <File Include="@(ArchitectureSpecificLibFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/lib/netstandard1.0</TargetPath>
+    </File>
+
+    <!-- No reference: don't permit reference to the implementation from lib -->
+    <File Include="$(PlaceholderFile)">
+      <TargetPath>ref/netstandard1.0</TargetPath>
+    </File>
+
+    <File Include="@(ArchitectureSpecificToolFile)">
+      <TargetPath>tools</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\sosdocsunix.txt"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\crossgen"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
@@ -55,7 +55,7 @@
     <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\sosdocsunix.txt"/>
     <AdditionalSymbolPackageExcludes Include="%2A%2A\crossgen"/>
-    <ArchitectureSpecificNativeSymbol Include="..\_.pdb"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
 
     <File Include="@(ArchitectureSpecificNativeSymbol)">
       <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
diff --git a/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/ubuntu/16.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj b/src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/ubuntu/16.04/Microsoft.NETCore.Runtime.CoreCLR.pkgproj
new file mode 100644 (file)
index 0000000..71674b2
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  
+  <PropertyGroup>
+    <Version>1.0.2</Version>
+    <SkipPackageFileCheck>true</SkipPackageFileCheck>
+    <PackageTargetRuntime>ubuntu.16.04-$(PackagePlatform)</PackageTargetRuntime>
+    <!-- only build for x64 -->
+    <PackagePlatforms>x64;</PackagePlatforms>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclr.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libcoreclrtraceptprovider.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libdbgshim.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordaccore.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libmscordbi.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsos.so"/>
+    <NativeSplittableBinary Include="$(BinDir)libsosplugin.so"/>
+    <NativeSplittableBinary Include="$(BinDir)System.Globalization.Native.so"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)sosdocsunix.txt"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)mscorlib.ni.dll"/>
+    <ArchitectureSpecificNativeFile Include="$(BinDir)System.Private.CoreLib.ni.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)System.Private.CoreLib.dll"/>
+    <ArchitectureSpecificLibFile Include="$(BinDir)mscorlib.dll"/>
+    <ArchitectureSpecificToolFile Include="$(BinDir)crossgen"/>
+
+    <ArchitectureSpecificNativeFile Include="@(NativeSplittableBinary)"/>
+
+    <File Include="@(ArchitectureSpecificNativeFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+    </File>
+
+    <!-- Using lib/netstandard1.0 here.  There is no TFM for this since it is a runtime itself. -->
+    <File Include="@(ArchitectureSpecificLibFile)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/lib/netstandard1.0</TargetPath>
+    </File>
+
+    <!-- No reference: don't permit reference to the implementation from lib -->
+    <File Include="$(PlaceholderFile)">
+      <TargetPath>ref/netstandard1.0</TargetPath>
+    </File>
+
+    <File Include="@(ArchitectureSpecificToolFile)">
+      <TargetPath>tools</TargetPath>
+    </File>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__BuildType)' == 'Release'">
+    <ArchitectureSpecificNativeSymbol Include="@(NativeSplittableBinary -> '%(Identity).dbg')"/>
+
+    <AdditionalLibPackageExcludes Include="%2A%2A\%2A.dbg"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.so"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\%2A.dll"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\sosdocsunix.txt"/>
+    <AdditionalSymbolPackageExcludes Include="%2A%2A\crossgen"/>
+    <ArchitectureSpecificNativeSymbol Include="..\..\_.pdb"/>
+
+    <File Include="@(ArchitectureSpecificNativeSymbol)">
+      <TargetPath>runtimes/$(PackageTargetRuntime)/native</TargetPath>
+      <IsSymbolFile>true</IsSymbolFile>
+    </File>
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
index c9d9d0c..9a95902 100644 (file)
@@ -14,6 +14,9 @@
     <File Include="$(BinDir)/ref/mscorlib.dll">
       <TargetPath>lib/netstandard1.0</TargetPath>
     </File>
+    <File Include="$(BinDir)/System.Private.CoreLib.dll">
+      <TargetPath>lib/netstandard1.0</TargetPath>
+    </File>    
   </ItemGroup>
 
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
diff --git a/src/.nuget/packages.builds b/src/.nuget/packages.builds
new file mode 100644 (file)
index 0000000..9134b3c
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+
+  <PropertyGroup>
+    <!-- This property must be set to the same value as $(PackageOutputPath) for the nuspecs and nupkgs to be binplaced to the intended location. -->
+    <OutputPath>$(PackageOutputPath)</OutputPath>
+  </PropertyGroup>
+
+  <ItemGroup Condition="'$(__SkipCoreLibBuild)'==''">
+    <Project Include="Microsoft.NETCore.Runtime.CoreCLR\Microsoft.NETCore.Runtime.CoreCLR.builds" /> 
+    <Project Include="Microsoft.TargetingPack.Private.CoreCLR\Microsoft.TargetingPack.Private.CoreCLR.pkgproj" /> 
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(__SkipNativeBuild)'==''">
+    <Project Include="Microsoft.NETCore.Jit\Microsoft.NETCore.Jit.builds" />     
+  </ItemGroup>
+
+  <ItemGroup>
+    <Project Include="Microsoft.NETCore.ILAsm\Microsoft.NETCore.ILAsm.builds" /> 
+    <Project Include="Microsoft.NETCore.ILDAsm\Microsoft.NETCore.ILDAsm.builds" />     
+  </ItemGroup>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.traversal.targets))\dir.traversal.targets" />
+</Project>
index d567e3c..e89043d 100644 (file)
@@ -13408,7 +13408,7 @@ Exit:
             {
                 DWORD_PTR vtAddr;
                 MOVE(vtAddr, TO_TADDR(FrameData.frameAddr));
-                if (g_sos->GetFrameName(vtAddr, 1024, wszNameBuffer, NULL) == S_OK)
+                if (g_sos->GetFrameName(TO_CDADDR(vtAddr), 1024, wszNameBuffer, NULL) == S_OK)
                     ExtDbgOut("[%ls: %08x] ", wszNameBuffer, FrameData.frameAddr);  
                 else
                     ExtDbgOut("[Frame: %08x] ", FrameData.frameAddr);
index e3fac08..fc728ad 100644 (file)
@@ -6467,7 +6467,7 @@ WString GetFrameFromAddress(TADDR frameAddr, IXCLRDataStackWalk *pStackWalk, BOO
     WString frameOutput;
     frameOutput += W("[");
 
-    if (SUCCEEDED(g_sos->GetFrameName(vtAddr, mdNameLen, g_mdName, NULL)))
+    if (SUCCEEDED(g_sos->GetFrameName(TO_CDADDR(vtAddr), mdNameLen, g_mdName, NULL)))
         frameOutput += g_mdName;
     else
         frameOutput += W("Frame");
index a1982eb..517eac9 100644 (file)
@@ -50,7 +50,9 @@ BOOL IsCompilationProcess();
 #include "clrprivbindercoreclr.h"
 #include "clrprivbinderassemblyloadcontext.h"
 // Helper function in the VM, invoked by the Binder, to invoke the host assembly resolver
-extern HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToBindWithin, IAssemblyName *pIAssemblyName, ICLRPrivAssembly **ppLoadedAssembly);
+extern HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToBindWithin, 
+                                                IAssemblyName *pIAssemblyName, CLRPrivBinderCoreCLR *pTPABinder,
+                                                BINDER_SPACE::AssemblyName *pAssemblyName, ICLRPrivAssembly **ppLoadedAssembly);
 
 // Helper to check if we have a host assembly resolver set
 extern BOOL RuntimeCanUseAppPathAssemblyResolver(DWORD adid);
@@ -1814,6 +1816,7 @@ namespace BINDER_SPACE
 HRESULT AssemblyBinder::BindUsingHostAssemblyResolver (/* in */ INT_PTR pManagedAssemblyLoadContextToBindWithin,
                                                        /* in */ AssemblyName       *pAssemblyName,
                                                       /* in */ IAssemblyName      *pIAssemblyName,
+                                                      /* in */ CLRPrivBinderCoreCLR *pTPABinder,
                                                       /* out */ Assembly           **ppAssembly)
 {
     HRESULT hr = E_FAIL;
@@ -1821,9 +1824,10 @@ HRESULT AssemblyBinder::BindUsingHostAssemblyResolver (/* in */ INT_PTR pManaged
     
     _ASSERTE(pManagedAssemblyLoadContextToBindWithin != NULL);
     
-    // Call into the VM to use the HostAssemblyResolver and load the assembly
+    // RuntimeInvokeHostAssemblyResolver will perform steps 2-4 of CLRPrivBinderAssemblyLoadContext::BindAssemblyByName.
     ICLRPrivAssembly *pLoadedAssembly = NULL;
-    hr = RuntimeInvokeHostAssemblyResolver(pManagedAssemblyLoadContextToBindWithin, pIAssemblyName, &pLoadedAssembly);
+    hr = RuntimeInvokeHostAssemblyResolver(pManagedAssemblyLoadContextToBindWithin, pIAssemblyName, 
+                                           pTPABinder, pAssemblyName, &pLoadedAssembly);
     if (SUCCEEDED(hr))
     {
         _ASSERTE(pLoadedAssembly != NULL);
index 57f4ee7..8f3a3ee 100644 (file)
@@ -61,14 +61,19 @@ HRESULT CLRPrivBinderAssemblyLoadContext::BindAssemblyByName(IAssemblyName     *
         SAFE_NEW(pAssemblyName, AssemblyName);
         IF_FAIL_GO(pAssemblyName->Init(pIAssemblyName));
         
-        // Check if the assembly is in the TPA list or not. Don't search app paths when using the TPA binder because the actual
-        // binder is using a host assembly resolver.
-        hr = m_pTPABinder->BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly, true /* excludeAppPaths */);
-        if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
+        // When LoadContext needs to resolve an assembly reference, it will go through the following lookup order:
+        //
+        // 1) Lookup the assembly within the LoadContext itself. If assembly is found, use it.
+        // 2) Invoke the LoadContext's Load method implementation. If assembly is found, use it.
+        // 3) Lookup the assembly within TPABinder. If assembly is found, use it.
+        // 4) Invoke the LoadContext's Resolving event. If assembly is found, use it.
+        // 5) Raise exception.
+        //
+        // This approach enables a LoadContext to override assemblies that have been loaded in TPA context by loading
+        // a different (or even the same!) version.
+        
         {
-            // If we could not find the assembly in the TPA list,
-            // then bind to it in the context of the current binder.
-            // If we find it already loaded, we will return the reference.
+            // Step 1 - Try to find the assembly within the LoadContext.
             hr = BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly);
             if ((hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) ||
                 (hr == FUSION_E_APP_DOMAIN_LOCKED) || (hr == FUSION_E_REF_DEF_MISMATCH))
@@ -82,7 +87,8 @@ HRESULT CLRPrivBinderAssemblyLoadContext::BindAssemblyByName(IAssemblyName     *
                 // Thus, if default binder has been overridden, then invoke it in an attempt to perform the binding for it make the call
                 // of what to do next. The host-overridden binder can either fail the bind or return reference to an existing assembly
                 // that has been loaded.
-                hr = AssemblyBinder::BindUsingHostAssemblyResolver(GetManagedAssemblyLoadContext(), pAssemblyName, pIAssemblyName, &pCoreCLRFoundAssembly);
+                //
+                hr = AssemblyBinder::BindUsingHostAssemblyResolver(GetManagedAssemblyLoadContext(), pAssemblyName, pIAssemblyName, m_pTPABinder, &pCoreCLRFoundAssembly);
                 if (SUCCEEDED(hr))
                 {
                     // We maybe returned an assembly that was bound to a different AssemblyLoadContext instance.
@@ -142,41 +148,19 @@ HRESULT CLRPrivBinderAssemblyLoadContext::BindUsingPEImage( /* in */ PEImage *pP
             IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_BAD_FORMAT));
         }
         
-        // Ensure we are not being asked to bind to a TPA assembly
-        //
-        // Easy out for mscorlib
+        // Disallow attempt to bind to the core library. Aside from that,
+        // the LoadContext can load any assembly (even if it was in a different LoadContext like TPA).
         if (pAssemblyName->IsMscorlib())
         {
             IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
         }
 
+        hr = AssemblyBinder::BindUsingPEImage(&m_appContext, pAssemblyName, pPEImage, PeKind, pIMetaDataAssemblyImport, &pCoreCLRFoundAssembly);
+        if (hr == S_OK)
         {
-            SString& simpleName = pAssemblyName->GetSimpleName();
-            ApplicationContext *pTPAApplicationContext = m_pTPABinder->GetAppContext();
-            SimpleNameToFileNameMap * tpaMap = pTPAApplicationContext->GetTpaList();
-            if (tpaMap->LookupPtr(simpleName.GetUnicode()) != NULL)
-            {
-                // The simple name of the assembly being requested to be bound was found in the TPA list.
-                // Now, perform the actual bind to see if the assembly was really in the TPA assembly or not.
-                // Don't search app paths when using the TPA binder because the actual binder is using a host assembly resolver.
-                hr = m_pTPABinder->BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly, true /* excludeAppPaths */);
-                if (SUCCEEDED(hr))
-                {
-                    if (pCoreCLRFoundAssembly->GetIsInGAC())
-                    {
-                        // If we were able to bind to a TPA assembly, then fail the load
-                        IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
-                    }
-                }
-            }
-            
-            hr = AssemblyBinder::BindUsingPEImage(&m_appContext, pAssemblyName, pPEImage, PeKind, pIMetaDataAssemblyImport, &pCoreCLRFoundAssembly);
-            if (hr == S_OK)
-            {
-                _ASSERTE(pCoreCLRFoundAssembly != NULL);
-                pCoreCLRFoundAssembly->SetBinder(this);
-                *ppAssembly = pCoreCLRFoundAssembly.Extract();
-            }
+            _ASSERTE(pCoreCLRFoundAssembly != NULL);
+            pCoreCLRFoundAssembly->SetBinder(this);
+            *ppAssembly = pCoreCLRFoundAssembly.Extract();
         }
 Exit:;        
     }
index a2fb1c8..d62af86 100644 (file)
@@ -80,7 +80,8 @@ HRESULT CLRPrivBinderCoreCLR::BindAssemblyByName(IAssemblyName     *pIAssemblyNa
             INT_PTR pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
             if (pManagedAssemblyLoadContext != NULL)
             {
-              hr = AssemblyBinder::BindUsingHostAssemblyResolver(pManagedAssemblyLoadContext, pAssemblyName, pIAssemblyName, &pCoreCLRFoundAssembly);
+              hr = AssemblyBinder::BindUsingHostAssemblyResolver(pManagedAssemblyLoadContext, pAssemblyName, pIAssemblyName, 
+              NULL, &pCoreCLRFoundAssembly);
               if (SUCCEEDED(hr))
               {
                   // We maybe returned an assembly that was bound to a different AssemblyLoadContext instance.
index 87d6491..3a1f1e4 100644 (file)
@@ -78,6 +78,7 @@ namespace BINDER_SPACE
         static HRESULT BindUsingHostAssemblyResolver (/* in */ INT_PTR pManagedAssemblyLoadContextToBindWithin,
                                                       /* in */ AssemblyName       *pAssemblyName,
                                                       /* in */ IAssemblyName      *pIAssemblyName,
+                                                      /* in */ CLRPrivBinderCoreCLR *pTPABinder,
                                                       /* out */ Assembly           **ppAssembly);
                                                       
         static HRESULT BindUsingPEImage(/* in */  ApplicationContext *pApplicationContext,
index f752339..46be714 100644 (file)
@@ -342,49 +342,6 @@ FCIMPL5(INT32, COMString::CompareOrdinalEx, StringObject* strA, INT32 indexA, St
 }
 FCIMPLEND
 
-/*=================================IndexOfChar==================================
-**Action:
-**Returns:
-**Arguments:
-**Exceptions:
-==============================================================================*/
-
-FCIMPL4 (INT32, COMString::IndexOfChar, StringObject* thisRef, CLR_CHAR value, INT32 startIndex, INT32 count )
-{
-    FCALL_CONTRACT;
-
-    VALIDATEOBJECT(thisRef);
-    if (thisRef==NULL)
-        FCThrow(kNullReferenceException);
-
-    WCHAR *thisChars;
-    int thisLength;
-
-    thisRef->RefInterpretGetStringValuesDangerousForGC(&thisChars, &thisLength);
-
-    if (startIndex < 0 || startIndex > thisLength) {
-        FCThrowArgumentOutOfRange(W("startIndex"), W("ArgumentOutOfRange_Index"));
-    }
-
-    if (count   < 0 || count > thisLength - startIndex) {
-        FCThrowArgumentOutOfRange(W("count"), W("ArgumentOutOfRange_Count"));
-    }
-
-    int endIndex = startIndex + count;
-    for (int i=startIndex; i<endIndex; i++)
-    {
-        if (thisChars[i]==((WCHAR)value))
-        {
-            FC_GC_POLL_RET();
-            return i;
-        }
-    }
-
-    FC_GC_POLL_RET();
-    return -1;
-}
-FCIMPLEND
-
 /*===============================IndexOfCharArray===============================
 **Action:
 **Returns:
@@ -442,56 +399,6 @@ FCIMPL4(INT32, COMString::IndexOfCharArray, StringObject* thisRef, CHARArray* va
 }
 FCIMPLEND
 
-
-/*===============================LastIndexOfChar================================
-**Action:
-**Returns:
-**Arguments:
-**Exceptions:
-==============================================================================*/
-
-FCIMPL4(INT32, COMString::LastIndexOfChar, StringObject* thisRef, CLR_CHAR value, INT32 startIndex, INT32 count )
-{
-    FCALL_CONTRACT;
-
-    VALIDATEOBJECT(thisRef);
-    WCHAR *thisChars;
-    int thisLength;
-
-    if (thisRef==NULL) {
-        FCThrow(kNullReferenceException);
-    }
-
-    thisRef->RefInterpretGetStringValuesDangerousForGC(&thisChars, &thisLength);
-
-    if (thisLength == 0) {
-        FC_GC_POLL_RET();
-        return -1;
-    }
-
-
-    if (startIndex<0 || startIndex>=thisLength) {
-        FCThrowArgumentOutOfRange(W("startIndex"), W("ArgumentOutOfRange_Index"));
-    }
-
-    if (count<0 || count - 1 > startIndex) {
-        FCThrowArgumentOutOfRange(W("count"), W("ArgumentOutOfRange_Count"));
-    }
-
-    int endIndex = startIndex - count + 1;
-
-    //We search [startIndex..EndIndex]
-    for (int i=startIndex; i>=endIndex; i--) {
-        if (thisChars[i]==((WCHAR)value)) {
-            FC_GC_POLL_RET();
-            return i;
-        }
-    }
-
-    FC_GC_POLL_RET();
-    return -1;
-}
-FCIMPLEND
 /*=============================LastIndexOfCharArray=============================
 **Action:
 **Returns:
index 751391e..6d0d413 100644 (file)
@@ -61,10 +61,6 @@ public:
 
     static FCDECL5(INT32, CompareOrdinalEx, StringObject* strA, INT32 indexA, StringObject* strB, INT32 indexB, INT32 count);
 
-    static FCDECL4(INT32, IndexOfChar, StringObject* vThisRef, CLR_CHAR value, INT32 startIndex, INT32 count );
-
-    static FCDECL4(INT32, LastIndexOfChar, StringObject* thisRef, CLR_CHAR value, INT32 startIndex, INT32 count );
-
     static FCDECL4(INT32, LastIndexOfCharArray, StringObject* thisRef, CHARArray* valueRef, INT32 startIndex, INT32 count );
 
     static FCDECL4(INT32, IndexOfCharArray, StringObject* vThisRef, CHARArray* value, INT32 startIndex, INT32 count );
index 3350df9..7cb7ded 100644 (file)
@@ -3,7 +3,8 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
 include_directories("../inc")
 
 set(FLOAT_SOURCES
-    floatnative.cpp
+    floatdouble.cpp
+    floatsingle.cpp
 )
 
 if(CLR_CMAKE_PLATFORM_UNIX)
index 091b8a7..ef7f818 100644 (file)
@@ -28,7 +28,8 @@
   </PropertyGroup>
   <!--Leaf Project Items-->
   <ItemGroup>
-    <CppCompile Include="FloatNative.cpp" />
+    <CppCompile Include="floatdouble.cpp" />
+    <CppCompile Include="floatsingle.cpp" />
   </ItemGroup>
   <!--Import the targets-->
   <Import Project="$(_NTDRIVE)$(_NTROOT)\ndp\clr\clr.targets" />
diff --git a/src/classlibnative/float/floatdouble.cpp b/src/classlibnative/float/floatdouble.cpp
new file mode 100644 (file)
index 0000000..d9603c0
--- /dev/null
@@ -0,0 +1,280 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: FloatDouble.cpp
+//
+
+#include <common.h>
+
+#include "floatdouble.h"
+
+#define IS_DBL_INFINITY(x)         (((*((INT64*)((void*)&x))) & I64(0x7FFFFFFFFFFFFFFF)) == I64(0x7FF0000000000000))
+
+// The default compilation mode is /fp:precise, which disables floating-point intrinsics. This
+// default compilation mode has previously caused performance regressions in floating-point code.
+// We enable /fp:fast semantics for the majority of the math functions, as it will speed up performance
+// and is really unlikely to cause any other code regressions.
+
+// Sin, Cos, and Tan on AMD64 Windows were previously implemented in vm\amd64\JitHelpers_Fast.asm
+// by calling x87 floating point code (fsin, fcos, fptan) because the CRT helpers were too slow. This
+// is no longer the case and the CRT call is used on all platforms.
+
+// Log, Log10 and Exp were previously slower with /fp:fast on SSE2 enabled hardware (see #500373).
+// This is no longer the case and they now consume use the /fp:fast versions.
+
+// Exp(+/-INFINITY) did not previously return the expected results of +0.0 (for -INFINITY)
+// and +INFINITY (for +INFINITY) so these cases were handled specially. As this is no longer
+// the case and the expected results are now returned, the special handling has been removed.
+
+// Previously there was more special handling for the x86 Windows version of Pow.
+// This additional handling was unnecessary and has since been removed.
+
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+///
+///                         beginning of /fp:fast scope
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef _MSC_VER
+#pragma float_control(precise, off)
+#endif
+
+/*=====================================Abs======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Abs, double x)
+    FCALL_CONTRACT;
+
+    return (double)fabs(x);
+FCIMPLEND
+
+/*=====================================Acos=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Acos, double x)
+    FCALL_CONTRACT;
+
+    return (double)acos(x);
+FCIMPLEND
+
+/*=====================================Asin=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Asin, double x)
+    FCALL_CONTRACT;
+
+    return (double)asin(x);
+FCIMPLEND
+
+/*=====================================Atan=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Atan, double x)
+    FCALL_CONTRACT;
+
+    return (double)atan(x);
+FCIMPLEND
+
+/*=====================================Atan2====================================
+**
+==============================================================================*/
+FCIMPL2_VV(double, COMDouble::Atan2, double y, double x)
+    FCALL_CONTRACT;
+
+    // atan2(+/-INFINITY, +/-INFINITY) produces +/-0.78539816339744828 (x is +INFINITY) and
+    // +/-2.3561944901923448 (x is -INFINITY) instead of the expected value of NaN. We handle
+    // that case here ourselves.
+    if (IS_DBL_INFINITY(y) && IS_DBL_INFINITY(x)) {
+        return (double)(y / x);
+    }
+
+    return (double)atan2(y, x);
+FCIMPLEND
+
+/*====================================Ceil======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Ceil, double x)
+    FCALL_CONTRACT;
+
+    return (double)ceil(x);
+FCIMPLEND
+
+/*=====================================Cos======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Cos, double x)
+    FCALL_CONTRACT;
+
+    return (double)cos(x);
+FCIMPLEND
+
+/*=====================================Cosh=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Cosh, double x)
+    FCALL_CONTRACT;
+
+    return (double)cosh(x);
+FCIMPLEND
+
+/*=====================================Exp======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Exp, double x)
+    FCALL_CONTRACT;
+
+    return (double)exp(x);
+FCIMPLEND
+
+/*====================================Floor=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Floor, double x)
+    FCALL_CONTRACT;
+
+    return (double)floor(x);
+FCIMPLEND
+
+/*=====================================Log======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Log, double x)
+    FCALL_CONTRACT;
+
+    return (double)log(x);
+FCIMPLEND
+
+/*====================================Log10=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Log10, double x)
+    FCALL_CONTRACT;
+
+    return (double)log10(x);
+FCIMPLEND
+
+/*=====================================ModF=====================================
+**
+==============================================================================*/
+FCIMPL1(double, COMDouble::ModF, double* iptr)
+    FCALL_CONTRACT;
+
+    return (double)modf(*iptr, iptr);
+FCIMPLEND
+
+/*=====================================Pow======================================
+**
+==============================================================================*/
+FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
+    FCALL_CONTRACT;
+
+    // The CRT version of pow preserves the NaN payload of x over the NaN payload of y.
+
+    if(_isnan(y)) {
+        return y; // IEEE 754-2008: NaN payload must be preserved
+    }
+
+    if(_isnan(x)) {
+        return x; // IEEE 754-2008: NaN payload must be preserved
+    }
+
+    // The CRT version of pow does not return NaN for pow(-1.0, +/-INFINITY) and
+    // instead returns +1.0.
+
+    if(IS_DBL_INFINITY(y) && (x == -1.0)) {
+        INT64 result = CLR_NAN_64;
+        return (*((double*)((INT64*)&result)));
+    }
+
+    return (double)pow(x, y);
+FCIMPLEND
+
+/*====================================Round=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Round, double x)
+    FCALL_CONTRACT;
+
+    // If the number has no fractional part do nothing
+    // This shortcut is necessary to workaround precision loss in borderline cases on some platforms
+    if (x == (double)((INT64)x)) {
+        return x;
+    }
+
+    // We had a number that was equally close to 2 integers.
+    // We need to return the even one.
+
+    double tempVal = (x + 0.5);
+    double flrTempVal = floor(tempVal);
+
+    if ((flrTempVal == tempVal) && (fmod(tempVal, 2.0) != 0)) {
+        flrTempVal -= 1.0;
+    }
+
+    return _copysign(flrTempVal, x);
+FCIMPLEND
+
+/*=====================================Sin======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Sin, double x)
+    FCALL_CONTRACT;
+
+    return (double)sin(x);
+FCIMPLEND
+
+/*=====================================Sinh=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Sinh, double x)
+    FCALL_CONTRACT;
+
+    return (double)sinh(x);
+FCIMPLEND
+
+/*=====================================Sqrt=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Sqrt, double x)
+    FCALL_CONTRACT;
+
+    return (double)sqrt(x);
+FCIMPLEND
+
+/*=====================================Tan======================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Tan, double x)
+    FCALL_CONTRACT;
+
+    return (double)tan(x);
+FCIMPLEND
+
+/*=====================================Tanh=====================================
+**
+==============================================================================*/
+FCIMPL1_V(double, COMDouble::Tanh, double x)
+    FCALL_CONTRACT;
+
+    return (double)tanh(x);
+FCIMPLEND
+
+#ifdef _MSC_VER
+#pragma float_control(precise, on )
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+///
+///                         End of /fp:fast scope
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/classlibnative/float/floatnative.cpp b/src/classlibnative/float/floatnative.cpp
deleted file mode 100644 (file)
index a8a1afc..0000000
+++ /dev/null
@@ -1,490 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-// 
-// File: FloatNative.cpp
-// 
-
-#include <common.h>
-
-#include "floatnative.h"
-#include "floatclass.h"
-
-#define IS_DBL_INFINITY(x) ((*((UINT64 *)((void *)&x)) & UI64(0x7FFFFFFFFFFFFFFF)) == UI64(0x7FF0000000000000))
-#define IS_DBL_ONE(x)      ((*((UINT64 *)((void *)&x))) == UI64(0x3FF0000000000000))
-#define IS_DBL_NEGATIVEONE(x)      ((*((UINT64 *)((void *)&x))) == UI64(0xBFF0000000000000))
-
-
-// Default compilation mode is /fp:precise, which disables fp intrinsics. This has caused
-// regression in floating point code. I've grouped all the helpers that are really simple
-// (where /fp:fast semantics are really unlikely to cause any regression) and grouped them 
-// here in order to get back to Everett performance numbers
-
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-///
-///                         Beggining of /fp:fast scope    
-///
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-
-#ifdef _MSC_VER
-#pragma float_control(precise, off)
-#endif
-
-/*====================================Floor=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Floor, double d) 
-    FCALL_CONTRACT;
-
-    return (double) floor(d);
-FCIMPLEND
-
-
-/*====================================Ceil=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Ceil, double d) 
-    FCALL_CONTRACT;
-
-    return (double) ceil(d);
-FCIMPLEND
-
-/*=====================================Sqrt=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Sqrt, double d) 
-    FCALL_CONTRACT;
-
-    return (double) sqrt(d);
-FCIMPLEND
-
-/*=====================================Acos=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Acos, double d) 
-    FCALL_CONTRACT;
-
-    return (double) acos(d);
-FCIMPLEND
-
-
-/*=====================================Asin=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Asin, double d) 
-    FCALL_CONTRACT;
-
-    return (double) asin(d);
-FCIMPLEND
-
-
-/*=====================================AbsFlt=====================================
-**
-==============================================================================*/
-FCIMPL1_V(float, COMDouble::AbsFlt, float f) 
-    FCALL_CONTRACT;
-
-    FCUnique(0x14);
-
-    return fabsf(f);
-FCIMPLEND
-
-/*=====================================AbsDbl=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::AbsDbl, double d) 
-    FCALL_CONTRACT;
-
-    return fabs(d);
-FCIMPLEND
-
-/*=====================================Atan=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Atan, double d) 
-    FCALL_CONTRACT;
-
-    return (double) atan(d);
-FCIMPLEND
-
-/*=====================================Atan2=====================================
-**
-==============================================================================*/
-FCIMPL2_VV(double, COMDouble::Atan2, double x, double y) 
-    FCALL_CONTRACT;
-
-        // the intrinsic for Atan2 does not produce Nan for Atan2(+-inf,+-inf)
-    if (IS_DBL_INFINITY(x) && IS_DBL_INFINITY(y)) {
-        return(x / y);      // create a NaN
-    }
-    return (double) atan2(x, y);
-FCIMPLEND
-
-// COMDouble::Sin/Cos/Tan are all implemented in JitHelpers_Fast.asm as x87 floating
-// point for code AMD64 (on Windows) because the CRT helpers is too slow (apparently they don't
-// have a /fp:fast v ersion).
-#if !defined(_TARGET_AMD64_) || defined(FEATURE_PAL)
-
-/*=====================================Sin=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Sin, double d) 
-    FCALL_CONTRACT;
-
-    return (double) sin(d);
-FCIMPLEND
-
-/*=====================================Cos=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Cos, double d) 
-    FCALL_CONTRACT;
-
-    return (double) cos(d);
-FCIMPLEND
-
-/*=====================================Tan=====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Tan, double d) 
-    FCALL_CONTRACT;
-
-    return (double) tan(d);
-FCIMPLEND
-
-#endif // !defined(_TARGET_AMD64_) || defined(FEATURE_PAL)
-
-/*=====================================Sinh====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Sinh, double d) 
-    FCALL_CONTRACT;
-
-    return (double) sinh(d);
-FCIMPLEND
-
-/*=====================================Cosh====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Cosh, double d) 
-    FCALL_CONTRACT;
-
-    return (double) cosh(d);
-FCIMPLEND
-
-/*=====================================Tanh====================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Tanh, double d) 
-    FCALL_CONTRACT;
-
-    return (double) tanh(d);
-FCIMPLEND
-
-FCIMPL1(double, COMDouble::ModFDouble, double* pdblValue)
-    FCALL_CONTRACT;
-
-    double      dblFrac;
-    dblFrac = modf(*pdblValue, pdblValue);
-    return dblFrac;
-FCIMPLEND
-
-#ifdef _MSC_VER
-#pragma float_control(precise, on )
-#endif
-
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-///
-///                         End of /fp:fast scope    
-///
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////
-//
-// Log, Log10 and Exp are slower with /fp:fast on SSE2 enabled HW (see #500373)
-// So we'll leave them as fp precise for the moment
-
-/*=====================================Log======================================
-**This is the natural log
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Log, double d) 
-    FCALL_CONTRACT;
-
-    return (double) log(d);
-FCIMPLEND
-
-
-/*====================================Log10=====================================
-**This is log-10
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Log10, double d) 
-    FCALL_CONTRACT;
-
-    return (double) log10(d);
-FCIMPLEND
-
-
-/*=====================================Exp======================================
-**
-==============================================================================*/
-FCIMPL1_V(double, COMDouble::Exp, double x) 
-    FCALL_CONTRACT;
-
-        // The C intrinsic below does not handle +- infinity properly
-        // so we handle these specially here
-    if (IS_DBL_INFINITY(x)) {
-        if (x < 0)      
-            return(+0.0);
-        return(x);      // Must be + infinity
-    }
-    return((double) exp(x));
-FCIMPLEND
-
-#if defined(_TARGET_X86_)
-/*=====================================Pow======================================
-**This is the power function.  Simple powers are done inline, and special
-  cases are sent to the CRT via the helper. 
-==============================================================================*/
-FCIMPL2_VV(double, COMDouble::PowHelperSimple, double x, double y)
-{
-    FCALL_CONTRACT;
-
-    return (double) pow(x,y);
-}
-FCIMPLEND
-
-FCIMPL2_VV(double, COMDouble::PowHelper, double x, double y) 
-{
-    FCALL_CONTRACT;
-
-    double r1;
-
-    // TODO: we can get rid following code if VC fixes pow function someday.
-    if(_isnan(y)) {
-        return y; // IEEE 754-2008: NaN payload must be preserved
-    }
-    if(_isnan(x)) {
-        return x; // IEEE 754-2008: NaN payload must be preserved
-    }
-    if(IS_DBL_INFINITY(y)) {
-        if(IS_DBL_ONE(x)) {
-            return x;        
-        }
-
-        if(IS_DBL_NEGATIVEONE(x)) {
-            *((INT64 *)(&r1)) = CLR_NAN_64;
-            return r1;
-        }    
-    }
-    
-    return (double) pow(x, y);
-}
-FCIMPLEND
-
-#if defined (_DEBUG)
-__declspec(naked) static double F_CALL_CONV PowRetail(double x, double y)
-#else
-__declspec(naked) double F_CALL_CONV COMDouble::Pow(double x, double y)
-#endif
-{
-    WRAPPER_NO_CONTRACT;
-    STATIC_CONTRACT_SO_TOLERANT;
-
-    // Arguments:
-    // exponent: esp+4
-    // base:     esp+12
-    
-    _asm
-    {
-        mov     ecx, [esp+8]           ; high dword of exponent
-        mov     edx, [esp+16]          ; high dword of base
-        
-        and     ecx,  7ff00000H        ; check for special exponent
-        cmp     ecx,  7ff00000H
-        je      callHelper
-
-        and     edx,  7ff00000H        ; check for special base
-        cmp     edx,  7ff00000H
-        je      callHelper
-
-        test    edx,  7ff00000H        ; see if the base has a zero exponent
-        jz      test_if_we_have_zero_base
-
-base_is_not_zero:
-
-        mov     cl,  [esp+19]          ; Handle negative base in the helper
-        and     cl,  80H
-        jnz     callHelper
-
-       jmp     COMDouble::PowHelperSimple      ;
-
-test_if_we_have_zero_base:
-            
-        mov     eax, [esp+16]
-        and     eax, 000fffffH
-        or      eax, [esp+12]
-        jnz     base_is_not_zero
-        ; fall through to the helper
-
-callHelper:
-
-        jmp     COMDouble::PowHelper   ; The helper will return control
-                                       ; directly to our caller.
-    }
-}
-
-#ifdef _DEBUG
-
-#define EPSILON 0.0000000001
-
-void assertDoublesWithinRange(double r1, double r2)
-{
-    WRAPPER_NO_CONTRACT;
-
-    if (_finite(r1) && _finite(r2))
-    {
-        // Both numbers are finite--we need to check that they are close to
-        // each other.  If they are large (> 1), the error could also be large,
-        // which is acceptable, so we compare the error against EPSILON*norm.
-
-        double norm = max(fabs(r1), fabs(r2));
-        double error = fabs(r1-r2);
-        
-        assert((error < (EPSILON * norm)) || (error < EPSILON));
-    }
-    else if (!_isnan(r1) && !_isnan(r2))
-    {
-        // At least one of r1 and r2 is infinite, so when multiplied by
-        // (1 + EPSILON) they should be the same infinity.
-
-        assert((r1 * (1 + EPSILON)) == (r2 * (1 + EPSILON)));
-    }
-    else
-    {
-        // Otherwise at least one of r1 or r2 is a Nan.  Is that case, they better be in
-        // the same class.
-
-        assert(_fpclass(r1) == _fpclass(r2));
-    }
-}
-
-FCIMPL2_VV(double, COMDouble::Pow, double x, double y) 
-{
-    FCALL_CONTRACT;
-
-    double r1, r2;
-
-    if(_isnan(y)) {
-        return y; // IEEE 754-2008: NaN payload must be preserved
-    }
-    if(_isnan(x)) {
-        return x; // IEEE 754-2008: NaN payload must be preserved
-    }
-
-    if(IS_DBL_INFINITY(y)) {
-        if(IS_DBL_ONE(x)) {
-            return x;        
-        }
-
-        if(IS_DBL_NEGATIVEONE(x)) {
-            *((INT64 *)(&r1)) = CLR_NAN_64;
-            return r1;
-        }    
-    }  
-
-    // Note that PowRetail expects the argument order to be reversed
-    
-    r1 = (double) PowRetail(y, x);
-    
-    r2 = (double) pow(x, y);
-
-    // Can't do a floating point compare in case r1 and r2 aren't 
-    // valid fp numbers.
-
-    assertDoublesWithinRange(r1, r2);
-
-    return (double) r1; 
-}
-FCIMPLEND
-
-#endif  // _DEBUG
-
-#else   // !defined(_TARGET_X86_)
-FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
-{
-    FCALL_CONTRACT;
-
-    double r1;
-
-    if(_isnan(y)) {
-        return y; // IEEE 754-2008: NaN payload must be preserved
-    }
-    if(_isnan(x)) {
-        return x; // IEEE 754-2008: NaN payload must be preserved
-    }
-
-    if(IS_DBL_INFINITY(y)) {
-        if(IS_DBL_ONE(x)) {
-            return x;        
-        }
-
-        if(IS_DBL_NEGATIVEONE(x)) {
-            *((INT64 *)(&r1)) = CLR_NAN_64;
-            return r1;
-        }    
-    }
-    
-    return (double) pow(x, y);
-}
-FCIMPLEND
-
-#endif  // defined(_TARGET_X86_)
-
-
-/*====================================Round=====================================
-**
-==============================================================================*/
-#if defined(_TARGET_X86_)
-__declspec(naked)
-double __fastcall COMDouble::Round(double d)
-{
-    LIMITED_METHOD_CONTRACT;
-
-    __asm {
-        fld QWORD PTR [ESP+4]
-        frndint
-        ret 8
-    }
-}
-
-#else // !defined(_TARGET_X86_)
-FCIMPL1_V(double, COMDouble::Round, double d) 
-    FCALL_CONTRACT;
-
-    double tempVal;
-    double flrTempVal;
-    // If the number has no fractional part do nothing
-    // This shortcut is necessary to workaround precision loss in borderline cases on some platforms
-    if ( d == (double)(__int64)d )
-        return d;
-    tempVal = (d+0.5);
-    //We had a number that was equally close to 2 integers. 
-    //We need to return the even one.
-    flrTempVal = floor(tempVal);
-    if (flrTempVal==tempVal) {
-        if (0 != fmod(tempVal, 2.0)) {
-            flrTempVal -= 1.0;
-        }
-    }
-    flrTempVal = _copysign(flrTempVal, d);
-    return flrTempVal;
-FCIMPLEND
-#endif // defined(_TARGET_X86_)
-
-
diff --git a/src/classlibnative/float/floatnative.h b/src/classlibnative/float/floatnative.h
deleted file mode 100644 (file)
index a2fe17a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// File: FloatNative.h
-// 
-
-#ifndef _FLOATNATIVE_H
-#define _FLOATNATIVE_H
-
-// Removed due to compiler bug
-//
-// _CRTIMP double __cdecl floor(double);
-// _CRTIMP double __cdecl ceil(double);
-
-double __cdecl sqrt(double);
-double __cdecl log(double);
-double __cdecl log10(double);
-double __cdecl exp(double);
-double __cdecl pow(double, double);
-double __cdecl acos(double);
-double __cdecl asin(double);
-double __cdecl atan(double);
-double __cdecl atan2(double,double);
-double __cdecl cos(double);
-double __cdecl sin(double);
-double __cdecl tan(double);
-double __cdecl cosh(double);
-double __cdecl sinh(double);
-double __cdecl tanh(double);
-double __cdecl fmod(double, double);
-
-#endif  // _FLOATNATIVE_H
diff --git a/src/classlibnative/float/floatsingle.cpp b/src/classlibnative/float/floatsingle.cpp
new file mode 100644 (file)
index 0000000..dd1bb43
--- /dev/null
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: FloatSingle.cpp
+//
+
+#include <common.h>
+
+#include "floatsingle.h"
+
+#define IS_FLT_INFINITY(x)         (((*((INT32*)((void*)&x))) & 0x7FFFFFFF) == 0x7F800000)
+
+// The default compilation mode is /fp:precise, which disables floating-point intrinsics. This
+// default compilation mode has previously caused performance regressions in floating-point code.
+// We enable /fp:fast semantics for the majority of the math functions, as it will speed up performance
+// and is really unlikely to cause any other code regressions.
+
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+///
+///                         beginning of /fp:fast scope
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef _MSC_VER
+#pragma float_control(precise, off)
+#endif
+
+/*=====================================Abs=====================================
+**
+==============================================================================*/
+FCIMPL1(float, COMSingle::Abs, float x)
+    FCALL_CONTRACT;
+
+    return (float)fabsf(x);
+FCIMPLEND
+
+#ifdef _MSC_VER
+#pragma float_control(precise, on )
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+///
+///                         End of /fp:fast scope
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/classlibnative/inc/floatclass.h b/src/classlibnative/inc/floatclass.h
deleted file mode 100644 (file)
index 831f731..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-#ifndef _FLOATCLASS_H_
-#define _FLOATCLASS_H_
-
-#include <object.h>
-#include <fcall.h>
-
-class COMDouble {
-public:
-    FCDECL1_V(static double, Floor, double d);
-    FCDECL1_V(static double, Sqrt, double d);
-    FCDECL1_V(static double, Log, double d);
-    FCDECL1_V(static double, Log10, double d);
-    FCDECL1_V(static double, Exp, double d);
-    FCDECL2_VV(static double, Pow, double x, double y);
-    FCDECL1_V(static double, Acos, double d);
-    FCDECL1_V(static double, Asin, double d);
-    FCDECL1_V(static double, Atan, double d);
-    FCDECL2_VV(static double, Atan2, double x, double y);
-    FCDECL1_V(static double, Cos, double d);
-    FCDECL1_V(static double, Sin, double d);
-    FCDECL1_V(static double, Tan, double d);
-    FCDECL1_V(static double, Cosh, double d);
-    FCDECL1_V(static double, Sinh, double d);
-    FCDECL1_V(static double, Tanh, double d);
-    FCDECL1_V(static double, Round, double d);
-    FCDECL1_V(static double, Ceil, double d);
-    FCDECL1_V(static float, AbsFlt, float f);
-    FCDECL1_V(static double, AbsDbl, double d);
-    FCDECL1(static double, ModFDouble, double* d);
-
-#if defined(_TARGET_X86_)
-//private:
-    FCDECL2_VV(static double, PowHelper, double x, double y);
-    FCDECL2_VV(static double, PowHelperSimple, double x, double y);
-#endif
-
-};
-    
-
-#endif // _FLOATCLASS_H_
diff --git a/src/classlibnative/inc/floatdouble.h b/src/classlibnative/inc/floatdouble.h
new file mode 100644 (file)
index 0000000..16403c1
--- /dev/null
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#ifndef _FLOATDOUBLE_H_
+#define _FLOATDOUBLE_H_
+
+#include <object.h>
+#include <fcall.h>
+
+class COMDouble {
+public:
+    FCDECL1_V(static double, Abs, double x);
+    FCDECL1_V(static double, Acos, double x);
+    FCDECL1_V(static double, Asin, double x);
+    FCDECL1_V(static double, Atan, double x);
+    FCDECL2_VV(static double, Atan2, double y, double x);
+    FCDECL1_V(static double, Ceil, double x);
+    FCDECL1_V(static double, Cos, double x);
+    FCDECL1_V(static double, Cosh, double x);
+    FCDECL1_V(static double, Exp, double x);
+    FCDECL1_V(static double, Floor, double x);
+    FCDECL1_V(static double, Log, double x);
+    FCDECL1_V(static double, Log10, double x);
+    FCDECL1(static double, ModF, double* iptr);
+    FCDECL2_VV(static double, Pow, double x, double y);
+    FCDECL1_V(static double, Round, double x);
+    FCDECL1_V(static double, Sin, double x);
+    FCDECL1_V(static double, Sinh, double x);
+    FCDECL1_V(static double, Sqrt, double x);
+    FCDECL1_V(static double, Tan, double x);
+    FCDECL1_V(static double, Tanh, double x);
+};
+
+#endif // _FLOATDOUBLE_H_
diff --git a/src/classlibnative/inc/floatsingle.h b/src/classlibnative/inc/floatsingle.h
new file mode 100644 (file)
index 0000000..6d123ec
--- /dev/null
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#ifndef _FLOATSINGLE_H_
+#define _FLOATSINGLE_H_
+
+#include <object.h>
+#include <fcall.h>
+
+class COMSingle {
+public:
+    FCDECL1(static float, Abs, float x);
+};
+
+#endif // _FLOATSINGLE_H_
index 1acaf4c..ad890a0 100644 (file)
@@ -260,20 +260,6 @@ int ExecuteManagedAssembly(
     // Indicates failure
     int exitCode = -1;
 
-#ifdef _ARM_
-    // LIBUNWIND-ARM has a bug of side effect with DWARF mode
-    // Ref: https://github.com/dotnet/coreclr/issues/3462
-    // This is why Fedora is disabling it by default as well.
-    // Assuming that we cannot enforce the user to set
-    // environmental variables for third party packages,
-    // we set the environmental variable of libunwind locally here.
-
-    // Without this, any exception handling will fail, so let's do this
-    // as early as possible.
-    // 0x1: DWARF / 0x2: FRAME / 0x4: EXIDX
-    putenv(const_cast<char *>("UNW_ARM_UNWIND_METHOD=6"));
-#endif // _ARM_
-
     std::string coreClrDllPath(clrFilesAbsolutePath);
     coreClrDllPath.append("/");
     coreClrDllPath.append(coreClrDll);
index 4250c7c..138127e 100644 (file)
@@ -8,11 +8,18 @@ CHECK_CXX_SOURCE_COMPILES("
     int main() { UDateFormatSymbolType e = UDAT_STANDALONE_SHORTER_WEEKDAYS; }
 " HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS)
 
+if(NOT CLR_CMAKE_PLATFORM_DARWIN)
+    set(CMAKE_REQUIRED_LIBRARIES ${ICUUC} ${ICUI18N})
+else()
+    set(CMAKE_REQUIRED_LIBRARIES ${ICUCORE})
+endif()
+
 check_symbol_exists(
     ucol_setMaxVariable
     "unicode/ucol.h"
     HAVE_SET_MAX_VARIABLE)
 
+unset(CMAKE_REQUIRED_LIBRARIES)
 unset(CMAKE_REQUIRED_INCLUDES)
 
 configure_file(
index a2304de..7b2f54d 100644 (file)
@@ -3,31 +3,14 @@
 // See the LICENSE file in the project root for more information.
 
 #include <pal.h>
-
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <limits.h>
 #include <pal_assert.h>
-
 #include "twowaypipe.h"
 
-static const char* PipeNameFormat = "/tmp/clr-debug-pipe-%d-%llu-%s";
-
-void TwoWayPipe::GetPipeName(char *name, DWORD id, const char *suffix)
-{
-    BOOL ret = GetProcessIdDisambiguationKey(id, &m_disambiguationKey);
-
-    // If GetProcessIdDisambiguationKey failed for some reason, it should set the value 
-    // to 0. We expect that anyone else making the pipe name will also fail and thus will
-    // also try to use 0 as the value.
-    _ASSERTE(ret == TRUE || m_disambiguationKey == 0);
-
-    int chars = _snprintf(name, MaxPipeNameLength, PipeNameFormat, id, m_disambiguationKey, suffix);
-    _ASSERTE(chars > 0 && chars < MaxPipeNameLength);
-}
-
 // Creates a server side of the pipe. 
 // Id is used to create pipes names and uniquely identify the pipe on the machine. 
 // true - success, false - failure (use GetLastError() for more details)
@@ -38,8 +21,8 @@ bool TwoWayPipe::CreateServer(DWORD id)
         return false;
 
     m_id = id;
-    GetPipeName(m_inPipeName, id, "in");
-    GetPipeName(m_outPipeName, id, "out");
+    PAL_GetTransportPipeName(m_inPipeName, id, "in");
+    PAL_GetTransportPipeName(m_outPipeName, id, "out");
 
     if (mkfifo(m_inPipeName, S_IRWXU) == -1)
     {
@@ -67,8 +50,8 @@ bool TwoWayPipe::Connect(DWORD id)
 
     m_id = id;
     //"in" and "out" are switched deliberately, because we're on the client
-    GetPipeName(m_inPipeName, id, "out");
-    GetPipeName(m_outPipeName, id, "in");
+    PAL_GetTransportPipeName(m_inPipeName, id, "out");
+    PAL_GetTransportPipeName(m_outPipeName, id, "in");
 
     // Pipe opening order is reversed compared to WaitForConnection()
     // in order to avaid deadlock.
@@ -207,5 +190,4 @@ void TwoWayPipe::CleanupTargetProcess()
 {
     unlink(m_inPipeName);
     unlink(m_outPipeName);
-    PAL_CleanupTargetProcess(m_id, m_disambiguationKey);
 }
index eb5e65c..8634630 100644 (file)
@@ -2113,18 +2113,9 @@ HRESULT Debugger::Startup(void)
             ShutdownTransport();
             ThrowHR(hr);
         }
-
     #ifdef FEATURE_PAL
         PAL_SetShutdownCallback(AbortTransport);
     #endif // FEATURE_PAL
-
-         bool waitForAttach = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgWaitForDebuggerAttach) != 0;
-         if (waitForAttach)
-         {
-             // Mark this process as launched by the debugger and the debugger as attached.
-             g_CORDebuggerControlFlags |= DBCF_GENERATE_DEBUG_CODE;
-             MarkDebuggerAttachedInternal();
-         }
     #endif // FEATURE_DBGIPC_TRANSPORT_VM
 
         RaiseStartupNotification();
index 402ecea..6bc0f9f 100644 (file)
@@ -81,18 +81,12 @@ private:
 
     State m_state;
 
-
 #ifdef FEATURE_PAL
 
-    static const int MaxPipeNameLength = 64;
-
-    void GetPipeName(char *name, DWORD id, const char *suffix);
-
     int m_id;                               // id that was passed to CreateServer() or Connect()
     int m_inboundPipe, m_outboundPipe;      // two one sided pipes used for communication
-    UINT64 m_disambiguationKey;             // key to make the names more unique
-    char m_inPipeName[MaxPipeNameLength];   // filename of the inbound pipe
-    char m_outPipeName[MaxPipeNameLength];  // filename of the outbound pipe
+    char m_inPipeName[MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH];   // filename of the inbound pipe
+    char m_outPipeName[MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH];  // filename of the outbound pipe
 
 #else
     // Connects to a one sided pipe previously created by CreateOneWayPipe.
index 078a7ef..14b509a 100644 (file)
@@ -130,6 +130,11 @@ HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumer
     m_hSessionOpenEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
     if (m_hSessionOpenEvent == NULL)
         return E_OUTOFMEMORY;
+#else // RIGHT_SIDE_COMPILE
+    DWORD pid = GetCurrentProcessId(); 
+    if (!m_pipe.CreateServer(pid)) {
+        return E_OUTOFMEMORY;
+    }
 #endif // RIGHT_SIDE_COMPILE
 
     // Allocate some buffers to receive incoming events. The initial number is chosen arbitrarily, tune as
@@ -1345,7 +1350,8 @@ void DbgTransportSession::TransportWorker()
         else
         {
             DWORD pid = GetCurrentProcessId(); 
-            if (m_pipe.CreateServer(pid) && m_pipe.WaitForConnection())
+            if ((m_pipe.GetState() == TwoWayPipe::Created || m_pipe.CreateServer(pid)) && 
+                 m_pipe.WaitForConnection())
             {
                 eStatus = SCS_Success;
             }
index bac0c7e..faa7ea1 100644 (file)
@@ -2,7 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-#define FX_VER_FILEDESCRIPTION_STR "Microsoft .NET Runtime Common Language Runtime - WorkStation\0"
+#define FX_VER_FILEDESCRIPTION_STR "Microsoft .NET Runtime\0"
 
 #include <fxver.h>
 #include <fxver.rc>
index 1798cde..1b4b7b7 100644 (file)
@@ -119,7 +119,7 @@ public:
     enum  GCStressFlags {
         GCSTRESS_NONE = 0,
         GCSTRESS_ALLOC = 1,    // GC on all allocs and 'easy' places
-        GCSTRESS_TRANSITION = 2,    // GC on transitions to preemtive GC
+        GCSTRESS_TRANSITION = 2,    // GC on transitions to preemptive GC
         GCSTRESS_INSTR_JIT = 4,    // GC on every allowable JITed instr
         GCSTRESS_INSTR_NGEN = 8,    // GC on every allowable NGEN instr
         GCSTRESS_UNIQUE = 16,   // GC only on a unique stack trace
index f9c6ba9..34ec799 100644 (file)
@@ -24,6 +24,11 @@ set(ILASM_SOURCES
   assembler.cpp
   prebuilt/asmparse.c
 )
+if(WIN32)
+  set(ILASM_RESOURCES Native.rc)
+  add_definitions(-DFX_VER_INTERNALNAME_STR=ilasm.exe)
+endif(WIN32)
+
 set_source_files_properties( prebuilt/asmparse.c PROPERTIES LANGUAGE CXX )
 
 if(CLR_CMAKE_PLATFORM_UNIX)
@@ -40,6 +45,7 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 
 _add_executable(ilasm
   ${ILASM_SOURCES}
+  ${ILASM_RESOURCES}
 )
 
 set(ILASM_LINK_LIBRARIES
index 932c385..87cdd23 100644 (file)
@@ -17,6 +17,9 @@ if(CLR_CMAKE_PLATFORM_UNIX)
     set(ILDASM_RESOURCES
         ${TARGET_CPP_FILE}
     )
+else()
+    set(ILDASM_RESOURCES ../dasm.rc)
+    add_definitions(-DFX_VER_INTERNALNAME_STR=ildasm.exe)
 endif(CLR_CMAKE_PLATFORM_UNIX)
 
 set(ILDASM_SOURCES
index 93da34c..5fb49da 100644 (file)
@@ -8,6 +8,8 @@ add_definitions(-D__ILDASM__)
 add_definitions(-DFEATURE_CORECLR)
 add_definitions(-DFX_VFT=VFT_DLL)
 
+add_definitions(-DFX_VER_INTERNALNAME_STR=ildasmrc.dll)
+
 set(ILDASM_RESOURCES
     ../dasm.rc
 )
index a673f36..19b9fa7 100644 (file)
@@ -249,7 +249,6 @@ CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_DbgTransportLog, W("DbgTransportLog"),
 CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_DbgTransportLogClass, W("DbgTransportLogClass"), "mask to control what is logged in DbgTransportLog")
 RETAIL_CONFIG_STRING_INFO_EX(UNSUPPORTED_DbgTransportProxyAddress, W("DbgTransportProxyAddress"), "allows specifying the transport proxy address", CLRConfig::REGUTIL_default)
 CONFIG_DWORD_INFO_EX(INTERNAL_DbgTrapOnSkip, W("DbgTrapOnSkip"), 0, "allows breaking when we skip a breakpoint", CLRConfig::REGUTIL_default)
-RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_DbgWaitForDebuggerAttach, W("DbgWaitForDebuggerAttach"), 0, "Makes CoreCLR wait for a managed debugger to attach on process start (1) or regular process start (0)")
 CONFIG_DWORD_INFO_EX(INTERNAL_DbgWaitTimeout, W("DbgWaitTimeout"), 1, "specifies the timeout value for waits", CLRConfig::REGUTIL_default)
 RETAIL_CONFIG_DWORD_INFO_EX(UNSUPPORTED_DbgWFDETimeout, W("DbgWFDETimeout"), 25, "specifies the timeout value for wait when waiting for a debug event", CLRConfig::REGUTIL_default)
 CONFIG_DWORD_INFO_EX(INTERNAL_RaiseExceptionOnAssert, W("RaiseExceptionOnAssert"), 0, "Raise a first chance (if set to 1) or second chance (if set to 2) exception on asserts.", CLRConfig::REGUTIL_default)
index b7d9a2d..3e6644d 100644 (file)
@@ -8,11 +8,17 @@
 #ifndef __new__hpp
 #define __new__hpp
 
+#if defined(_MSC_VER) && _MSC_VER < 1900
+#define NOEXCEPT
+#else
+#define NOEXCEPT noexcept
+#endif
+
 struct NoThrow { int x; };
 extern const NoThrow nothrow;
 
-void * __cdecl operator new(size_t n, const NoThrow&);
-void * __cdecl operator new[](size_t n, const NoThrow&);
+void * __cdecl operator new(size_t n, const NoThrow&) NOEXCEPT;
+void * __cdecl operator new[](size_t n, const NoThrow&) NOEXCEPT;
 
 #ifdef _DEBUG
 void DisableThrowCheck();
index 71879cd..0fa1a14 100644 (file)
@@ -229,6 +229,7 @@ enum ReadyToRunHelper
     READYTORUN_HELPER_Unbox                     = 0x5A,
     READYTORUN_HELPER_Unbox_Nullable            = 0x5B,
     READYTORUN_HELPER_NewMultiDimArr            = 0x5C,
+    READYTORUN_HELPER_NewMultiDimArr_NonVarArg  = 0x5D,
 
     // Helpers used with generic handle lookup cases
     READYTORUN_HELPER_NewObject                 = 0x60,
index c9c4292..4524e1a 100644 (file)
@@ -41,6 +41,7 @@ HELPER(READYTORUN_HELPER_Box_Nullable,              CORINFO_HELP_BOX_NULLABLE,
 HELPER(READYTORUN_HELPER_Unbox,                     CORINFO_HELP_UNBOX,                             )
 HELPER(READYTORUN_HELPER_Unbox_Nullable,            CORINFO_HELP_UNBOX_NULLABLE,                    )
 HELPER(READYTORUN_HELPER_NewMultiDimArr,            CORINFO_HELP_NEW_MDARR,                         )
+HELPER(READYTORUN_HELPER_NewMultiDimArr_NonVarArg,  CORINFO_HELP_NEW_MDARR_NONVARARG,               )
 
 HELPER(READYTORUN_HELPER_NewObject,                 CORINFO_HELP_NEWFAST,                           )
 HELPER(READYTORUN_HELPER_NewArray,                  CORINFO_HELP_NEWARR_1_DIRECT,                   )
index ebc0514..993d87d 100644 (file)
@@ -29,6 +29,7 @@
 #include "winnls.h"
 #include "check.h"
 #include "safemath.h"
+#include "new.hpp"
 
 #ifdef PAL_STDCPP_COMPAT
 #include <type_traits>
@@ -62,6 +63,7 @@ const WCHAR kWatsonName2[] = W("drwtsn32");
 #define CoreLibNameLen 22
 #define CoreLibSatelliteName_A "System.Private.CoreLib.resources"
 #define CoreLibSatelliteNameLen 32
+#define LegacyCoreLibName_A "mscorlib"
 #else // !defined(FEATURE_CORECLR)
 #define CoreLibName_W W("mscorlib")
 #define CoreLibName_IL_W W("mscorlib.dll")
@@ -74,6 +76,7 @@ const WCHAR kWatsonName2[] = W("drwtsn32");
 #define CoreLibNameLen 8
 #define CoreLibSatelliteName_A "mscorlib.resources"
 #define CoreLibSatelliteNameLen 18
+#define LegacyCoreLibName_A "mscorlib"
 #endif // defined(FEATURE_CORECLR)
 
 class StringArrayList;
@@ -212,12 +215,6 @@ typedef LPSTR   LPUTF8;
 #define sizeofmember(c,m) (sizeof(((c*)0)->m))
 #endif
 
-#if defined(_MSC_VER) && _MSC_VER < 1900
-#define NOEXCEPT
-#else
-#define NOEXCEPT noexcept
-#endif
-
 //=--------------------------------------------------------------------------=
 // Prefast helpers.
 //
index f54a174..3e3bb50 100644 (file)
@@ -15,6 +15,10 @@ if (ARM_SOFTFP)
   add_definitions(-DARM_SOFTFP)
 endif (ARM_SOFTFP)
 
+if(WIN32)
+  set(JIT_RESOURCES Native.rc)
+endif(WIN32)
+
 set( JIT_SOURCES
   alloc.cpp
   assertionprop.cpp
@@ -139,40 +143,63 @@ set( SOURCES
   ${JIT_SOURCES}
   ${ARCH_SOURCES}
   ${ARCH_LEGACY_SOURCES}
+  ${JIT_RESOURCES}
 )
 
 convert_to_absolute_path(SOURCES ${SOURCES})
 
-if( WIN32 )
-
+if(WIN32)
   add_precompiled_header(jitpch.h ../jitpch.cpp SOURCES)
 
   # Create .def file containing a list of exports preceeded by
   # 'EXPORTS'.  The file "ClrJit.exports" already contains the list, so we
   # massage it into the correct format here to create "ClrJit.exports.def".
-  set(CLRJIT_EXPORTS_DEF ${CMAKE_CURRENT_BINARY_DIR}/ClrJit.exports.def)
-  set(CLRJIT_EXPORTS_DEF_TEMP ${CLRJIT_EXPORTS_DEF}.txt)
+  set(JIT_EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/ClrJit.exports.def)
+  set(JIT_EXPORTS_FILE_TEMP ${JIT_EXPORTS_FILE}.txt)
   file(READ "ClrJit.exports" exports_list)
-  file(WRITE ${CLRJIT_EXPORTS_DEF_TEMP} "LIBRARY CLRJIT\n")
-  file(APPEND ${CLRJIT_EXPORTS_DEF_TEMP} "EXPORTS\n")
-  file(APPEND ${CLRJIT_EXPORTS_DEF_TEMP} ${exports_list})
+  file(WRITE ${JIT_EXPORTS_FILE_TEMP} "LIBRARY CLRJIT\n")
+  file(APPEND ${JIT_EXPORTS_FILE_TEMP} "EXPORTS\n")
+  file(APPEND ${JIT_EXPORTS_FILE_TEMP} ${exports_list})
 
   # Copy the file only if it has changed.
   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
-    ${CLRJIT_EXPORTS_DEF_TEMP} ${CLRJIT_EXPORTS_DEF})
+    ${JIT_EXPORTS_FILE_TEMP} ${JIT_EXPORTS_FILE})
 
-  set(SHARED_LIB_SOURCES ${SOURCES} ${CLRJIT_EXPORTS_DEF})
+  set(SHARED_LIB_SOURCES ${SOURCES} ${JIT_EXPORTS_FILE})
 else()
+  set(JIT_EXPORTS_IN_FILE ${CMAKE_CURRENT_BINARY_DIR}/clrjit.exports.in)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/ClrJit.exports" jit_exports)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/ClrJit.PAL.exports" pal_exports)
+  file(WRITE ${JIT_EXPORTS_IN_FILE} ${jit_exports})
+  file(APPEND ${JIT_EXPORTS_IN_FILE} "\n")
+  file(APPEND ${JIT_EXPORTS_IN_FILE} ${pal_exports})
+
+  set(JIT_EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/clrjit.exports)
+  generate_exports_file(${JIT_EXPORTS_IN_FILE} ${JIT_EXPORTS_FILE})
+
+  if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL FreeBSD OR CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+    # This is required to force using our own PAL, not one that we are loaded with.
+    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic -Bsymbolic-functions")
+
+    set(JIT_EXPORTS_LINKER_OPTION -Wl,--version-script=${JIT_EXPORTS_FILE})
+  elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+    set(JIT_EXPORTS_LINKER_OPTION -Wl,-exported_symbols_list,${JIT_EXPORTS_FILE})
+  endif()
+
   set(SHARED_LIB_SOURCES ${SOURCES})
 endif()
 
-set(CLR_EXPORTED_SYMBOL_FILE ${CLRJIT_EXPORTS_DEF})
+add_custom_target(jit_exports DEPENDS ${JIT_EXPORTS_FILE})
 
 set(JIT_BASE_NAME clrjit)
 if (CLR_BUILD_JIT32)
   set(JIT_BASE_NAME ryujit)
 endif()
 
+if(WIN32)
+  add_definitions(-DFX_VER_INTERNALNAME_STR=${JIT_BASE_NAME}.dll)
+endif(WIN32)
+
 add_subdirectory(dll)
 add_subdirectory(crossgen)
 add_subdirectory(standalone)
diff --git a/src/jit/ClrJit.PAL.exports b/src/jit/ClrJit.PAL.exports
new file mode 100644 (file)
index 0000000..c6b4e8e
--- /dev/null
@@ -0,0 +1,3 @@
+DllMain
+PAL_RegisterModule
+PAL_UnregisterModule
index aa405a5..dcbdcfd 100644 (file)
@@ -2154,7 +2154,6 @@ void                CodeGen::instGen_Set_Reg_To_Imm(emitAttr    size,
 {
     // reg cannot be a FP register
     assert(!genIsValidFloatReg(reg));
-
     if (!compiler->opts.compReloc)
     {
         size = EA_SIZE(size);  // Strip any Reloc flags from size if we aren't doing relocs
@@ -2329,6 +2328,7 @@ void CodeGen::genCodeForDivMod(GenTreeOp* treeNode)
 }
 
 // Generate code for ADD, SUB, MUL, DIV, UDIV, AND, OR and XOR
+// This method is expected to have called genConsumeOperands() before calling it.
 void CodeGen::genCodeForBinary(GenTree* treeNode)
 {
     const genTreeOps oper = treeNode->OperGet();
@@ -2344,7 +2344,7 @@ void CodeGen::genCodeForBinary(GenTree* treeNode)
             oper == GT_AND  ||
             oper == GT_OR   || 
             oper == GT_XOR);
-        
+
     GenTreePtr op1 = treeNode->gtGetOp1();
     GenTreePtr op2 = treeNode->gtGetOp2();
     instruction ins = genGetInsForOper(treeNode->OperGet(), targetType);
@@ -2352,8 +2352,6 @@ void CodeGen::genCodeForBinary(GenTree* treeNode)
     // The arithmetic node must be sitting in a register (since it's not contained)
     noway_assert(targetReg != REG_NA);
 
-    genConsumeOperands(treeNode->AsOp());
-
     regNumber r = emit->emitInsTernary(ins, emitTypeSize(treeNode), treeNode, op1, op2);
     noway_assert(r == targetReg);
 
@@ -2454,10 +2452,12 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
 
     case GT_DIV:
     case GT_UDIV:
+        genConsumeOperands(treeNode->AsOp());
+
         if (varTypeIsFloating(targetType))
         {
             // Floating point divide never raises an exception
-            genCodeForBinary(treeNode);     
+            genCodeForBinary(treeNode);
         }
         else  // an integer divide operation
         {
@@ -2465,7 +2465,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
             emitAttr   size      = EA_ATTR(genTypeSize(genActualType(treeNode->TypeGet())));
 
             // TODO-ARM64-CQ: Optimize a divide by power of 2 as we do for AMD64
-            
+
             if (divisorOp->IsZero())
             {
                 // We unconditionally throw a divide by zero exception
@@ -2547,7 +2547,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
                         emitJumpKind jmpEqual = genJumpKindForOper(GT_EQ, CK_SIGNED);
                         genJumpToThrowHlpBlk(jmpEqual, SCK_DIV_BY_ZERO);
                     }
-                    genCodeForBinary(treeNode); 
+                    genCodeForBinary(treeNode);
                 }
             }
         }
@@ -2561,6 +2561,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
     case GT_ADD:
     case GT_SUB:
     case GT_MUL:
+        genConsumeOperands(treeNode->AsOp());
         genCodeForBinary(treeNode);
         break;
 
@@ -5491,6 +5492,10 @@ void CodeGen::genJmpMethod(GenTreePtr jmp)
 
             if (varDsc->lvIsMultiregStruct())
             {
+                if (varDsc->lvIsHfa())
+                {
+                    NYI_ARM64("CodeGen::genJmpMethod with multireg HFA arg");
+                }
                 // Restore the next register.
                 argRegNext = genMapRegArgNumToRegNum(genMapRegNumToRegArgNum(argReg, loadType) + 1, loadType);
                 loadType = compiler->getJitGCType(varDsc->lvGcLayout[1]);
@@ -6449,22 +6454,30 @@ CodeGen::genIntrinsic(GenTreePtr treeNode)
 void CodeGen::genPutArgStk(GenTreePtr treeNode)
 {
     assert(treeNode->OperGet() == GT_PUTARG_STK);
-    var_types targetType = treeNode->TypeGet();
-    emitter *emit = getEmitter();
+    var_types  targetType = treeNode->TypeGet();
+    GenTreePtr source     = treeNode->gtOp.gtOp1;
+    emitter *  emit       = getEmitter();
 
-    // Get argument offset on stack.
+    // This is the varNum for our store operations, 
+    // typically this is the varNum for the Outgoing arg space
+    // When we are generating a tail call it will be the varNum for arg0
+    unsigned  varNumOut;
+    unsigned  argOffsetMax;   // Records the maximum size of this area for assert checks
+
+    // This is the varNum for our load operations,
+    // only used when we have a multireg struct with a LclVar source
+    unsigned  varNumInp = BAD_VAR_NUM;
+    // Get argument offset to use with 'varNumOut'
     // Here we cross check that argument offset hasn't changed from lowering to codegen since
     // we are storing arg slot number in GT_PUTARG_STK node in lowering phase.
-    int argOffset = treeNode->AsPutArgStk()->gtSlotNum * TARGET_POINTER_SIZE;
+    unsigned argOffsetOut = treeNode->AsPutArgStk()->gtSlotNum * TARGET_POINTER_SIZE;
 
 #ifdef DEBUG
     fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(treeNode->AsPutArgStk()->gtCall, treeNode);
     assert(curArgTabEntry);
-    assert(argOffset == (int)curArgTabEntry->slotNum * TARGET_POINTER_SIZE);
-#endif // DEBUG
-
-    GenTreePtr data = treeNode->gtOp.gtOp1;
-    unsigned varNum;   // typically this is the varNum for the Outgoing arg space           
+    assert(argOffsetOut == (curArgTabEntry->slotNum * TARGET_POINTER_SIZE));
+#endif // DEBUG     
 
 #if FEATURE_FASTTAILCALL
     bool putInIncomingArgArea = treeNode->AsPutArgStk()->putInIncomingArgArea;
@@ -6476,7 +6489,8 @@ void CodeGen::genPutArgStk(GenTreePtr treeNode)
     // All other calls - stk arg is setup in out-going arg area.
     if (putInIncomingArgArea)
     {
-        varNum = getFirstArgWithStackSlot();
+        varNumOut    = getFirstArgWithStackSlot();
+        argOffsetMax = compiler->compArgSize;
 #if FEATURE_FASTTAILCALL
         // This must be a fast tail call.
         assert(treeNode->AsPutArgStk()->gtCall->AsCall()->IsFastTailCall());
@@ -6484,279 +6498,377 @@ void CodeGen::genPutArgStk(GenTreePtr treeNode)
         // Since it is a fast tail call, the existence of first incoming arg is guaranteed
         // because fast tail call requires that in-coming arg area of caller is >= out-going
         // arg area required for tail call.
-        LclVarDsc* varDsc = &(compiler->lvaTable[varNum]);
+        LclVarDsc* varDsc = &(compiler->lvaTable[varNumOut]);
         assert(varDsc != nullptr);
 #endif // FEATURE_FASTTAILCALL
     }
     else
     {
-        varNum = compiler->lvaOutgoingArgSpaceVar;
+        varNumOut   = compiler->lvaOutgoingArgSpaceVar;
+        argOffsetMax = compiler->lvaOutgoingArgSpaceSize;
     }
-    bool isStruct = (targetType == TYP_STRUCT) || (data->OperGet() == GT_LIST);
+    bool isStruct = (targetType == TYP_STRUCT) || (source->OperGet() == GT_LIST);
 
     if (!isStruct)   // a normal non-Struct argument
     {
         instruction storeIns  = ins_Store(targetType);  
         emitAttr    storeAttr = emitTypeSize(targetType);
 
-        // If it is contained then data must be the integer constant zero
-        if (data->isContained())
+        // If it is contained then source must be the integer constant zero
+        if (source->isContained())
         {
-            assert(data->OperGet() == GT_CNS_INT);
-            assert(data->AsIntConCommon()->IconValue() == 0);
-            emit->emitIns_S_R(storeIns, storeAttr, REG_ZR, varNum, argOffset);
+            assert(source->OperGet() == GT_CNS_INT);
+            assert(source->AsIntConCommon()->IconValue() == 0);
+            emit->emitIns_S_R(storeIns, storeAttr, REG_ZR, varNumOut, argOffsetOut);
         }
         else
         {
-            genConsumeReg(data);
-            emit->emitIns_S_R(storeIns, storeAttr, data->gtRegNum, varNum, argOffset);
+            genConsumeReg(source);
+            emit->emitIns_S_R(storeIns, storeAttr, source->gtRegNum, varNumOut, argOffsetOut);
         }
+        argOffsetOut += EA_SIZE_IN_BYTES(storeAttr);
+        assert(argOffsetOut <= argOffsetMax);  // We can't write beyound the outgoing area area
     }
-    else  // We have a TYP_STRUCT argument (it currently must be a 16-byte multi-reg struct)
+    else  // We have some kind of a struct argument
     {
-        // We will use two store instructions that each write a register sized value
+        assert(source->isContained());    // We expect that this node was marked as contained in LowerArm64
 
-        // We must have a multi-reg struct that takes two slots
-        assert(curArgTabEntry->numSlots == 2);
-        assert(data->isContained());    // We expect that this node was marked as contained in LowerArm64
+        if (source->OperGet() == GT_LIST)
+        {
+            // Deal with the multi register passed struct args.
+            GenTreeArgList* argListPtr = source->AsArgList();
 
-        regNumber loReg = REG_NA;
-        regNumber hiReg = REG_NA;
+            // Evaluate each of the GT_LIST items into their register
+            // and store their register into the outgoing argument area
+            for (; argListPtr != nullptr; argListPtr = argListPtr->Rest())
+            {
+                GenTreePtr nextArgNode = argListPtr->gtOp.gtOp1;
+                genConsumeReg(nextArgNode);
 
-        if (data->OperGet() != GT_LIST)
-        {
-            // In lowerArm64 we reserved two internal integer registers for this 16-byte TYP_STRUCT
-            genGetRegPairFromMask(treeNode->gtRsvdRegs, &loReg, &hiReg);
+                regNumber reg  = nextArgNode->gtRegNum;
+                var_types type = nextArgNode->TypeGet();
+                emitAttr  attr = emitTypeSize(type);
+
+                // Emit store instructions to store the registers produced by the GT_LIST into the outgoing argument area
+                emit->emitIns_S_R(ins_Store(type), attr, reg, varNumOut, argOffsetOut);
+                argOffsetOut += EA_SIZE_IN_BYTES(attr);
+                assert(argOffsetOut <= argOffsetMax);  // We can't write beyound the outgoing area area
+            }
         }
+        else  // We must have a GT_OBJ or a GT_LCL_VAR 
+        {
+            noway_assert((source->OperGet() == GT_LCL_VAR) || (source->OperGet() == GT_OBJ));
 
-        // We will need to record the GC type used by each of the load instructions
-        //  so that we use the same type in each of the store instructions
-        var_types type0 = TYP_UNKNOWN;
-        var_types type1 = TYP_UNKNOWN;
+            var_types targetType = source->TypeGet();
+            noway_assert(varTypeIsStruct(targetType)); 
 
-        if (data->OperGet() == GT_OBJ)
-        {
-            GenTree* objNode  = data;
-            GenTree* addrNode = objNode->gtOp.gtOp1;
+            // We will copy this struct to the stack, possibly using a ldp instruction
+            // Setup loReg and hiReg from the internal registers that we reserved in lower.
+            //
+            regNumber  loReg     = REG_NA;
+            regNumber  hiReg     = REG_NA;
+            regNumber  addrReg   = REG_NA;
+            
+            // In lowerArm64/TreeNodeInfoInitPutArgStk we have reserved two internal integer registers
+            genGetRegPairFromMask(treeNode->gtRsvdRegs, &loReg, &hiReg);
 
-            if (addrNode->OperGet() == GT_LCL_VAR_ADDR)
+            GenTreeLclVarCommon*  varNode  = nullptr;
+            GenTreePtr            addrNode = nullptr;
+
+            if (source->OperGet() == GT_LCL_VAR)
             {
-                // We have a GT_OBJ(GT_LCL_VAR_ADDR)
-                //
-                // We will treat this case the same as a GT_LCL_VAR node 
-                // so update 'data' to point this GT_LCL_VAR_ADDR node
-                // and continue to the codegen for the LCL_VAR node below
+                varNode = source->AsLclVarCommon();
+            }
+            else // we must have a GT_OBJ
+            {
+                assert(source->OperGet() == GT_OBJ);
+
+                addrNode = source->gtOp.gtOp1;
+
+                // addrNode can either be a GT_LCL_VAR_ADDR or an address expression
                 //
-                data = addrNode;
+                if (addrNode->OperGet() == GT_LCL_VAR_ADDR)
+                {
+                    // We have a GT_OBJ(GT_LCL_VAR_ADDR)
+                    //
+                    // We will treat this case the same as above 
+                    // (i.e if we just had this GT_LCL_VAR directly as the source)
+                    // so update 'source' to point this GT_LCL_VAR_ADDR node
+                    // and continue to the codegen for the LCL_VAR node below
+                    //
+                    varNode  = addrNode->AsLclVarCommon();
+                    addrNode = nullptr;
+                }
             }
-            else  // We have a GT_OBJ with an address expression
+
+            // Either varNode or addrNOde must have been setup above,
+            // the xor ensures that only one of the two is setup, not both
+            assert((varNode != nullptr) ^ (addrNode != nullptr));
+
+            BYTE     gcPtrs[MAX_ARG_REG_COUNT] = {};   // TYPE_GC_NONE = 0 
+            BYTE*    structGcLayout = &gcPtrs[0];  // The GC layout for the struct
+            unsigned gcPtrCount;                   // The count of GC pointers in the struct
+            int      structSize;
+            bool     isHfa;
+
+            // Setup the structSize, isHFa, and gcPtrCount
+            if (varNode != nullptr)
+            {
+                varNumInp = varNode->gtLclNum;
+                assert(varNumInp < compiler->lvaCount);
+                LclVarDsc* varDsc = &compiler->lvaTable[varNumInp];
+
+                assert(varDsc->lvType == TYP_STRUCT);
+                assert(varDsc->lvOnFrame);       // This struct also must live in the stack frame
+                assert(!varDsc->lvRegister);     // And it can't live in a register (SIMD) 
+
+                structSize = varDsc->lvSize();   // This yields the roundUp size, but that is fine
+                                                 // as that is how much stack is allocated for this LclVar
+                isHfa = varDsc->lvIsHfa();
+                gcPtrCount = varDsc->lvStructGcCount;
+                structGcLayout = varDsc->lvGcLayout;               
+            }
+            else  // addrNode is used
             {
+                assert(addrNode != nullptr);
+
                 // Generate code to load the address that we need into a register
                 genConsumeAddress(addrNode);
+                addrReg = addrNode->gtRegNum;
 
-                regNumber addrReg    = addrNode->gtRegNum;
-                var_types targetType = objNode->TypeGet();
-
-                noway_assert(varTypeIsStruct(targetType)); 
+                CORINFO_CLASS_HANDLE objClass = source->gtObj.gtClass;
 
-                CORINFO_CLASS_HANDLE objClass = objNode->gtObj.gtClass;
-                int structSize = compiler->info.compCompHnd->getClassSize(objClass);
-
-                assert(structSize <= 2*TARGET_POINTER_SIZE);
+                structSize = compiler->info.compCompHnd->getClassSize(objClass);
+                isHfa      = compiler->IsHfa(objClass);
+                gcPtrCount = compiler->info.compCompHnd->getClassGClayout(objClass, &gcPtrs[0]);
+            }
 
-                // We obtain the gcPtrs values by examining op1 using getClassGClayout()
+            bool hasGCpointers = (gcPtrCount > 0);  // true if there are any GC pointers in the struct 
+            
+            // If we have an HFA we can't have any GC pointers,
+            // if not then the max size for the the struct is 16 bytes
+            if (isHfa)
+            {
+                noway_assert(gcPtrCount == 0);
+            }
+            else
+            {
+                noway_assert(structSize <= 2 * TARGET_POINTER_SIZE);
+            }
 
-                BYTE gcPtrs[2] = {TYPE_GC_NONE, TYPE_GC_NONE};
-                compiler->info.compCompHnd->getClassGClayout(objClass, &gcPtrs[0]);
+            noway_assert(structSize <= MAX_PASS_MULTIREG_BYTES);
 
-                // We need to record the GC type to used for each of the loads
-                type0 = compiler->getJitGCType(gcPtrs[0]);
-                type1 = compiler->getJitGCType(gcPtrs[1]);
+            // For a 16-byte structSize with GC pointers we will use two ldr and two str instructions
+            //             ldr     x2, [x0]
+            //             ldr     x3, [x0, #8]
+            //             str     x2, [sp, #16]
+            //             str     x3, [sp, #24]
+            //
+            // For a 16-byte structSize with no GC pointers we will use a ldp and two str instructions
+            //             ldp     x2, x3, [x0]
+            //             str     x2, [sp, #16]
+            //             str     x3, [sp, #24]
+            //
+            // For a 32-byte structSize with no GC pointers we will use two ldp and four str instructions
+            //             ldp     x2, x3, [x0]
+            //             str     x2, [sp, #16]
+            //             str     x3, [sp, #24]
+            //             ldp     x2, x3, [x0]
+            //             str     x2, [sp, #32]
+            //             str     x3, [sp, #40]
+            //
+            // Note that when loading from a varNode we currently can't use the ldp instruction
+            // TODO-ARM64-CQ: Implement support for using a ldp instruction with a varNum (see emitIns_R_S)
+            //
 
-                bool hasGCpointers = varTypeIsGC(type0) || varTypeIsGC(type1);
+            int       remainingSize = structSize;
+            unsigned  structOffset = 0;
+            unsigned  nextIndex = 0;
 
-                noway_assert(structSize <= MAX_PASS_MULTIREG_BYTES);
+            while (remainingSize >= 2 * TARGET_POINTER_SIZE)
+            {
+                var_types type0 = compiler->getJitGCType(gcPtrs[nextIndex + 0]);
+                var_types type1 = compiler->getJitGCType(gcPtrs[nextIndex + 1]);
 
-                // For a 16-byte structSize with GC pointers we will use two ldr instruction to load two registers
-                //             ldr     x2, [x0]
-                //             ldr     x3, [x0]
-                //
-                // For a 16-byte structSize with no GC pointers we will use a ldp instruction to load two registers
-                //             ldp     x2, x3, [x0]
-                //
-                // For a 12-byte structSize we will we will generate two load instructions
-                //             ldr     x2, [x0]
-                //             ldr     w3, [x0, #8]
-                //
-                // When the first instruction has a loReg that is the same register 
-                // as the source register: addrReg,  we set deferLoad to true and
-                // issue the intructions in the reverse order:
-                //             ldr     w3, [x2, #8]
-                //             ldr     x2, [x2]
-
-                bool      deferLoad     = false;
-                emitAttr  deferAttr     = EA_PTRSIZE;
-                int       deferOffset   = 0;
-                int       remainingSize = structSize;
-                unsigned  structOffset  = 0;
-                var_types nextType      = type0;
-
-                // Use the ldp instruction for a struct that is exactly 16-bytes in size
-                //             ldp     x2, x3, [x0]
-                //
-                if (remainingSize == 2*TARGET_POINTER_SIZE)
+                if (hasGCpointers)
                 {
-                    if (hasGCpointers)
-                    {
-                        // We have GC pointers, so use two ldr instructions
-                        //
-                        // We do it this  way because we can't currently pass or track 
-                        // two different emitAttr values for a ldp instruction.
+                    // We have GC pointers, so use two ldr instructions
+                    //
+                    // We must do it this way because we can't currently pass or track 
+                    // two different emitAttr values for a ldp instruction.
 
-                        // Make sure that the first load instruction does not overwrite the addrReg.
-                        //
-                        if (loReg != addrReg)
+                    // Make sure that the first load instruction does not overwrite the addrReg.
+                    //
+                    if (loReg != addrReg)
+                    {
+                        if (varNode != nullptr)
                         {
-                            emit->emitIns_R_R_I(INS_ldr, emitTypeSize(type0), loReg, addrReg, structOffset);
-                            emit->emitIns_R_R_I(INS_ldr, emitTypeSize(type1), hiReg, addrReg, structOffset + TARGET_POINTER_SIZE);
+                            // Load from our varNumImp source
+                            emit->emitIns_R_S(ins_Load(type0), emitTypeSize(type0), loReg, varNumInp, 0);
+                            emit->emitIns_R_S(ins_Load(type1), emitTypeSize(type1), hiReg, varNumInp, TARGET_POINTER_SIZE);
                         }
-                        else 
+                        else
                         {
-                            assert(hiReg != addrReg);
-                            emit->emitIns_R_R_I(INS_ldr, emitTypeSize(type1), hiReg, addrReg, structOffset + TARGET_POINTER_SIZE);
-                            emit->emitIns_R_R_I(INS_ldr, emitTypeSize(type0), loReg, addrReg, structOffset);
+                            // Load from our address expression source
+                            emit->emitIns_R_R_I(ins_Load(type0), emitTypeSize(type0), loReg, addrReg, structOffset);
+                            emit->emitIns_R_R_I(ins_Load(type1), emitTypeSize(type1), hiReg, addrReg, structOffset + TARGET_POINTER_SIZE);
                         }
                     }
+                    else // loReg == addrReg
+                    {
+                        assert(varNode == nullptr);  // because addrReg is REG_NA when varNode is non-null
+                        assert(hiReg != addrReg);
+                        // Load from our address expression source
+                        emit->emitIns_R_R_I(ins_Load(type1), emitTypeSize(type1), hiReg, addrReg, structOffset + TARGET_POINTER_SIZE);
+                        emit->emitIns_R_R_I(ins_Load(type0), emitTypeSize(type0), loReg, addrReg, structOffset);
+                    }
+                }
+                else  // our struct has no GC pointers
+                {
+                    if (varNode != nullptr)
+                    {
+                        // Load from our varNumImp source, currently we can't use a ldp instruction to do this
+                        emit->emitIns_R_S(ins_Load(type0), emitTypeSize(type0), loReg, varNumInp, 0);
+                        emit->emitIns_R_S(ins_Load(type1), emitTypeSize(type1), hiReg, varNumInp, TARGET_POINTER_SIZE);
+                    }
                     else
                     {
                         // Use a ldp instruction 
 
+                        // Load from our address expression source
                         emit->emitIns_R_R_R_I(INS_ldp, EA_PTRSIZE, loReg, hiReg, addrReg, structOffset);
                     }
-                    remainingSize = 0;     // We completely wrote the 16-byte struct
                 }
 
-                regNumber curReg = loReg;
-                while (remainingSize > 0)
+                // Emit two store instructions to store the two registers into the outgoing argument area
+                emit->emitIns_S_R(ins_Store(type0), emitTypeSize(type0), loReg, varNumOut, argOffsetOut);
+                emit->emitIns_S_R(ins_Store(type1), emitTypeSize(type1), hiReg, varNumOut, argOffsetOut + TARGET_POINTER_SIZE);
+                argOffsetOut += (2 * TARGET_POINTER_SIZE);      // We stored 16-bytes of the struct
+                assert(argOffsetOut <= argOffsetMax);           // We can't write beyound the outgoing area area
+
+                remainingSize -= (2 * TARGET_POINTER_SIZE);     // We loaded 16-bytes of the struct
+                structOffset += (2 * TARGET_POINTER_SIZE);
+                nextIndex += 2;
+            }
+
+            // For a 12-byte structSize we will we will generate two load instructions
+            //             ldr     x2, [x0]
+            //             ldr     w3, [x0, #8]
+            //             str     x2, [sp, #16]
+            //             str     w3, [sp, #24]
+            //
+            // When the first instruction has a loReg that is the same register as the addrReg,  
+            //  we set deferLoad to true and issue the intructions in the reverse order
+            //             ldr     x3, [x2, #8]
+            //             ldr     x2, [x2]
+            //             str     x2, [sp, #16]
+            //             str     x3, [sp, #24]
+            //
+
+            var_types nextType = compiler->getJitGCType(gcPtrs[nextIndex]);
+            emitAttr  nextAttr = emitTypeSize(nextType);
+            regNumber curReg = loReg;
+
+            bool      deferLoad = false;
+            var_types deferType = TYP_UNKNOWN;
+            emitAttr  deferAttr = EA_PTRSIZE;
+            int       deferOffset = 0;
+
+            while (remainingSize > 0)
+            {
+                if (remainingSize >= TARGET_POINTER_SIZE)
                 {
-                    if (remainingSize >= TARGET_POINTER_SIZE)
-                    {
-                        remainingSize -= TARGET_POINTER_SIZE;
+                    remainingSize -= TARGET_POINTER_SIZE;
 
-                        if ((curReg == addrReg) && (remainingSize != 0))
-                        {
-                            deferLoad = true;
-                            deferAttr = emitTypeSize(nextType);
-                            deferOffset = structOffset;
-                        }
-                        else  // the typical case
-                        {
-                            emit->emitIns_R_R_I(INS_ldr, emitTypeSize(nextType), curReg, addrReg, structOffset);
-                        }
-                        curReg = hiReg;
-                        structOffset += TARGET_POINTER_SIZE;
-                        nextType = type1;
+                    if ((curReg == addrReg) && (remainingSize != 0))
+                    {
+                        deferLoad = true;
+                        deferType = nextType;
+                        deferAttr = emitTypeSize(nextType);
+                        deferOffset = structOffset;
                     }
-                    else // (remainingSize < TARGET_POINTER_SIZE)
+                    else  // the typical case
                     {
-                        int loadSize = remainingSize;
-                        remainingSize = 0;
-
-                        // the left over size is smaller than a pointer and thus can never be a GC type
-                        assert(varTypeIsGC(nextType) == false); 
-
-                        var_types loadType = TYP_UINT;
-                        if (loadSize == 1)
-                        {
-                            loadType = TYP_UBYTE;
-                        }
-                        else if (loadSize == 2)
+                        if (varNode != nullptr)
                         {
-                            loadType = TYP_USHORT;
+                            // Load from our varNumImp source
+                            emit->emitIns_R_S(ins_Load(nextType), nextAttr, curReg, varNumInp, structOffset);
                         }
                         else
                         {
-                            // Need to handle additional loadSize cases here
-                            noway_assert(loadSize == 4);
+                            // Load from our address expression source
+                            emit->emitIns_R_R_I(ins_Load(nextType), nextAttr, curReg, addrReg, structOffset);
                         }
+                        // Emit a store instruction to store the register into the outgoing argument area
+                        emit->emitIns_S_R(ins_Store(nextType), nextAttr, curReg, varNumOut, argOffsetOut);
+                        argOffsetOut += EA_SIZE_IN_BYTES(nextAttr);
+                        assert(argOffsetOut <= argOffsetMax);           // We can't write beyound the outgoing area area
+                    }
+                    curReg = hiReg;
+                    structOffset += TARGET_POINTER_SIZE;
+                    nextIndex++;
+                    nextType = compiler->getJitGCType(gcPtrs[nextIndex]);
+                    nextAttr = emitTypeSize(nextType);
+                }
+                else // (remainingSize < TARGET_POINTER_SIZE)
+                {
+                    int loadSize = remainingSize;
+                    remainingSize = 0;
 
-                        instruction loadIns  = ins_Load(loadType);
-                        emitAttr    loadAttr = emitAttr(loadSize);
+                    // We should never have to do a non-pointer sized load when we have a LclVar source
+                    assert(varNode == nullptr);
 
-                        // When deferLoad is false, curReg can be the same as addrReg 
-                        // because the last instruction is allowed to overwrite addrReg.
-                        //
-                        noway_assert(!deferLoad || (curReg != addrReg));
+                    // the left over size is smaller than a pointer and thus can never be a GC type
+                    assert(varTypeIsGC(nextType) == false);
 
-                        emit->emitIns_R_R_I(loadIns, loadAttr, curReg, addrReg, structOffset);
+                    var_types loadType = TYP_UINT;
+                    if (loadSize == 1)
+                    {
+                        loadType = TYP_UBYTE;
+                    }
+                    else if (loadSize == 2)
+                    {
+                        loadType = TYP_USHORT;
+                    }
+                    else
+                    {
+                        // Need to handle additional loadSize cases here
+                        noway_assert(loadSize == 4);
                     }
-                }
 
-                if (deferLoad)
-                {
-                    curReg = addrReg;
-                    emit->emitIns_R_R_I(INS_ldr, deferAttr, curReg, addrReg, deferOffset);
-                }
-            }
-        }
-        else if (data->OperGet() == GT_LIST)
-        {
-            // Deal with multi register passed struct args.
-            GenTreeArgList* argListPtr = data->AsArgList();
-            unsigned iterationNum = 0;
-            for (; argListPtr != nullptr; argListPtr = argListPtr->Rest(), iterationNum++)
-            {
-                GenTreePtr nextArgNode = argListPtr->gtOp.gtOp1;
-                genConsumeReg(nextArgNode);
+                    instruction loadIns = ins_Load(loadType);
+                    emitAttr    loadAttr = emitAttr(loadSize);
 
-                if (iterationNum == 0)
-                {
-                    // record loReg and type0 for the store to the out arg space
-                    loReg = nextArgNode->gtRegNum;
-                    type0 = nextArgNode->TypeGet();
-                }
-                else
-                {
-                    assert(iterationNum == 1);
-                    // record hiReg and type1 for the store to the out arg space
-                    hiReg = nextArgNode->gtRegNum;;
-                    type1 = nextArgNode->TypeGet();
+                    // When deferLoad is false, curReg can be the same as addrReg 
+                    // because the last instruction is allowed to overwrite addrReg.
+                    //
+                    noway_assert(!deferLoad || (curReg != addrReg));
+
+                    emit->emitIns_R_R_I(loadIns, loadAttr, curReg, addrReg, structOffset);
+
+                    // Emit a store instruction to store the register into the outgoing argument area
+                    emit->emitIns_S_R(ins_Store(loadType), loadAttr, curReg, varNumOut, argOffsetOut);
+                    argOffsetOut += EA_SIZE_IN_BYTES(loadAttr);
+                    assert(argOffsetOut <= argOffsetMax);           // We can't write beyound the outgoing area area
                 }
             }
-        }
 
-        if ((data->OperGet() == GT_LCL_VAR) || (data->OperGet() == GT_LCL_VAR_ADDR))
-        {
-            GenTreeLclVarCommon* varNode = data->AsLclVarCommon();
-            unsigned   varNum = varNode->gtLclNum;        assert(varNum < compiler->lvaCount);
-            LclVarDsc* varDsc = &compiler->lvaTable[varNum];
+            if (deferLoad)
+            {
+                // We should never have to do a deferred load when we have a LclVar source
+                assert(varNode == nullptr);
 
-            // At this point any TYP_STRUCT LclVar must be a 16-byte pass by value argument
-            assert(varDsc->lvSize() == 2 * TARGET_POINTER_SIZE);
-            // This struct also must live in the stack frame
-            assert(varDsc->lvOnFrame);
+                curReg = addrReg;
 
-            // We need to record the GC type to used for each of the loads
-            // We obtain the GC type values by examining the local's varDsc->lvGcLayout
-            //
-            type0 = compiler->getJitGCType(varDsc->lvGcLayout[0]);
-            type1 = compiler->getJitGCType(varDsc->lvGcLayout[1]);
+                // Load from our address expression source
+                emit->emitIns_R_R_I(ins_Load(deferType), deferAttr, curReg, addrReg, deferOffset);
 
-            emit->emitIns_R_S(ins_Load(type0), emitTypeSize(type0), loReg, varNum, 0);
-            emit->emitIns_R_S(ins_Load(type1), emitTypeSize(type1), hiReg, varNum, TARGET_POINTER_SIZE);
+                // Emit a store instruction to store the register into the outgoing argument area
+                emit->emitIns_S_R(ins_Store(nextType), nextAttr, curReg, varNumOut, argOffsetOut);
+                argOffsetOut += EA_SIZE_IN_BYTES(nextAttr);
+                assert(argOffsetOut <= argOffsetMax);           // We can't write beyound the outgoing area area
+            }
         }
-
-        // We are required to set these two values above
-        assert(loReg != REG_NA);
-        assert(hiReg != REG_NA);
-
-        // We are required to set these two values above, so that the stores have the same GC type as the loads
-        assert(type0 != TYP_UNKNOWN);
-        assert(type1 != TYP_UNKNOWN);
-
-        // Emit two store instructions to store two consecutive registers into the outgoing argument area
-        emit->emitIns_S_R(ins_Store(type0), emitTypeSize(type0), loReg, varNum, argOffset);
-        emit->emitIns_S_R(ins_Store(type1), emitTypeSize(type1), hiReg, varNum, argOffset + TARGET_POINTER_SIZE);
     }
 }
 
index 42a404a..623aabc 100755 (executable)
@@ -3801,7 +3801,7 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
                                 // argument register number 'x'. Only used when circular = true.
         char        slot;       // 0 means the register is not used for a register argument
                                 // 1 means the first part of a register argument
-                                // 2 means the second part of a register argument (e.g., for a TYP_DOUBLE on ARM)
+                                // 2, 3 or 4  means the second,third or fourth part of a multireg argument 
         bool        stackArg;   // true if the argument gets homed to the stack
         bool        processed;  // true after we've processed the argument (and it is in its final location)
         bool        circular;   // true if this register participates in a circular dependency loop.
@@ -3811,20 +3811,27 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
         // So, for that case we retain the type of the register in the regArgTab.
         // In other cases, we simply use the type of the lclVar to determine the type of the register.
 
+#ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
+
+        // This is the UNIX_AMD64 implementation
         var_types   getRegType(Compiler* compiler)
         {
-#if defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-            return type;
-#elif defined(_TARGET_ARM_)
-            LclVarDsc varDsc = compiler->lvaTable[varNum];
-            return varDsc.lvIsHfaRegArg ? varDsc.GetHfaType() : varDsc.lvType;
+            return type;  // UNIX_AMD64 implementation
+        }
 
-    // TODO-ARM64: Do we need the above to handle HFA structs on ARM64?
+#else // !FEATURE_UNIX_AMD64_STRUCT_PASSING
 
-#else // !_TARGET_ARM_
-            return compiler->lvaTable[varNum].lvType;
-#endif // !_TARGET_ARM_
+        // This is the implementation for all other targets
+        var_types   getRegType(Compiler* compiler)
+        {
+            LclVarDsc varDsc = compiler->lvaTable[varNum];
+            // Check if this is an HFA register arg and return the HFA type
+            if (varDsc.lvIsHfaRegArg())
+                return varDsc.GetHfaType();
+            return varDsc.lvType;
         }
+
+#endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
     } regArgTab [max(MAX_REG_ARG,MAX_FLOAT_REG_ARG)] = { };
 
     unsigned    varNum;
@@ -3880,12 +3887,12 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
             }
         }
 
-#ifdef _TARGET_ARM_
-        var_types regType = varDsc->lvIsHfaRegArg ? varDsc->GetHfaType()
-                                                  : varDsc->TypeGet();
-#else // !_TARGET_ARM_
         var_types regType = varDsc->TypeGet();
-#endif // !_TARGET_ARM_
+        // Change regType to the HFA type when we have a HFA argument
+        if (varDsc->lvIsHfaRegArg())
+        {
+            regType = varDsc->GetHfaType();
+        }
 
 #if defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
         if (!varTypeIsStruct(regType))
@@ -4005,18 +4012,34 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
 #if FEATURE_MULTIREG_ARGS
             if (varDsc->lvIsMultiregStruct())
             {
+                if (varDsc->lvIsHfaRegArg())
+                {
+                    // We have an HFA argument, set slots to the number of registers used
+                    slots = varDsc->lvHfaSlots();
+                }
+                else
+                {
+                    // Currently all non-HFA multireg structs are two registers in size (i.e. two slots)
+                    assert(varDsc->lvSize() == (2 * TARGET_POINTER_SIZE));
+                    // We have a non-HFA multireg argument, set slots to two
+                    slots = 2;
+                }
+
                 // Note that regArgNum+1 represents an argument index not an actual argument register.  
                 // see genMapRegArgNumToRegNum(unsigned argNum, var_types type)
 
-                // This is the setup for the second half of a MULTIREG struct arg
-                noway_assert(regArgNum+1 < regState->rsCalleeRegArgNum);
-                // we better not have added it already (there better not be multiple vars representing this argument register)
-                noway_assert(regArgTab[regArgNum+1].slot == 0);
-                    
-                regArgTab[regArgNum+1].varNum = varNum;
-                regArgTab[regArgNum+1].slot = 2;
 
-                slots = 2;
+                // This is the setup for the rest of a multireg struct arg
+                noway_assert((regArgNum + (slots - 1)) < regState->rsCalleeRegArgNum);
+
+                for (int i = 1; i<slots; i++)
+                {
+                    // we better not have added it already (there better not be multiple vars representing this argument register)
+                    noway_assert(regArgTab[regArgNum + i].slot == 0);
+
+                    regArgTab[regArgNum + i].varNum = varNum;
+                    regArgTab[regArgNum + i].slot = (char)(i+1);
+                }
             }
 #endif // FEATURE_MULTIREG_ARGS
         }
@@ -4334,50 +4357,39 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
                      (varDsc->lvType == TYP_LONG && varDsc->lvOtherReg == REG_STK && regArgTab[argNum].slot == 2));
 
         var_types storeType = TYP_UNDEF;
+        unsigned  slotSize = TARGET_POINTER_SIZE;
 
-#if defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
         if (varTypeIsStruct(varDsc))
         {
-            size = EA_SIZE(varDsc->lvSize());
-#if defined(_TARGET_AMD64_)
+            storeType = TYP_I_IMPL;   // Default store type for a struct type is a pointer sized integer
+#if FEATURE_MULTIREG_ARGS
+            // Must be <= MAX_PASS_MULTIREG_BYTES or else it wouldn't be passed in registers
+            noway_assert(varDsc->lvSize() <= MAX_PASS_MULTIREG_BYTES);
+#endif // FEATURE_MULTIREG_ARGS
 #ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
             storeType = regArgTab[argNum].type;
-            size = emitActualTypeSize(storeType);
-#else // !FEATURE_UNIX_AMD64_STRUCT_PASSING
-            storeType = (var_types)((size <= 4) ? TYP_INT : TYP_I_IMPL);
-            // Must be 1, 2, 4, or 8, or else it wouldn't be passed in a register
-            noway_assert(EA_SIZE_IN_BYTES(size) <= 8);
-            assert((EA_SIZE_IN_BYTES(size) & (EA_SIZE_IN_BYTES(size) - 1)) == 0);
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
-#elif defined(_TARGET_ARM64_)
-            // Must be <= 16 bytes or else it wouldn't be passed in registers
-            noway_assert(EA_SIZE_IN_BYTES(size) <= MAX_PASS_MULTIREG_BYTES);
-
-            storeType = TYP_I_IMPL;   
-            size = emitActualTypeSize(storeType);
+            if (varDsc->lvIsHfaRegArg())
+            {
+#ifdef _TARGET_ARM_
+                // On ARM32 the storeType for HFA args is always TYP_FLOAT
+                storeType = TYP_FLOAT;
+                slotSize = (unsigned)emitActualTypeSize(storeType);
+#else   // _TARGET_ARM64_
+                storeType = genActualType(varDsc->GetHfaType());
+                slotSize = (unsigned)emitActualTypeSize(storeType);
 #endif // _TARGET_ARM64_
+            }
         }
-        else
-#endif // defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
+        else  // Not a struct type
         {
-#ifdef _TARGET_ARM_
-            if (varDsc->lvIsHfaRegArg)
-            {
-                storeType = genActualType(TYP_FLOAT);
-            }
-            else
-#endif // _TARGET_ARM_
-            {
-                storeType = genActualType(varDsc->TypeGet());
-            }
-
+            storeType = genActualType(varDsc->TypeGet());
+        }
+        size = emitActualTypeSize(storeType);
 #ifdef _TARGET_X86_
-            noway_assert(genTypeSize(storeType) == sizeof(void *));
+        noway_assert(genTypeSize(storeType) == TARGET_POINTER_SIZE);
 #endif //_TARGET_X86_
 
-            size = emitActualTypeSize(storeType);
-        }
-
         regNumber srcRegNum = genMapRegArgNumToRegNum(argNum, storeType);
         
         // Stack argument - if the ref count is 0 don't care about it
@@ -4389,13 +4401,22 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
         else
         {
             // Since slot is typically 1, baseOffset is typically 0
-            int baseOffset = (regArgTab[argNum].slot - 1) * TARGET_POINTER_SIZE;
+            int baseOffset = (regArgTab[argNum].slot - 1) * slotSize;
 
             getEmitter()->emitIns_S_R(ins_Store(storeType),
                                         size,
                                         srcRegNum,
                                         varNum,
-                                        baseOffset);                                    
+                                        baseOffset);
+
+#ifndef FEATURE_UNIX_AMD64_STRUCT_PASSING
+            // Check if we are writing past the end of the struct
+            if (varTypeIsStruct(varDsc))
+            {
+                assert(varDsc->lvSize() >= baseOffset+(unsigned)size);
+            }
+#endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
+
 
             if (regArgTab[argNum].slot == 1)
                 psiMoveToStack(varNum);
@@ -4426,32 +4447,32 @@ void            CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
 
         if (doingFloat)
         {
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-            insCopy = ins_Copy(TYP_FLOAT);
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+            insCopy = ins_Copy(TYP_DOUBLE);
             // Compute xtraReg here when we have a float argument
             assert(xtraReg == REG_NA);
 
             regMaskTP fpAvailMask;  
                     
             fpAvailMask = RBM_FLT_CALLEE_TRASH & ~regArgMaskLive;
-#if defined(_TARGET_ARM_)
-            fpAvailMask &= RBM_DBL_REGS;
+#if defined(FEATURE_HFA)
+            fpAvailMask &= RBM_ALLDOUBLE;
 #else
 #if !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 #error Error. Wrong architecture.
 #endif // !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-#endif // defined(_TARGET_ARM_)
+#endif // defined(FEATURE_HFA)
 
             if (fpAvailMask == RBM_NONE)
             {
                 fpAvailMask = RBM_ALLFLOAT & ~regArgMaskLive;
-#if defined(_TARGET_ARM_)
-                fpAvailMask &= RBM_DBL_REGS;
+#if defined(FEATURE_HFA)
+                fpAvailMask &= RBM_ALLDOUBLE;
 #else
 #if !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 #error Error. Wrong architecture.
 #endif // !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-#endif // defined(_TARGET_ARM_)
+#endif // defined(FEATURE_HFA)
             }
 
             assert(fpAvailMask != RBM_NONE);
@@ -10417,63 +10438,85 @@ bool Compiler::IsMultiRegReturnedType(CORINFO_CLASS_HANDLE hClass)
 }
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
 
-#ifdef _TARGET_ARM_
 bool Compiler::IsHfa(CORINFO_CLASS_HANDLE hClass)
 {
+#ifdef FEATURE_HFA
     return varTypeIsFloating(GetHfaType(hClass));
+#else
+    return false;
+#endif
 }
 
 bool Compiler::IsHfa(GenTreePtr tree)
 {
+#ifdef FEATURE_HFA
     return IsHfa(gtGetStructHandleIfPresent(tree));
+#else
+    return false;
+#endif
 }
 
 var_types Compiler::GetHfaType(GenTreePtr tree)
 {
-    return (tree->TypeGet() == TYP_STRUCT) ? GetHfaType(gtGetStructHandleIfPresent(tree)) : TYP_UNDEF;
+#ifdef FEATURE_HFA
+    if (tree->TypeGet() == TYP_STRUCT)
+    {
+        return GetHfaType(gtGetStructHandleIfPresent(tree));
+    }
+#endif
+    return TYP_UNDEF;
 }
 
-unsigned Compiler::GetHfaSlots(GenTreePtr tree)
+unsigned Compiler::GetHfaCount(GenTreePtr tree)
 {
-    return GetHfaSlots(gtGetStructHandleIfPresent(tree));
+    return GetHfaCount(gtGetStructHandleIfPresent(tree));
 }
 
 var_types Compiler::GetHfaType(CORINFO_CLASS_HANDLE hClass)
 {
-    if (hClass == NO_CLASS_HANDLE)
-    {
-        return TYP_UNDEF;
-    }
-#if 0
-    // This is a workaround to allow for testing without full HFA support in the VM
-    if (_strnicmp(eeGetClassName(hClass), "HFA", 3) == 0)
-    {
-        return TYP_FLOAT;
-    }
-    else if (_strnicmp(eeGetClassName(hClass), "HDA", 3) == 0)
+    var_types result = TYP_UNDEF;
+    if (hClass != NO_CLASS_HANDLE)
     {
-        return TYP_DOUBLE;
-    }
-#endif
-
-    CorInfoType corType = info.compCompHnd->getHFAType(hClass);
-    if (corType == CORINFO_TYPE_UNDEF)
-    {
-        return TYP_UNDEF;
+#ifdef FEATURE_HFA
+        CorInfoType corType = info.compCompHnd->getHFAType(hClass);
+        if (corType != CORINFO_TYPE_UNDEF)
+        {
+            result = JITtype2varType(corType);
+        }
+#endif // FEATURE_HFA
     }
-    return JITtype2varType(corType);
+    return result;
 }
 
-unsigned Compiler::GetHfaSlots(CORINFO_CLASS_HANDLE hClass)
+//------------------------------------------------------------------------
+// GetHfaCount: Given a  class handle for an HFA struct
+//    return the number of registers needed to hold the HFA
+//
+//    Note that on ARM32 the single precision registers overlap with
+//        the double precision registers and for that reason each
+//        double register is considered to be two single registers.
+//        Thus for ARM32 an HFA of 4 doubles this function will return 8.
+//    On ARM64 given an HFA of 4 singles or 4 doubles this function will 
+//         will return 4 for both.
+// Arguments:
+//    hClass: the class handle of a HFA struct
+//
+unsigned Compiler::GetHfaCount(CORINFO_CLASS_HANDLE hClass)
 {
     assert(IsHfa(hClass));
-    return info.compCompHnd->getClassSize(hClass) / TARGET_POINTER_SIZE;
+#ifdef _TARGET_ARM_
+    // A HFA of doubles is twice as large as an HFA of singles for ARM32
+    // (i.e. uses twice the number of single precison registers)
+    return info.compCompHnd->getClassSize(hClass) / REGSIZE_BYTES;
+#else // _TARGET_ARM64_
+    var_types hfaType = GetHfaType(hClass);
+    unsigned classSize = info.compCompHnd->getClassSize(hClass);
+    // Note that the retail build issues a warning about a potential divsion by zero without the Max function 
+    unsigned elemSize = Max((unsigned)1, EA_SIZE_IN_BYTES(emitActualTypeSize(hfaType)));
+    return classSize / elemSize;
+#endif // _TARGET_ARM64_
 }
 
-
-#endif // _TARGET_ARM_
-
-
 #ifdef _TARGET_XARCH_
 
 //------------------------------------------------------------------------
index 248ed5b..5939557 100644 (file)
@@ -5461,7 +5461,7 @@ void                CodeGen::genCodeForTreeLeaf_GT_JMP(GenTreePtr tree)
         else
 #endif // _TARGET_64BIT_
 #ifdef _TARGET_ARM_
-        if (varDsc->lvIsHfaRegArg)
+        if (varDsc->lvIsHfaRegArg())
         {
             const var_types   elemType = varDsc->GetHfaType();
             const instruction loadOp   = ins_Load(elemType);
@@ -14358,149 +14358,6 @@ SIMPLE_OR_LONG:
 
             goto DONE;
 
-#if LONG_MATH_REGPARAM
-
-        case GT_MUL:    if (tree->gtOverflow())
-                        {
-                            if (tree->gtFlags & GTF_UNSIGNED)
-                                helper = CORINFO_HELP_ULMUL_OVF; goto MATH;
-                            else
-                                helper = CORINFO_HELP_LMUL_OVF;  goto MATH;
-                        }
-                        else
-                        {
-                            helper = CORINFO_HELP_LMUL;          goto MATH;
-                        }
-
-        case GT_DIV:    helper = CORINFO_HELP_LDIV;          goto MATH;
-        case GT_UDIV:   helper = CORINFO_HELP_ULDIV;         goto MATH;
-
-        case GT_MOD:    helper = CORINFO_HELP_LMOD;          goto MATH;
-        case GT_UMOD:   helper = CORINFO_HELP_ULMOD;         goto MATH;
-
-        MATH:
-
-            // TODO: Be smarter about the choice of register pairs
-
-            /* Which operand are we supposed to compute first? */
-
-            if  (tree->gtFlags & GTF_REVERSE_OPS)
-            {
-                /* Compute the second operand into EBX:ECX */
-
-                genComputeRegPair(op2, REG_PAIR_ECXEBX, RBM_NONE, RegSet::KEEP_REG, false);
-                noway_assert(op2->gtFlags & GTF_REG_VAL);
-                noway_assert(op2->gtRegPair == REG_PAIR_ECXEBX);
-
-                /* Compute the first  operand into EDX:EAX */
-
-                genComputeRegPair(op1, REG_PAIR_EAXEDX, RBM_NONE, RegSet::KEEP_REG, false);
-                noway_assert(op1->gtFlags & GTF_REG_VAL);
-                noway_assert(op1->gtRegPair == REG_PAIR_EAXEDX);
-
-                /* Lock EDX:EAX so that it doesn't get trashed */
-
-                noway_assert((regSet.rsMaskLock &  RBM_EDX) == 0);
-                              regSet.rsMaskLock |= RBM_EDX;
-                noway_assert((regSet.rsMaskLock &  RBM_EAX) == 0);
-                              regSet.rsMaskLock |= RBM_EAX;
-
-                /* Make sure the second operand hasn't been displaced */
-
-                genRecoverRegPair(op2, REG_PAIR_ECXEBX, RegSet::KEEP_REG);
-
-                /* We can unlock EDX:EAX now */
-
-                noway_assert((regSet.rsMaskLock &  RBM_EDX) != 0);
-                              regSet.rsMaskLock -= RBM_EDX;
-                noway_assert((regSet.rsMaskLock &  RBM_EAX) != 0);
-                              regSet.rsMaskLock -= RBM_EAX;
-            }
-            else
-            {
-                // Special case: both operands promoted from int
-                // i.e. (long)i1 * (long)i2.
-
-                if (oper == GT_MUL
-                    && op1->gtOper         == GT_CAST
-                    && op2->gtOper         == GT_CAST
-                    && op1->CastFromType() == TYP_INT
-                    && op2->CastFromType() == TYP_INT)
-                {
-                    /* Change to an integer multiply temporarily */
-
-                    tree->gtOp.gtOp1 = op1->gtCast.CastOp();
-                    tree->gtOp.gtOp2 = op2->gtCast.CastOp();
-                    tree->gtType     = TYP_INT;
-                    genCodeForTree(tree, 0);
-                    tree->gtType     = TYP_LONG;
-
-                    /* The result is now in EDX:EAX */
-
-                    regPair  = REG_PAIR_EAXEDX;
-                    goto DONE;
-                }
-                else
-                {
-                    /* Compute the first  operand into EAX:EDX */
-
-                    genComputeRegPair(op1, REG_PAIR_EAXEDX, RBM_NONE, RegSet::KEEP_REG, false);
-                    noway_assert(op1->gtFlags & GTF_REG_VAL);
-                    noway_assert(op1->gtRegPair == REG_PAIR_EAXEDX);
-
-                    /* Compute the second operand into ECX:EBX */
-
-                    genComputeRegPair(op2, REG_PAIR_ECXEBX, RBM_NONE, RegSet::KEEP_REG, false);
-                    noway_assert(op2->gtRegPair == REG_PAIR_ECXEBX);
-                    noway_assert(op2->gtFlags & GTF_REG_VAL);
-
-                    /* Lock ECX:EBX so that it doesn't get trashed */
-
-                    noway_assert((regSet.rsMaskLock &  RBM_EBX) == 0);
-                                  regSet.rsMaskLock |= RBM_EBX;
-                    noway_assert((regSet.rsMaskLock &  RBM_ECX) == 0);
-                                  regSet.rsMaskLock |= RBM_ECX;
-
-                    /* Make sure the first operand hasn't been displaced */
-
-                    genRecoverRegPair(op1, REG_PAIR_EAXEDX, RegSet::KEEP_REG);
-
-                    /* We can unlock ECX:EBX now */
-
-                    noway_assert((regSet.rsMaskLock &  RBM_EBX) != 0);
-                                  regSet.rsMaskLock -= RBM_EBX;
-                    noway_assert((regSet.rsMaskLock &  RBM_ECX) != 0);
-                                  regSet.rsMaskLock -= RBM_ECX;
-                }
-            }
-
-            /* Perform the math by calling a helper function */
-
-            noway_assert(op1->gtRegPair == REG_PAIR_EAXEDX);
-            noway_assert(op2->gtRegPair == REG_PAIR_ECXEBX);
-
-            genEmitHelperCall(CPX,
-                             2*sizeof(__int64), // argSize
-                             sizeof(void*));    // retSize
-
-            /* The values in both register pairs now trashed */
-
-            regTracker.rsTrackRegTrash(REG_EAX);
-            regTracker.rsTrackRegTrash(REG_EDX);
-            regTracker.rsTrackRegTrash(REG_EBX);
-            regTracker.rsTrackRegTrash(REG_ECX);
-
-            /* Release both operands */
-
-            genReleaseRegPair(op1);
-            genReleaseRegPair(op2);
-
-            noway_assert(op1->gtFlags & GTF_REG_VAL);
-            regPair  = op1->gtRegPair;
-            goto DONE;
-
-#else // not LONG_MATH_REGPARAM
-
         case GT_UMOD:
 
             regPair = genCodeForLongModInt(tree, needReg);
@@ -14548,8 +14405,6 @@ SIMPLE_OR_LONG:
 #endif
             goto DONE;
 
-#endif // not LONG_MATH_REGPARAM
-
         case GT_LSH: helper = CORINFO_HELP_LLSH; goto SHIFT;
         case GT_RSH: helper = CORINFO_HELP_LRSH; goto SHIFT;
         case GT_RSZ: helper = CORINFO_HELP_LRSZ; goto SHIFT;
@@ -20516,13 +20371,13 @@ regMaskTP           CodeGen::genCodeForCall(GenTreePtr  call,
     {
         genDefineTempLabel(returnLabel);
 
+#ifdef _TARGET_X86_
         if (getInlinePInvokeCheckEnabled())
         {
             noway_assert(compiler->lvaInlinedPInvokeFrameVar != BAD_VAR_NUM);
             BasicBlock  *   esp_check;
 
             CORINFO_EE_INFO * pInfo = compiler->eeGetEEInfo();
-
             /* mov   ecx, dword ptr [frame.callSiteTracker] */
 
             getEmitter()->emitIns_R_S (INS_mov,
@@ -20539,15 +20394,14 @@ regMaskTP           CodeGen::genCodeForCall(GenTreePtr  call,
                 if (argSize)
                 {
                     getEmitter()->emitIns_R_I  (INS_add,
-                                              EA_4BYTE,
+                                              EA_PTRSIZE,
                                               REG_ARG_0,
                                               argSize);
                 }
             }
-
             /* cmp   ecx, esp */
 
-            getEmitter()->emitIns_R_R(INS_cmp, EA_4BYTE, REG_ARG_0, REG_SPBASE);
+            getEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, REG_ARG_0, REG_SPBASE);
 
             esp_check = genCreateTempLabel();
 
@@ -20560,6 +20414,7 @@ regMaskTP           CodeGen::genCodeForCall(GenTreePtr  call,
 
             genDefineTempLabel(esp_check);
         }
+#endif
     }
 
     /* Are we supposed to pop the arguments? */
@@ -20652,7 +20507,7 @@ regMaskTP           CodeGen::genCodeForCall(GenTreePtr  call,
         {
             assert(call->gtCall.gtRetClsHnd != NULL);
             assert(compiler->IsHfa(call->gtCall.gtRetClsHnd));
-            int retSlots = compiler->GetHfaSlots(call->gtCall.gtRetClsHnd);
+            int retSlots = compiler->GetHfaCount(call->gtCall.gtRetClsHnd);
             assert(retSlots > 0 && retSlots <= MAX_HFA_RET_SLOTS);
             assert(MAX_HFA_RET_SLOTS < sizeof(int) * 8);
             retVal = ((1 << retSlots) - 1) << REG_FLOATRET;
index 936ec2f..0940d27 100755 (executable)
@@ -1328,6 +1328,7 @@ void CodeGen::genCodeForDivMod(GenTreeOp* treeNode)
 
 //------------------------------------------------------------------------
 // genCodeForBinary: Generate code for many binary arithmetic operators
+// This method is expected to have called genConsumeOperands() before calling it.
 //
 // Arguments:
 //    treeNode - The binary operation for which we are generating code.
@@ -1389,8 +1390,6 @@ void CodeGen::genCodeForBinary(GenTree* treeNode)
     GenTreePtr dst;
     GenTreePtr src;
 
-    genConsumeOperands(treeNode->AsOp());
-
     // This is the case of reg1 = reg1 op reg2
     // We're ready to emit the instruction without any moves
     if (op1reg == targetReg)
@@ -1958,6 +1957,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
 #endif // !defined(_TARGET_64BIT_)
     case GT_ADD:
     case GT_SUB:
+        genConsumeOperands(treeNode->AsOp());
         genCodeForBinary(treeNode);
         break;
 
index ddd6d4a..ac886ff 100644 (file)
@@ -546,13 +546,9 @@ var_types    Compiler::argOrReturnTypeForStruct(unsigned size, CORINFO_CLASS_HAN
             if (size <= MAX_RET_MULTIREG_BYTES)
             {
 #ifdef _TARGET_ARM64_
-                assert(size > TARGET_POINTER_SIZE);
-
-                // For structs that are 9 to 16 bytes in size set useType to TYP_STRUCT, 
-                // as this means a 9-16 byte struct value in two registers
-                //
-                useType = TYP_STRUCT;
-#endif // _TARGET_ARM64_
+                // TODO-ARM64-HFA - Implement x0,x1 returns   
+                // TODO-ARM64     - Implement HFA returns   
+#endif // _TARGET_XXX_
             }
         }
 #endif // FEATURE_MULTIREG_RET
@@ -565,10 +561,13 @@ var_types    Compiler::argOrReturnTypeForStruct(unsigned size, CORINFO_CLASS_HAN
 #ifdef _TARGET_ARM64_
                 assert(size > TARGET_POINTER_SIZE);
 
-                // For structs that are 9 to 16 bytes in size set useType to TYP_STRUCT, 
-                // as this means a 9-16 byte struct value in two registers
-                //
-                useType = TYP_STRUCT;
+                // On ARM64 structs that are 9-16 bytes are passed by value
+                // or if the struct is an HFA it is passed by value
+                if ((size <= (TARGET_POINTER_SIZE * 2)) || IsHfa(clsHnd))
+                {
+                    // set useType to TYP_STRUCT to indicate that this is passed by value in registers
+                    useType = TYP_STRUCT;
+                }
 #endif // _TARGET_ARM64_
             }
         }
@@ -3922,13 +3921,16 @@ void                 Compiler::compCompile(void * * methodCodePtr,
     compFunctionTraceEnd(*methodCodePtr, *methodCodeSize, false);
 
 #if FUNC_INFO_LOGGING
-#ifdef DEBUG // We only have access to info.compFullName in DEBUG builds.
     if (compJitFuncInfoFile != NULL)
     {
         assert(!compIsForInlining());
+#ifdef DEBUG // We only have access to info.compFullName in DEBUG builds.
         fprintf(compJitFuncInfoFile, "%s\n", info.compFullName);
+#elif FEATURE_SIMD
+        fprintf(compJitFuncInfoFile, " %s\n", eeGetMethodFullName(info.compMethodHnd));
+#endif
+        fprintf(compJitFuncInfoFile, "");         // in our logic this causes a flush
     }
-#endif // DEBUG
 #endif // FUNC_INFO_LOGGING
 }
 
@@ -4124,7 +4126,7 @@ int           Compiler::compCompile(CORINFO_METHOD_HANDLE methodHnd,
         if (oldFuncInfoFileName == NULL)
         {
             assert(compJitFuncInfoFile == NULL);
-            compJitFuncInfoFile = _wfsopen(compJitFuncInfoFilename, W("a"), _SH_DENYWR); // allow reading the file before the end of compilation
+            compJitFuncInfoFile = _wfopen(compJitFuncInfoFilename, W("a"));
         }
     }
 #endif // FUNC_INFO_LOGGING
index e44b0ec..2a0d4ee 100644 (file)
@@ -279,19 +279,19 @@ public:
     unsigned char       lvOverlappingFields :1;  // True when we have a struct with possibly overlapping fields
     unsigned char       lvContainsHoles     :1;  // True when we have a promoted struct that contains holes
     unsigned char       lvCustomLayout      :1;  // True when this struct has "CustomLayout"
-    unsigned char       lvIsMultiRegArgOrRet:1; // Is this a struct that would be passed or returned in multiple registers?
+    unsigned char       lvIsMultiRegArgOrRet:1;  // Is this a struct that would be passed or returned in multiple registers?
 
-#ifdef _TARGET_ARM_
-    // TODO-Cleanup: Can this be subsumed by the above?
-    unsigned char       lvIsHfaRegArg:1;        // Is this argument variable holding a HFA register argument.
-    unsigned char       lvHfaTypeIsFloat:1;     // Is the HFA type float or double?
-#endif // _TARGET_ARM_
+#ifdef FEATURE_HFA
+    unsigned char       _lvIsHfa            :1;  // Is this a struct variable who's class handle is an HFA type
+    unsigned char       _lvIsHfaRegArg      :1;  // Is this a HFA argument variable?    // TODO-CLEANUP: Remove this and replace with (lvIsRegArg && lvIsHfa())
+    unsigned char       _lvHfaTypeIsFloat   :1;  // Is the HFA type float or double?
+#endif // FEATURE_HFA
 
 #ifdef DEBUG
     // TODO-Cleanup: See the note on lvSize() - this flag is only in use by asserts that are checking for struct
     // types, and is needed because of cases where TYP_STRUCT is bashed to an integral type.
     // Consider cleaning this up so this workaround is not required.
-    unsigned char       lvUnusedStruct   :1; // All references to this promoted struct are through its field locals.
+    unsigned char       lvUnusedStruct   :1;    // All references to this promoted struct are through its field locals.
                                                 // I.e. there is no longer any reference to the struct directly.
                                                 // In this case we can simply remove this struct local.
 #endif
@@ -340,6 +340,75 @@ public:
     }
 #endif // FEATURE_MULTIREG_ARGS
 
+    bool lvIsHfa() const
+    {
+#ifdef FEATURE_HFA
+        return _lvIsHfa;
+#else
+        return false;
+#endif
+    }
+
+    void lvSetIsHfa()
+    {
+#ifdef FEATURE_HFA
+        _lvIsHfa = true;
+#endif
+    }
+
+    bool lvIsHfaRegArg() const
+    {
+#ifdef FEATURE_HFA
+        return _lvIsHfaRegArg;
+#else
+        return false;
+#endif
+    }
+
+    void lvSetIsHfaRegArg()
+    {
+#ifdef FEATURE_HFA
+        _lvIsHfaRegArg = true;
+#endif
+    }
+
+    bool lvHfaTypeIsFloat() const
+    {
+#ifdef FEATURE_HFA
+        return _lvHfaTypeIsFloat;
+#else
+        return false;
+#endif
+    }
+
+    void lvSetHfaTypeIsFloat(bool value)
+    {
+#ifdef FEATURE_HFA
+        _lvHfaTypeIsFloat = value;
+#endif
+    }
+
+    // on Arm64 - Returns 1-4 indicating the number of register slots used by the HFA
+    // on Arm32 - Returns the total number of single FP register slots used by the HFA, max is 8
+    //
+    unsigned lvHfaSlots() const
+    {
+        assert(lvIsHfa());
+        assert(lvType==TYP_STRUCT);
+#ifdef _TARGET_ARM_
+        return lvExactSize / sizeof(float);
+#else //  _TARGET_ARM64_
+        if (lvHfaTypeIsFloat())
+        {
+            return lvExactSize / sizeof(float);
+        }
+        else
+        {
+            return lvExactSize / sizeof(double);
+        }
+#endif //  _TARGET_ARM64_
+    }
+
 private:
 
     regNumberSmall      _lvRegNum;      // Used to store the register this variable is in (or, the low register of a register pair).
@@ -598,19 +667,26 @@ public:
         assert(varTypeIsStruct(lvType) ||
                (lvType == TYP_BLK) ||
                (lvPromoted && lvUnusedStruct));
-        return (unsigned)(roundUp(lvExactSize, sizeof(void*)));
+        return (unsigned)(roundUp(lvExactSize, TARGET_POINTER_SIZE));
     }
 
     bool                lvIsMultiregStruct()
     {
 #if FEATURE_MULTIREG_ARGS_OR_RET
-#ifdef _TARGET_ARM64_
-        if ((TypeGet() == TYP_STRUCT) &&
-            (lvSize()  == 2 * TARGET_POINTER_SIZE))
+        if (TypeGet() == TYP_STRUCT)
         {
-            return true;
+            if (lvIsHfa() && (lvHfaSlots() > 1))
+            {
+                return true;
+            }
+#if defined(_TARGET_ARM64_)
+            // lvSize() performs a roundUp operation so it only returns multiples of TARGET_POINTER_SIZE
+            else if (lvSize() == (2 * TARGET_POINTER_SIZE))
+            {
+                return true;
+            }
+#endif // _TARGET_ARM64_
         }
-#endif  // _TARGET_ARM64_
 #endif  // FEATURE_MULTIREG_ARGS_OR_RET
         return false;
     }
@@ -660,24 +736,17 @@ public:
     void                addPrefReg(regMaskTP  regMask, Compiler * pComp);
     bool                IsFloatRegType() const
                         {
-                            return
-#ifdef _TARGET_ARM_
-                                lvIsHfaRegArg ||
-#endif
-                                isFloatRegType(lvType);
+                            return isFloatRegType(lvType) || lvIsHfaRegArg();
                         }
-#ifdef _TARGET_ARM_
     var_types           GetHfaType() const
                         {
-                            assert(lvIsHfaRegArg);
-                            return lvIsHfaRegArg ? (lvHfaTypeIsFloat ? TYP_FLOAT : TYP_DOUBLE) : TYP_UNDEF;
+                            return lvIsHfa() ? (lvHfaTypeIsFloat() ? TYP_FLOAT : TYP_DOUBLE) : TYP_UNDEF;
                         }
     void                SetHfaType(var_types type)
                         {
                             assert(varTypeIsFloating(type));
-                            lvHfaTypeIsFloat = (type == TYP_FLOAT);
+                            lvSetHfaTypeIsFloat(type == TYP_FLOAT);
                         }
-#endif //_TARGET_ARM_
 
 #ifndef LEGACY_BACKEND
     var_types           lvaArgType();
@@ -1084,6 +1153,9 @@ struct fgArgTabEntry
     {
         return isBackFilled;
     }
+#ifdef DEBUG
+    void Dump();
+#endif
 };
 typedef struct fgArgTabEntry *  fgArgTabEntryPtr;
 
@@ -1172,8 +1244,10 @@ public:
     void            RecordStkLevel     (unsigned        stkLvl);
     unsigned        RetrieveStkLevel   ();
 
-    unsigned            ArgCount ()  { return argCount; }
-    fgArgTabEntryPtr *  ArgTable ()  { return argTable; }
+    unsigned            ArgCount ()      { return argCount; }
+    fgArgTabEntryPtr *  ArgTable ()      { return argTable; }
+    unsigned            GetNextSlotNum() { return nextSlotNum; }
+
 };
 
 
@@ -1333,26 +1407,22 @@ public:
     GenTreePtr               impAssignMultiRegTypeToVar(GenTreePtr op, CORINFO_CLASS_HANDLE hClass);
 #endif // FEATURE_MULTIREG_RET
 
-#ifdef _TARGET_ARM_
-
     //-------------------------------------------------------------------------
     // Functions to handle homogeneous floating-point aggregates (HFAs) in ARM.
     // HFAs are one to four element structs where each element is the same
     // type, either all float or all double. They are treated specially
     // in the ARM Procedure Call Standard, specifically, they are passed in
-    // floating-point registers.
+    // floating-point registers instead of the general purpose registers.
     //
 
     bool                            IsHfa(CORINFO_CLASS_HANDLE hClass);
     bool                            IsHfa(GenTreePtr tree);
 
     var_types                       GetHfaType(GenTreePtr tree);
-    unsigned                        GetHfaSlots(GenTreePtr tree);
+    unsigned                        GetHfaCount(GenTreePtr tree);
 
     var_types                       GetHfaType(CORINFO_CLASS_HANDLE hClass);
-    unsigned                        GetHfaSlots(CORINFO_CLASS_HANDLE hClass);
-
-#endif // _TARGET_ARM_
+    unsigned                        GetHfaCount(CORINFO_CLASS_HANDLE hClass);
 
     //-------------------------------------------------------------------------
     // The following is used for struct passing on System V system.
@@ -1903,6 +1973,11 @@ public:
 
     unsigned                gtSetEvalOrder  (GenTree *      tree);
 
+#if FEATURE_STACK_FP_X87
+    bool                    gtFPstLvlRedo;
+    void                    gtComputeFPlvls   (GenTreePtr     tree);
+#endif // FEATURE_STACK_FP_X87
+
     void                    gtSetStmtInfo   (GenTree *      stmt);
 
     // Returns "true" iff "node" has any of the side effects in "flags".
@@ -2234,6 +2309,8 @@ public :
     
     unsigned            lvaLocAllocSPvar;               // variable which has the result of the last alloca/localloc
 
+    unsigned            lvaNewObjArrayArgs;             // variable with arguments for new MD array helper
+
     // TODO-Review: Prior to reg predict we reserve 24 bytes for Spill temps.
     //              after the reg predict we will use a computed maxTmpSize 
     //              which is based upon the number of spill temps predicted by reg predict
@@ -2609,6 +2686,8 @@ protected :
 
     void                impImportAndPushBox (CORINFO_RESOLVED_TOKEN * pResolvedToken);
 
+    void                impImportNewObjArray(CORINFO_RESOLVED_TOKEN* pResolvedToken,
+                                             CORINFO_CALL_INFO* pCallInfo);
 
     bool                impCanPInvokeInline(var_types callRetTyp);
     bool                impCanPInvokeInlineCallSite(var_types callRetTyp);
@@ -2637,7 +2716,7 @@ protected :
                                              GenTreePtr     newobjThis,
                                              int            prefixFlags,
                                              CORINFO_CALL_INFO* callInfo,
-                                             IL_OFFSETX     ilOffset = BAD_IL_OFFSET);
+                                             IL_OFFSET      rawILOffset);
 
     bool                impMethodInfo_hasRetBuffArg(CORINFO_METHOD_INFO * methInfo);
 
@@ -3030,7 +3109,7 @@ private:
     void                impLoadLoc(unsigned ilLclNum, IL_OFFSET offset);
     bool                impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &opcode);
 
-#if defined(_TARGET_ARM_)
+#ifdef _TARGET_ARM_
     void                impMarkLclDstNotPromotable(unsigned tmpNum, GenTreePtr op, CORINFO_CLASS_HANDLE hClass);
 #endif
 
@@ -4399,11 +4478,6 @@ private:
     void                fgSetBlockOrder   (BasicBlock *   block);
 
 
-#if FEATURE_STACK_FP_X87
-    bool                fgFPstLvlRedo;
-    void                fgComputeFPlvls   (GenTreePtr     tree);
-#endif // FEATURE_STACK_FP_X87
-
     //------------------------- Morphing --------------------------------------
 
     unsigned            fgPtrArgCntCur;
@@ -4619,11 +4693,11 @@ private:
     void                fgInsertInlineeBlocks (InlineInfo* pInlineInfo);
     GenTreePtr          fgInlinePrependStatements(InlineInfo* inlineInfo);
 
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     GenTreePtr          fgGetStructAsStructPtr(GenTreePtr tree);
     GenTreePtr          fgAssignStructInlineeToVar(GenTreePtr child, CORINFO_CLASS_HANDLE retClsHnd);
     void                fgAttachStructInlineeToAsg(GenTreePtr tree, GenTreePtr child, CORINFO_CLASS_HANDLE retClsHnd);
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     static fgWalkPreFn  fgUpdateInlineReturnExpressionPlaceHolder;
 
 #ifdef DEBUG
@@ -5337,7 +5411,7 @@ protected :
                         }
 
 #ifdef DEBUG
-    bool                optConfigDisableCSE(bool lexicalCSE);
+    bool                optConfigDisableCSE();
     bool                optConfigDisableCSE2();
 #endif
     void                optOptimizeCSEs();
@@ -7869,7 +7943,7 @@ public :
     // Returns true if the method being compiled returns a non-void and non-struct value.
     // Note that lvaInitTypeRef() normalizes compRetNativeType for struct returns in a 
     // single register as per target arch ABI (e.g on Amd64 Windows structs of size 1, 2,
-    // 4 or 8 gets normalized to TYP_BYTE/TYP_SHORT/TYP_INT/TYP_LONG; On Arm Hfa structs).
+    // 4 or 8 gets normalized to TYP_BYTE/TYP_SHORT/TYP_INT/TYP_LONG; On Arm HFA structs).
     // Methods returning such structs are considered to return non-struct return value and
     // this method returns true in that case.
     bool                compMethodReturnsNativeScalarType() 
@@ -7906,14 +7980,14 @@ public :
     // TODO-ARM64: Does this apply for ARM64 too?
     bool                compMethodReturnsMultiRegRetType() 
     {       
-#if FEATURE_MULTIREG_RET
-#if defined(FEATURE_UNIX_AMD64_STRUCT_PASSING) || defined(_TARGET_ARM_)
+#if FEATURE_MULTIREG_RET && (defined(FEATURE_UNIX_AMD64_STRUCT_PASSING) || defined(_TARGET_ARM_))
         // Methods returning a struct in two registers is considered having a return value of TYP_STRUCT.
         // Such method's compRetNativeType is TYP_STRUCT without a hidden RetBufArg
         return varTypeIsStruct(info.compRetNativeType) && (info.compRetBuffArg == BAD_VAR_NUM);
-#endif 
-#endif
+#else 
         return false;
+#endif // FEATURE_MULTIREG_RET && (defined(FEATURE_UNIX_AMD64_STRUCT_PASSING) || defined(_TARGET_ARM_))
+
     }
 
 #if FEATURE_MULTIREG_ARGS
index a9e3693..4d8a9a8 100644 (file)
@@ -1238,7 +1238,7 @@ GenTreePtr          Compiler::gtUnusedValNode(GenTreePtr expr)
 
 /*****************************************************************************
  *
- * A wrapper for gtSetEvalOrder and fgComputeFPlvls
+ * A wrapper for gtSetEvalOrder and gtComputeFPlvls
  * Necessary because the FP levels may need to be re-computed if we reverse
  * operands
  */
@@ -1254,7 +1254,7 @@ void               Compiler::gtSetStmtInfo(GenTree * stmt)
     codeGen->genResetFPstkLevel();
 
     /* Sometimes we need to redo the FP level computation */
-    fgFPstLvlRedo = false;
+    gtFPstLvlRedo = false;
 #endif // FEATURE_STACK_FP_X87
 
 #ifdef DEBUG
@@ -1275,10 +1275,10 @@ void               Compiler::gtSetStmtInfo(GenTree * stmt)
 
     /* Do we need to recompute FP stack levels? */
 
-    if  (fgFPstLvlRedo)
+    if  (gtFPstLvlRedo)
     {
         codeGen->genResetFPstkLevel();
-        fgComputeFPlvls(expr);
+        gtComputeFPlvls(expr);
         assert(codeGen->genGetFPstkLevel() == 0 || codeGen->genGetFPstkLevel() == 1);
     }
 #endif // FEATURE_STACK_FP_X87
index b97c10c..787c311 100755 (executable)
@@ -439,15 +439,39 @@ unsigned           Compiler::eeGetArgSize(CORINFO_ARG_LIST_HANDLE list, CORINFO_
         assert(argTypeJit != CORINFO_TYPE_REFANY || structSize == 2*sizeof(void*));
 
 #if FEATURE_MULTIREG_ARGS
-#ifdef _TARGET_ARM64_
+        // For each target that supports passing struct args in multiple registers 
+        // apply the target specific rules for them here:
+#if defined(_TARGET_ARM64_)
+        // Any structs that are larger than MAX_PASS_MULTIREG_BYTES are always passed by reference
         if (structSize > MAX_PASS_MULTIREG_BYTES)
         {
             // This struct is passed by reference using a single 'slot'
             return TARGET_POINTER_SIZE;
         }
-#endif // _TARGET_ARM64_
+        else
+        {
+            // Is the struct larger than 16 bytes
+            if (structSize > (2 * TARGET_POINTER_SIZE))
+            {
+                var_types hfaType = GetHfaType(argClass);   // set to float or double if it is an HFA, otherwise TYP_UNDEF
+                bool      isHfa = (hfaType != TYP_UNDEF);
+                if (!isHfa)
+                {
+                    // This struct is passed by reference using a single 'slot'
+                    return TARGET_POINTER_SIZE;
+                }
+            }
+        }
+        // otherwise will we pass this struct by value in multiple registers
+        //
+#elif defined(_TARGET_ARM_)
+        //  otherwise will we pass this struct by value in multiple registers
+#else // 
+        NYI("unknown target");
+#endif // defined(_TARGET_XXX_)
 #endif // FEATURE_MULTIREG_ARGS
 
+        // we pass this struct by value in multiple registers
         return (unsigned)roundUp(structSize, TARGET_POINTER_SIZE);
     }
     else
index cd23b19..e383862 100644 (file)
@@ -20,7 +20,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 #pragma hdrstop
 #endif
 
-#if defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF)
+#if defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF) || defined(FEATURE_SIMD)
 
 #pragma warning(push)
 #pragma warning(disable:4701) // difficult to get rid of C4701 with 'sig' below
@@ -199,6 +199,6 @@ const char* Compiler::eeGetMethodFullName (CORINFO_METHOD_HANDLE  hnd)
 
 #pragma warning(pop)
 
-#endif // DEBUG || FEATURE_JIT_METHOD_PERF
+#endif // defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF) || defined(FEATURE_SIMD)
 
 /*****************************************************************************/
index aec04b4..61f6065 100644 (file)
@@ -4604,7 +4604,6 @@ DECODE_OPCODE:
         case CEE_CALLI:
             //Needs weight value in SMWeights.cpp
         case CEE_LOCALLOC:
-        case CEE_CPBLK:
         case CEE_MKREFANY:
         case CEE_RETHROW:
             //Consider making this only for not force inline.
@@ -8774,254 +8773,6 @@ BasicBlock* Compiler::fgSplitEdge(BasicBlock* curr, BasicBlock* succ)
 }
 
 
-#if FEATURE_STACK_FP_X87
-
-/*****************************************************************************/
-/*****************************************************************************/
-
-void                Compiler::fgComputeFPlvls(GenTreePtr tree)
-{
-    genTreeOps      oper;
-    unsigned        kind;
-    bool            isflt;
-    unsigned        savFPstkLevel;
-
-    noway_assert(tree);
-    noway_assert(tree->gtOper != GT_STMT);
-
-    /* Figure out what kind of a node we have */
-
-    oper  = tree->OperGet();
-    kind  = tree->OperKind();
-    isflt = varTypeIsFloating(tree->TypeGet()) ? 1 : 0;
-
-    /* Is this a constant or leaf node? */
-
-    if  (kind & (GTK_CONST|GTK_LEAF))
-    {
-        codeGen->genFPstkLevel += isflt;
-        goto DONE;
-    }
-
-    /* Is it a 'simple' unary/binary operator? */
-
-    if  (kind & GTK_SMPOP)
-    {
-        GenTreePtr      op1 = tree->gtOp.gtOp1;
-        GenTreePtr      op2 = tree->gtGetOp2();
-
-        /* Check for some special cases */
-
-        switch (oper)
-        {
-        case GT_IND:
-
-            fgComputeFPlvls(op1);
-
-            /* Indirect loads of FP values push a new value on the FP stack */
-
-            codeGen->genFPstkLevel += isflt;
-            goto DONE;
-
-        case GT_CAST:
-
-            fgComputeFPlvls(op1);
-
-            /* Casts between non-FP and FP push on / pop from the FP stack */
-
-            if  (varTypeIsFloating(op1->TypeGet()))
-            {
-                if  (isflt == false)
-                    codeGen->genFPstkLevel--;
-            }
-            else
-            {
-                if  (isflt != false)
-                    codeGen->genFPstkLevel++;
-            }
-
-            goto DONE;
-
-        case GT_LIST:   /* GT_LIST presumably part of an argument list */
-        case GT_COMMA:  /* Comma tosses the result of the left operand */
-
-            savFPstkLevel = codeGen->genFPstkLevel;
-            fgComputeFPlvls(op1);
-            codeGen->genFPstkLevel = savFPstkLevel;
-
-            if  (op2)
-                fgComputeFPlvls(op2);
-
-            goto DONE;
-
-        default:
-            break;
-        }
-
-        if  (!op1)
-        {
-            if  (!op2)
-                goto DONE;
-
-            fgComputeFPlvls(op2);
-            goto DONE;
-        }
-
-        if  (!op2)
-        {
-            fgComputeFPlvls(op1);
-            if (oper == GT_ADDR)
-            {
-                /* If the operand was floating point pop the value from the stack */
-                if (varTypeIsFloating(op1->TypeGet()))
-                {
-                    noway_assert(codeGen->genFPstkLevel);
-                    codeGen->genFPstkLevel--;
-                }
-            }
-
-            // This is a special case to handle the following
-            // optimization: conv.i4(round.d(d)) -> round.i(d)
-
-            if (oper== GT_INTRINSIC && tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Round &&
-                tree->TypeGet()==TYP_INT)
-            {
-                codeGen->genFPstkLevel--;
-            }
-
-            goto DONE;
-        }
-
-        /* FP assignments need a bit special handling */
-
-        if  (isflt && (kind & GTK_ASGOP))
-        {
-            /* The target of the assignment won't get pushed */
-
-            if  (tree->gtFlags & GTF_REVERSE_OPS)
-            {
-                fgComputeFPlvls(op2);
-                fgComputeFPlvls(op1);
-                 op1->gtFPlvl--;
-                codeGen->genFPstkLevel--;
-            }
-            else
-            {
-                fgComputeFPlvls(op1);
-                op1->gtFPlvl--;
-                codeGen->genFPstkLevel--;
-                fgComputeFPlvls(op2);
-            }
-
-            codeGen->genFPstkLevel--;
-            goto DONE;
-        }
-
-        /* Here we have a binary operator; visit operands in proper order */
-
-        if  (tree->gtFlags & GTF_REVERSE_OPS)
-        {
-            fgComputeFPlvls(op2);
-            fgComputeFPlvls(op1);
-        }
-        else
-        {
-            fgComputeFPlvls(op1);
-            fgComputeFPlvls(op2);
-        }
-
-        /*
-            Binary FP operators pop 2 operands and produce 1 result;
-            assignments consume 1 value and don't produce any.
-         */
-
-        if  (isflt)
-            codeGen->genFPstkLevel--;
-
-        /* Float compares remove both operands from the FP stack */
-
-        if  (kind & GTK_RELOP)
-        {
-            if  (varTypeIsFloating(op1->TypeGet()))
-                codeGen->genFPstkLevel -= 2;
-        }
-
-        goto DONE;
-    }
-
-    /* See what kind of a special operator we have here */
-
-    switch  (oper)
-    {
-    case GT_FIELD:
-        fgComputeFPlvls(tree->gtField.gtFldObj);
-        codeGen->genFPstkLevel += isflt;
-        break;
-
-    case GT_CALL:
-
-        if  (tree->gtCall.gtCallObjp)
-            fgComputeFPlvls(tree->gtCall.gtCallObjp);
-
-        if  (tree->gtCall.gtCallArgs)
-        {
-            savFPstkLevel = codeGen->genFPstkLevel;
-            fgComputeFPlvls(tree->gtCall.gtCallArgs);
-            codeGen->genFPstkLevel = savFPstkLevel;
-        }
-
-        if  (tree->gtCall.gtCallLateArgs)
-        {
-            savFPstkLevel = codeGen->genFPstkLevel;
-            fgComputeFPlvls(tree->gtCall.gtCallLateArgs);
-            codeGen->genFPstkLevel = savFPstkLevel;
-        }
-
-        codeGen->genFPstkLevel += isflt;
-        break;
-
-    case GT_ARR_ELEM:
-
-        fgComputeFPlvls(tree->gtArrElem.gtArrObj);
-
-        unsigned dim;
-        for (dim = 0; dim < tree->gtArrElem.gtArrRank; dim++)
-            fgComputeFPlvls(tree->gtArrElem.gtArrInds[dim]);
-
-        /* Loads of FP values push a new value on the FP stack */
-        codeGen->genFPstkLevel += isflt;
-        break;
-
-    case GT_CMPXCHG:
-        //Evaluate the trees left to right
-        fgComputeFPlvls(tree->gtCmpXchg.gtOpLocation);
-        fgComputeFPlvls(tree->gtCmpXchg.gtOpValue);
-        fgComputeFPlvls(tree->gtCmpXchg.gtOpComparand);
-        noway_assert(!isflt);
-        break;
-
-    case GT_ARR_BOUNDS_CHECK:
-        fgComputeFPlvls(tree->gtBoundsChk.gtArrLen);
-        fgComputeFPlvls(tree->gtBoundsChk.gtIndex);
-        noway_assert(!isflt);
-        break;
-
-#ifdef DEBUG
-    default:
-        noway_assert(!"Unhandled special operator in fgComputeFPlvls()");
-        break;
-#endif
-    }
-
-DONE:
-
-    noway_assert((unsigned char)codeGen->genFPstkLevel == codeGen->genFPstkLevel);
-
-    tree->gtFPlvl = (unsigned char)codeGen->genFPstkLevel;
-}
-
-#endif // FEATURE_STACK_FP_X87
-
 /*****************************************************************************/
 /*****************************************************************************/
 
@@ -21481,7 +21232,7 @@ void                Compiler::fgInline()
             if ((expr->gtOper == GT_CALL) && ((expr->gtFlags & GTF_CALL_INLINE_CANDIDATE) != 0))
             {
                 GenTreeCall* call = expr->AsCall();
-                InlineResult inlineResult(this, call, stmt->gtInlineContext, "fgInline");
+                InlineResult inlineResult(this, call, stmt, "fgInline");
 
                 fgMorphStmt = stmt;
 
@@ -21646,7 +21397,7 @@ void Compiler::fgNoteNonInlineCandidate(GenTreePtr   tree,
 
 #endif
 
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 
 /*********************************************************************************
  *
@@ -21778,7 +21529,7 @@ void Compiler::fgAttachStructInlineeToAsg(GenTreePtr tree, GenTreePtr child, COR
     tree->CopyFrom(gtNewCpObjNode(dstAddr, srcAddr, retClsHnd, false), this);
 }
 
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 
 /*****************************************************************************
  * Callback to replace the inline return expression place holder (GT_RET_EXPR)
@@ -21793,12 +21544,13 @@ Compiler::fgWalkResult      Compiler::fgUpdateInlineReturnExpressionPlaceHolder(
 
     if (tree->gtOper == GT_RET_EXPR)
     {
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
         // We are going to copy the tree from the inlinee, so save the handle now.
         CORINFO_CLASS_HANDLE retClsHnd = varTypeIsStruct(tree)
                                        ? tree->gtRetExpr.gtRetClsHnd
                                        : NO_CLASS_HANDLE;
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+
 
         do
         {
@@ -21836,12 +21588,14 @@ Compiler::fgWalkResult      Compiler::fgUpdateInlineReturnExpressionPlaceHolder(
         }
         while (tree->gtOper == GT_RET_EXPR);
 
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-#if defined(_TARGET_ARM_)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA)
         if (retClsHnd != NO_CLASS_HANDLE && comp->IsHfa(retClsHnd))
 #elif defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
         if (retClsHnd != NO_CLASS_HANDLE && comp->IsRegisterPassable(retClsHnd))
-#endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#else
+        assert(!"Unhandled target");
+#endif // FEATURE_HFA 
         {
             GenTreePtr parent = data->parent;
             // See assert below, we only look one level above for an asg parent.
@@ -21856,10 +21610,10 @@ Compiler::fgWalkResult      Compiler::fgUpdateInlineReturnExpressionPlaceHolder(
                 tree->CopyFrom(comp->fgAssignStructInlineeToVar(tree, retClsHnd), comp);
             }
         }
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     }
 
-#if defined(DEBUG) && (defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING))
+#if defined(DEBUG) && defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     // Make sure we don't have a tree like so: V05 = (, , , retExpr);
     // Since we only look one level above for the parent for '=' and
     // do not check if there is a series of COMMAs. See above.
@@ -21877,7 +21631,7 @@ Compiler::fgWalkResult      Compiler::fgUpdateInlineReturnExpressionPlaceHolder(
             // empty
         }
 
-#if defined(_TARGET_ARM_)
+#if defined(FEATURE_HFA)
         noway_assert(!varTypeIsStruct(comma) ||
                      comma->gtOper != GT_RET_EXPR ||
                      (!comp->IsHfa(comma->gtRetExpr.gtRetClsHnd)));
@@ -21887,7 +21641,7 @@ Compiler::fgWalkResult      Compiler::fgUpdateInlineReturnExpressionPlaceHolder(
                      (!comp->IsRegisterPassable(comma->gtRetExpr.gtRetClsHnd)));
 #endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     }
-#endif // defined(DEBUG) && (defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING))
+#endif // defined(DEBUG) && defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 
     return WALK_CONTINUE;
 }
index 4a5b4ab..42ccf2b 100644 (file)
@@ -238,13 +238,13 @@ void                GenTree::InitNodeSize()
 
     // Now set all of the appropriate entries to 'large'
 
-    // On ARM and System V struct returning there
-    // is code that does GT_ASG-tree.CopyObj call.
+    // On ARM32, ARM64 and System V for struct returning 
+    // there is code that does GT_ASG-tree.CopyObj call.
     // CopyObj is a large node and the GT_ASG is small, which triggers an exception.
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     GenTree::s_gtNodeSizes[GT_ASG             ] = TREE_NODE_SZ_LARGE;
     GenTree::s_gtNodeSizes[GT_RETURN          ] = TREE_NODE_SZ_LARGE;
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 
     GenTree::s_gtNodeSizes[GT_CALL            ] = TREE_NODE_SZ_LARGE;
     GenTree::s_gtNodeSizes[GT_CAST            ] = TREE_NODE_SZ_LARGE;
@@ -276,12 +276,12 @@ void                GenTree::InitNodeSize()
 #ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
     GenTree::s_gtNodeSizes[GT_PUTARG_STK      ] = TREE_NODE_SZ_LARGE;
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     // In importer for Hfa and register returned structs we rewrite GT_ASG to GT_COPYOBJ/GT_CPYBLK
     // Make sure the sizes agree.
     assert(GenTree::s_gtNodeSizes[GT_COPYOBJ] <= GenTree::s_gtNodeSizes[GT_ASG]);
     assert(GenTree::s_gtNodeSizes[GT_COPYBLK] <= GenTree::s_gtNodeSizes[GT_ASG]);
-#endif // !(defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING))
+#endif // !(defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING))
 
     assert(GenTree::s_gtNodeSizes[GT_RETURN] == GenTree::s_gtNodeSizes[GT_ASG]);
 
@@ -2837,7 +2837,7 @@ bool                Compiler::gtIsLikelyRegVar(GenTree * tree)
  *      3. gtRsvdRegs to the set of fixed registers trashed by the tree
  *      4. gtFPlvl to the "floating point depth" value for node, i.e. the max. number
  *         of operands the tree will push on the x87 (coprocessor) stack. Also sets
- *         genFPstkLevel, tmpDoubleSpillMax, and possibly fgFPstLvlRedo.
+ *         genFPstkLevel, tmpDoubleSpillMax, and possibly gtFPstLvlRedo.
  *      5. Sometimes sets GTF_ADDRMODE_NO_CSE on nodes in the tree.
  *      6. DEBUG-only: clears GTF_MORPHED.
  */
@@ -3333,16 +3333,12 @@ COMMON_CNS:
 
             case GT_MKREFANY:
             case GT_OBJ:
-                level  = gtSetEvalOrder(tree->gtOp.gtOp1);
-                ftreg |= tree->gtOp.gtOp1->gtRsvdRegs;
                 // We estimate the cost of a GT_OBJ or GT_MKREFANY to be two loads (GT_INDs)
                 costEx = 2*IND_COST_EX;
                 costSz = 2*2;
                 break;
 
             case GT_BOX:
-                level  = gtSetEvalOrder(tree->gtBox.BoxOp());
-                ftreg |= tree->gtBox.BoxOp()->gtRsvdRegs;
                 // We estimate the cost of a GT_BOX to be two stores (GT_INDs)
                 costEx = 2*IND_COST_EX;
                 costSz = 2*2;
@@ -3766,17 +3762,6 @@ COMMON_CNS:
                 costEx = 20;
                 costSz += 2;
 
-#if     LONG_MATH_REGPARAM
-                if  (tree->gtType == TYP_LONG)
-                {
-                    /* Encourage the second operand to be evaluated (into EBX/ECX) first*/
-                    lvlb += 3;
-
-                    // The second operand must be evaluated (into EBX/ECX) */
-                    ftreg |= RBM_EBX|RBM_ECX;
-                }
-#endif
-
                 // Encourage the first operand to be evaluated (into EAX/EDX) first */
                 lvlb -= 3;
 
@@ -3801,19 +3786,6 @@ COMMON_CNS:
                 costEx += 3;
                 costSz += 2;
 
-#if     LONG_MATH_REGPARAM
-
-                if  (tree->gtType == TYP_LONG)
-                {
-                    /* Encourage the second operand to be evaluated (into EBX/ECX) first*/
-                    lvlb += 3;
-                    
-                    // The second operand must be evaluated (into EBX/ECX) */
-                    ftreg |= RBM_EBX|RBM_ECX;
-                }
-
-#else // !LONG_MATH_REGPARAM
-
                 if (tree->gtOverflow())
                 {
                     /* Overflow check are more expensive */
@@ -3835,8 +3807,6 @@ COMMON_CNS:
                     costEx += 4;
                 }
 #endif //  _TARGET_X86_
-
-#endif // !LONG_MATH_REGPARAM
             }
             break;
 
@@ -4272,7 +4242,7 @@ COMMON_CNS:
 #if FEATURE_STACK_FP_X87
                     /* We may have to recompute FP levels */
                     if  (op1->gtFPlvl || op2->gtFPlvl)
-                        fgFPstLvlRedo = true;
+                        gtFPstLvlRedo = true;
 #endif // FEATURE_STACK_FP_X87
                     break;
 
@@ -4311,7 +4281,7 @@ COMMON_CNS:
 #if FEATURE_STACK_FP_X87
                     /* We may have to recompute FP levels */
                     if  (op1->gtFPlvl || op2->gtFPlvl)
-                        fgFPstLvlRedo = true;
+                        gtFPstLvlRedo = true;
 #endif // FEATURE_STACK_FP_X87
 
                     break;
@@ -4604,6 +4574,252 @@ DONE:
 #pragma warning(pop)
 #endif
 
+#if FEATURE_STACK_FP_X87
+
+/*****************************************************************************/
+void                Compiler::gtComputeFPlvls(GenTreePtr tree)
+{
+    genTreeOps      oper;
+    unsigned        kind;
+    bool            isflt;
+    unsigned        savFPstkLevel;
+
+    noway_assert(tree);
+    noway_assert(tree->gtOper != GT_STMT);
+
+    /* Figure out what kind of a node we have */
+
+    oper  = tree->OperGet();
+    kind  = tree->OperKind();
+    isflt = varTypeIsFloating(tree->TypeGet()) ? 1 : 0;
+
+    /* Is this a constant or leaf node? */
+
+    if  (kind & (GTK_CONST|GTK_LEAF))
+    {
+        codeGen->genFPstkLevel += isflt;
+        goto DONE;
+    }
+
+    /* Is it a 'simple' unary/binary operator? */
+
+    if  (kind & GTK_SMPOP)
+    {
+        GenTreePtr      op1 = tree->gtOp.gtOp1;
+        GenTreePtr      op2 = tree->gtGetOp2();
+
+        /* Check for some special cases */
+
+        switch (oper)
+        {
+        case GT_IND:
+
+            gtComputeFPlvls(op1);
+
+            /* Indirect loads of FP values push a new value on the FP stack */
+
+            codeGen->genFPstkLevel += isflt;
+            goto DONE;
+
+        case GT_CAST:
+
+            gtComputeFPlvls(op1);
+
+            /* Casts between non-FP and FP push on / pop from the FP stack */
+
+            if  (varTypeIsFloating(op1->TypeGet()))
+            {
+                if  (isflt == false)
+                    codeGen->genFPstkLevel--;
+            }
+            else
+            {
+                if  (isflt != false)
+                    codeGen->genFPstkLevel++;
+            }
+
+            goto DONE;
+
+        case GT_LIST:   /* GT_LIST presumably part of an argument list */
+        case GT_COMMA:  /* Comma tosses the result of the left operand */
+
+            savFPstkLevel = codeGen->genFPstkLevel;
+            gtComputeFPlvls(op1);
+            codeGen->genFPstkLevel = savFPstkLevel;
+
+            if  (op2)
+                gtComputeFPlvls(op2);
+
+            goto DONE;
+
+        default:
+            break;
+        }
+
+        if  (!op1)
+        {
+            if  (!op2)
+                goto DONE;
+
+            gtComputeFPlvls(op2);
+            goto DONE;
+        }
+
+        if  (!op2)
+        {
+            gtComputeFPlvls(op1);
+            if (oper == GT_ADDR)
+            {
+                /* If the operand was floating point pop the value from the stack */
+                if (varTypeIsFloating(op1->TypeGet()))
+                {
+                    noway_assert(codeGen->genFPstkLevel);
+                    codeGen->genFPstkLevel--;
+                }
+            }
+
+            // This is a special case to handle the following
+            // optimization: conv.i4(round.d(d)) -> round.i(d)
+
+            if (oper== GT_INTRINSIC && tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Round &&
+                tree->TypeGet()==TYP_INT)
+            {
+                codeGen->genFPstkLevel--;
+            }
+
+            goto DONE;
+        }
+
+        /* FP assignments need a bit special handling */
+
+        if  (isflt && (kind & GTK_ASGOP))
+        {
+            /* The target of the assignment won't get pushed */
+
+            if  (tree->gtFlags & GTF_REVERSE_OPS)
+            {
+                gtComputeFPlvls(op2);
+                gtComputeFPlvls(op1);
+                 op1->gtFPlvl--;
+                codeGen->genFPstkLevel--;
+            }
+            else
+            {
+                gtComputeFPlvls(op1);
+                op1->gtFPlvl--;
+                codeGen->genFPstkLevel--;
+                gtComputeFPlvls(op2);
+            }
+
+            codeGen->genFPstkLevel--;
+            goto DONE;
+        }
+
+        /* Here we have a binary operator; visit operands in proper order */
+
+        if  (tree->gtFlags & GTF_REVERSE_OPS)
+        {
+            gtComputeFPlvls(op2);
+            gtComputeFPlvls(op1);
+        }
+        else
+        {
+            gtComputeFPlvls(op1);
+            gtComputeFPlvls(op2);
+        }
+
+        /*
+            Binary FP operators pop 2 operands and produce 1 result;
+            assignments consume 1 value and don't produce any.
+         */
+
+        if  (isflt)
+            codeGen->genFPstkLevel--;
+
+        /* Float compares remove both operands from the FP stack */
+
+        if  (kind & GTK_RELOP)
+        {
+            if  (varTypeIsFloating(op1->TypeGet()))
+                codeGen->genFPstkLevel -= 2;
+        }
+
+        goto DONE;
+    }
+
+    /* See what kind of a special operator we have here */
+
+    switch  (oper)
+    {
+    case GT_FIELD:
+        gtComputeFPlvls(tree->gtField.gtFldObj);
+        codeGen->genFPstkLevel += isflt;
+        break;
+
+    case GT_CALL:
+
+        if  (tree->gtCall.gtCallObjp)
+            gtComputeFPlvls(tree->gtCall.gtCallObjp);
+
+        if  (tree->gtCall.gtCallArgs)
+        {
+            savFPstkLevel = codeGen->genFPstkLevel;
+            gtComputeFPlvls(tree->gtCall.gtCallArgs);
+            codeGen->genFPstkLevel = savFPstkLevel;
+        }
+
+        if  (tree->gtCall.gtCallLateArgs)
+        {
+            savFPstkLevel = codeGen->genFPstkLevel;
+            gtComputeFPlvls(tree->gtCall.gtCallLateArgs);
+            codeGen->genFPstkLevel = savFPstkLevel;
+        }
+
+        codeGen->genFPstkLevel += isflt;
+        break;
+
+    case GT_ARR_ELEM:
+
+        gtComputeFPlvls(tree->gtArrElem.gtArrObj);
+
+        unsigned dim;
+        for (dim = 0; dim < tree->gtArrElem.gtArrRank; dim++)
+            gtComputeFPlvls(tree->gtArrElem.gtArrInds[dim]);
+
+        /* Loads of FP values push a new value on the FP stack */
+        codeGen->genFPstkLevel += isflt;
+        break;
+
+    case GT_CMPXCHG:
+        //Evaluate the trees left to right
+        gtComputeFPlvls(tree->gtCmpXchg.gtOpLocation);
+        gtComputeFPlvls(tree->gtCmpXchg.gtOpValue);
+        gtComputeFPlvls(tree->gtCmpXchg.gtOpComparand);
+        noway_assert(!isflt);
+        break;
+
+    case GT_ARR_BOUNDS_CHECK:
+        gtComputeFPlvls(tree->gtBoundsChk.gtArrLen);
+        gtComputeFPlvls(tree->gtBoundsChk.gtIndex);
+        noway_assert(!isflt);
+        break;
+
+#ifdef DEBUG
+    default:
+        noway_assert(!"Unhandled special operator in gtComputeFPlvls()");
+        break;
+#endif
+    }
+
+DONE:
+
+    noway_assert((unsigned char)codeGen->genFPstkLevel == codeGen->genFPstkLevel);
+
+    tree->gtFPlvl = (unsigned char)codeGen->genFPstkLevel;
+}
+
+#endif // FEATURE_STACK_FP_X87
+
 
 /*****************************************************************************
  *
@@ -5356,8 +5572,10 @@ GenTreeCall*          Compiler::gtNewCallNode(gtCallTypes     callType,
     node->gtCall.gtEntryPoint.addr = nullptr;
 #endif
 
-#ifdef DEBUG
+#if defined(DEBUG) || defined(INLINE_DATA)
+    // These get updated after call node is built.
     node->gtCall.gtInlineObservation = InlineObservation::CALLEE_UNUSED_INITIAL;
+    node->gtCall.gtRawILOffset = BAD_IL_OFFSET;
 #endif
 
 #ifdef DEBUGGING_SUPPORT
@@ -5630,7 +5848,7 @@ GenTreePtr          Compiler::gtNewAssignNode(GenTreePtr dst, GenTreePtr src DEB
 
     // ARM has HFA struct return values, HFA return values are received in registers from GT_CALL,
     // using struct assignment.
-#ifdef _TARGET_ARM_
+#ifdef FEATURE_HFA
     assert(isPhiDefn || type != TYP_STRUCT || IsHfa(dst) || IsHfa(src));
 #elif defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
     // You need to use GT_COPYBLK for assigning structs
@@ -7386,6 +7604,10 @@ Compiler::gtDispNodeName(GenTree *tree)
     {
         sprintf_s(bufp, sizeof(buf), " %s(h)%c", name, 0);
     }
+    else if (tree->gtOper == GT_PUTARG_STK)
+    {
+        sprintf_s(bufp, sizeof(buf), " %s [+0x%02x]%c", name, tree->AsPutArgStk()->getArgOffset(), 0);
+    }
     else if (tree->gtOper == GT_CALL)
     {
         const char *  callType = "call";
@@ -9021,14 +9243,10 @@ void                Compiler::gtGetArgMsg(GenTreePtr        call,
             {
                 sprintf_s(bufp, bufLength, "arg%d out+%02x%c", argNum, curArgTabEntry->slotNum * TARGET_POINTER_SIZE, 0);
             }
-            else if (listCount == 1)
-            {
-                sprintf_s(bufp, bufLength, "arg%d hi +%02x%c", argNum, (curArgTabEntry->slotNum + 1) * TARGET_POINTER_SIZE, 0);
-            }
-            else
+            else // listCount is 0,1,2 or 3
             {
-                assert(listCount == 0);
-                sprintf_s(bufp, bufLength, "arg%d lo +%02x%c", argNum, (curArgTabEntry->slotNum + 0) * TARGET_POINTER_SIZE, 0);
+                assert(listCount <= MAX_ARG_REG_COUNT);
+                sprintf_s(bufp, bufLength, "arg%d out+%02x%c", argNum, (curArgTabEntry->slotNum + listCount) * TARGET_POINTER_SIZE, 0);
             }
 #else
             sprintf_s(bufp, bufLength, "arg%d on STK%c", argNum, 0);
@@ -9090,22 +9308,29 @@ void                Compiler::gtGetLateArgMsg(GenTreePtr        call,
         }
         else
         {
-#ifdef _TARGET_ARM64_
-            if (curArgTabEntry->numRegs == 2)
+#if FEATURE_MULTIREG_ARGS
+            if (curArgTabEntry->numRegs >= 2)
             {
-                regNumber argReg2 = REG_NEXT(argReg);
+                regNumber otherRegNum;
+#if defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+                assert(curArgTabEntry->numRegs == 2);
+                otherRegNum = curArgTabEntry->otherRegNum;
+#else 
+                otherRegNum = (regNumber)(((unsigned)curArgTabEntry->regNum) + curArgTabEntry->numRegs - 1);
+#endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
+
                 if (listCount == -1)
                 {
-                    sprintf_s(bufp, bufLength, "arg%d %s,%s%c", curArgTabEntry->argNum, compRegVarName(argReg), compRegVarName(argReg2), 0);
-                }
-                else if (listCount == 1)
-                {
-                    sprintf_s(bufp, bufLength, "arg%d hi %s%c", curArgTabEntry->argNum, compRegVarName(argReg2), 0);
+                    char seperator = (curArgTabEntry->numRegs == 2) ? ',' : '-';
+
+                    sprintf_s(bufp, bufLength, "arg%d %s%c%s%c", curArgTabEntry->argNum, 
+                        compRegVarName(argReg), seperator, compRegVarName(otherRegNum), 0);
                 }
-                else 
+                else // listCount is 0,1,2 or 3
                 {
-                    assert(listCount == 0);
-                    sprintf_s(bufp, bufLength, "arg%d lo %s%c", curArgTabEntry->argNum, compRegVarName(argReg), 0);
+                    assert(listCount <= MAX_ARG_REG_COUNT);
+                    regNumber curReg = (listCount == 1) ? otherRegNum : (regNumber)((unsigned)(argReg)+listCount);
+                    sprintf_s(bufp, bufLength, "arg%d m%d %s%c", curArgTabEntry->argNum, listCount, compRegVarName(curReg), 0);
                 }
             }
             else
@@ -13786,7 +14011,9 @@ void ReturnTypeDesc::Initialize(Compiler* comp, CORINFO_CLASS_HANDLE retClsHnd)
 //     and yet to be implemented for other multi-reg return
 //     targets (Arm64/Arm32/x86).
 //
-// TODO-ARM: Implement this routine to support HFA returns.
+// TODO-ARM:   Implement this routine to support HFA returns.
+// TODO-ARM64: Implement this routine to support HFA returns.
+// TODO-X86:   Implement this routine to support long returns.
 regNumber ReturnTypeDesc::GetABIReturnReg(unsigned idx)
 {
     unsigned count = GetReturnRegCount();
@@ -13869,7 +14096,9 @@ regNumber ReturnTypeDesc::GetABIReturnReg(unsigned idx)
 //    This routine can be used when the caller is not particular about the order
 //    of return registers and wants to know the set of return registers.
 //
-// TODO-ARM: Implement this routine to support HFA returns.
+// TODO-ARM:   Implement this routine to support HFA returns.
+// TODO-ARM64: Implement this routine to support HFA returns.
+// TODO-X86:   Implement this routine to support long returns.
 //
 //static
 regMaskTP ReturnTypeDesc::GetABIReturnRegs()
index 3969597..e2b14bf 100644 (file)
@@ -2914,11 +2914,14 @@ struct GenTreeCall final : public GenTree
     CORINFO_CONST_LOOKUP gtEntryPoint;
 #endif
 
-#ifdef DEBUG
+#if defined(DEBUG) || defined(INLINE_DATA)
     // For non-inline candidates, track the first observation
     // that blocks candidacy.
     InlineObservation gtInlineObservation;
-#endif
+
+    // IL offset of the call wrt its parent method.
+    IL_OFFSET gtRawILOffset;
+#endif // defined(DEBUG) || defined(INLINE_DATA)
 
     GenTreeCall(var_types type) : 
         GenTree(GT_CALL, type) 
index ff2ffdc..b79226a 100755 (executable)
@@ -4545,7 +4545,7 @@ GenTreePtr Compiler::impImportLdvirtftn (GenTreePtr thisPtr,
     return gtNewHelperCallNode( CORINFO_HELP_VIRTUAL_FUNC_PTR, TYP_I_IMPL, GTF_EXCEPT, helpArgs);
 }
 
-                    
+
 /*****************************************************************************
  *
  *  Build and import a box node
@@ -4693,6 +4693,148 @@ void           Compiler::impImportAndPushBox (CORINFO_RESOLVED_TOKEN * pResolved
     impPushOnStack(op1, tiRetVal);
 }
 
+//------------------------------------------------------------------------
+// impImportNewObjArray: Build and import `new` of multi-dimmensional array
+//
+// Arguments:
+//    pResolvedToken - The CORINFO_RESOLVED_TOKEN that has been initialized
+//                     by a call to CEEInfo::resolveToken().
+//    pCallInfo - The CORINFO_CALL_INFO that has been initialized
+//                by a call to CEEInfo::getCallInfo().
+//
+// Assumptions:
+//    The multi-dimensional array constructor arguments (array dimensions) are
+//    pushed on the IL stack on entry to this method.
+//
+// Notes:
+//    Multi-dimensional array constructors are imported as calls to a JIT 
+//    helper, not as regular calls.
+
+void Compiler::impImportNewObjArray(CORINFO_RESOLVED_TOKEN* pResolvedToken,
+                                    CORINFO_CALL_INFO* pCallInfo)
+{
+    GenTreePtr classHandle = impParentClassTokenToHandle(pResolvedToken);
+    if (classHandle == nullptr) // compDonotInline()
+        return;
+
+    assert(pCallInfo->sig.numArgs);
+
+    GenTreePtr node;
+    GenTreeArgList* args;
+
+    //
+    // There are two different JIT helpers that can be used to allocate 
+    // multi-dimensional arrays:
+    //
+    // - CORINFO_HELP_NEW_MDARR - takes the array dimensions as varargs.
+    //      This variant is deprecated. It should be eventually removed.
+    //
+    // - CORINFO_HELP_NEW_MDARR_NONVARARG - takes the array dimensions as
+    //      pointer to block of int32s. This variant is more portable.
+    //
+    // The non-varargs helper is enabled for CoreRT only for now. Enabling this 
+    // unconditionally would require ReadyToRun version bump.
+    //
+
+#if COR_JIT_EE_VERSION > 460
+    if (!opts.IsReadyToRun() || (eeGetEEInfo()->targetAbi == CORINFO_CORERT_ABI))
+    {
+        LclVarDsc* newObjArrayArgsVar;
+
+        // Reuse the temp used to pass the array dimensions to avoid bloating
+        // the stack frame in case there are multiple calls to multi-dim array 
+        // constructors within a single method.
+        if (lvaNewObjArrayArgs == BAD_VAR_NUM)
+        {
+            lvaNewObjArrayArgs = lvaGrabTemp(false DEBUGARG("NewObjArrayArgs"));
+            lvaTable[lvaNewObjArrayArgs].lvType = TYP_BLK;
+            lvaTable[lvaNewObjArrayArgs].lvExactSize = 0;
+        }
+
+        // Increase size of lvaNewObjArrayArgs to be the largest size needed to hold 'numArgs' integers
+        // for our call to CORINFO_HELP_NEW_MDARR_NONVARARG.
+        lvaTable[lvaNewObjArrayArgs].lvExactSize = 
+            max(lvaTable[lvaNewObjArrayArgs].lvExactSize, pCallInfo->sig.numArgs * sizeof(INT32));
+
+        // The side-effects may include allocation of more multi-dimensional arrays. Spill all side-effects
+        // to ensure that the shared lvaNewObjArrayArgs local variable is only ever used to pass arguments
+        // to one allocation at a time.
+        impSpillSideEffects(true, (unsigned)CHECK_SPILL_ALL DEBUGARG("impImportNewObjArray"));
+
+        //
+        // The arguments of the CORINFO_HELP_NEW_MDARR_NONVARARG helper are:
+        //  - Array class handle
+        //  - Number of dimension arguments
+        //  - Pointer to block of int32 dimensions - address  of lvaNewObjArrayArgs temp.
+        //
+
+        node = gtNewLclvNode(lvaNewObjArrayArgs, TYP_BLK);
+        node = gtNewOperNode(GT_ADDR, TYP_I_IMPL, node);
+
+        // Pop dimension arguments from the stack one at a time and store it 
+        // into lvaNewObjArrayArgs temp.
+        for (int i = pCallInfo->sig.numArgs - 1; i >= 0; i--)
+        {
+            GenTreePtr arg = impImplicitIorI4Cast(impPopStack().val, TYP_INT);
+
+            GenTreePtr dest = gtNewLclvNode(lvaNewObjArrayArgs, TYP_BLK);
+            dest = gtNewOperNode(GT_ADDR, TYP_I_IMPL, dest);
+            dest = gtNewOperNode(GT_ADD, TYP_I_IMPL, dest, 
+                new (this, GT_CNS_INT) GenTreeIntCon(TYP_I_IMPL, sizeof(INT32) * i));
+            dest = gtNewOperNode(GT_IND, TYP_INT, dest);
+
+            node = gtNewOperNode(GT_COMMA, node->TypeGet(), gtNewAssignNode(dest, arg), node);
+        }
+
+        args = gtNewArgList(node);
+
+        // pass number of arguments to the helper
+        args = gtNewListNode(gtNewIconNode(pCallInfo->sig.numArgs), args);
+
+        args = gtNewListNode(classHandle, args);
+
+        node = gtNewHelperCallNode(CORINFO_HELP_NEW_MDARR_NONVARARG, TYP_REF, 0, args);
+    }
+    else
+#endif
+    {
+        //
+        // The varargs helper needs the type and method handles as last
+        // and  last-1 param (this is a cdecl call, so args will be
+        // pushed in reverse order on the CPU stack)
+        //
+
+        args = gtNewArgList(classHandle);
+
+        // pass number of arguments to the helper
+        args = gtNewListNode(gtNewIconNode(pCallInfo->sig.numArgs), args);
+
+        unsigned argFlags = 0;
+        args = impPopList(pCallInfo->sig.numArgs, &argFlags, &pCallInfo->sig, args);
+
+        node = gtNewHelperCallNode(CORINFO_HELP_NEW_MDARR, TYP_REF, 0, args);
+
+        // varargs, so we pop the arguments
+        node->gtFlags |= GTF_CALL_POP_ARGS;
+
+#ifdef DEBUG
+        // At the present time we don't track Caller pop arguments
+        // that have GC references in them
+        for (GenTreeArgList* temp = args; temp; temp = temp->Rest())
+        {
+            assert(temp->Current()->gtType != TYP_REF);
+        }
+#endif
+    }
+
+    node->gtFlags |= args->gtFlags & GTF_GLOB_EFFECT;
+
+    // Remember that this basic block contains 'new' of a md array
+    compCurBB->bbFlags |= BBF_HAS_NEWARRAY;
+
+    impPushOnStack(node, typeInfo(TI_REF, pResolvedToken->hClass));
+}
+
 GenTreePtr Compiler::impTransformThis (GenTreePtr thisPtr,
                                        CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken,
                                        CORINFO_THIS_TRANSFORM transform)
@@ -5570,46 +5712,58 @@ bool                Compiler::impIsImplicitTailCallCandidate(OPCODE opcode,
 #endif  //FEATURE_TAILCALL_OPT    
 }
 
-/*****************************************************************************
- *
- *  Import the call instructions.
- *  For CEE_NEWOBJ, newobjThis should be the temp grabbed for the allocated
- *     uninitalized object.
- */
+//------------------------------------------------------------------------
+// impImportCall: import a call-inspiring opcode
+//
+// Arguments:
+//    opcode                    - opcode that inspires the call
+//    pResolvedToken            - resolved token for the call target
+//    pConstrainedResolvedToken - resolved constraint token (or nullptr)
+//    newObjThis                - tree for this pointer or uninitalized newobj temp (or nullptr)
+//    prefixFlags               - IL prefix flags for the call
+//    callInfo                  - EE supplied info for the call
+//    rawILOffset               - IL offset of the opcode
+//
+// Returns:
+//    Type of the call's return value.
+//
+// Notes:
+//    opcode can be CEE_CALL, CEE_CALLI, CEE_CALLVIRT, or CEE_NEWOBJ.
+//
+//    For CEE_NEWOBJ, newobjThis should be the temp grabbed for the allocated
+//    uninitalized object.
 
 #ifdef _PREFAST_
 #pragma warning(push)
 #pragma warning(disable:21000) // Suppress PREFast warning about overly large function
 #endif
 
-var_types           Compiler::impImportCall (OPCODE         opcode,
-                                             CORINFO_RESOLVED_TOKEN * pResolvedToken,
-                                             CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken, // Is this a "constrained." call on a type parameter?
-                                             GenTreePtr     newobjThis,
-                                             int            prefixFlags,
-                                             CORINFO_CALL_INFO * callInfo,
-                                             IL_OFFSETX     ilOffset)
+var_types  Compiler::impImportCall(OPCODE                  opcode,
+                                   CORINFO_RESOLVED_TOKEN* pResolvedToken,
+                                   CORINFO_RESOLVED_TOKEN* pConstrainedResolvedToken,
+                                   GenTreePtr              newobjThis,
+                                   int                     prefixFlags,
+                                   CORINFO_CALL_INFO*      callInfo,
+                                   IL_OFFSET               rawILOffset)
 {
     assert(opcode == CEE_CALL   || opcode == CEE_CALLVIRT ||
            opcode == CEE_NEWOBJ || opcode == CEE_CALLI);
 
+    IL_OFFSETX              ilOffset    = impCurILOffset(rawILOffset, true);
     var_types               callRetTyp  = TYP_COUNT;
     CORINFO_SIG_INFO*       sig         = nullptr;
     CORINFO_METHOD_HANDLE   methHnd     = nullptr;
     CORINFO_CLASS_HANDLE    clsHnd      = nullptr;
-
     unsigned                clsFlags    = 0;
     unsigned                mflags      = 0;
     unsigned                argFlags    = 0;
     GenTreePtr              call        = nullptr;
     GenTreeArgList*         args        = nullptr;
     CORINFO_THIS_TRANSFORM  constraintCallThisTransform = CORINFO_NO_THIS_TRANSFORM;
-
     CORINFO_CONTEXT_HANDLE  exactContextHnd = 0;
     BOOL                    exactContextNeedsRuntimeLookup = FALSE;
     bool                    canTailCall = true;
     const char*             szCanTailCallFailReason = nullptr;
-
     int                     tailCall     = prefixFlags & PREFIX_TAILCALL;
     bool                    readonlyCall = (prefixFlags & PREFIX_READONLY) != 0;
 
@@ -5693,7 +5847,7 @@ var_types           Compiler::impImportCall (OPCODE         opcode,
         // supply the instantiation parameters necessary to make direct calls to underlying
         // shared generic code, rather than calling through instantiating stubs.  If the 
         // returned signature has CORINFO_CALLCONV_PARAMTYPE then this indicates that the JIT
-        // must indeed pass an instantaition parameter.
+        // must indeed pass an instantiation parameter.
 
         methHnd = callInfo->hMethod;
 
@@ -6554,6 +6708,14 @@ var_types           Compiler::impImportCall (OPCODE         opcode,
                 
             if (!bIntrinsicImported)
             {
+
+#if defined(DEBUG) || defined(INLINE_DATA)
+
+                // Keep track of the raw IL offset of the call
+                call->gtCall.gtRawILOffset = rawILOffset;
+
+#endif // defined(DEBUG) || defined(INLINE_DATA)
+
                 // Is it an inline candidate?
                 impMarkInlineCandidate(call, exactContextHnd, callInfo);
             }
@@ -6770,6 +6932,14 @@ DONE_CALL:
             }
         }
 
+
+#if defined(DEBUG) || defined(INLINE_DATA)
+
+        // Keep track of the raw IL offset of the call
+        call->gtCall.gtRawILOffset = rawILOffset;
+
+#endif // defined(DEBUG) || defined(INLINE_DATA)
+
         // Is it an inline candidate?        
         impMarkInlineCandidate(call, exactContextHnd, callInfo);
     }
@@ -6928,13 +7098,13 @@ bool  Compiler::impMethodInfo_hasRetBuffArg(CORINFO_METHOD_INFO * methInfo)
     // Support for any additional cases that don't use a Return Buffer Argument
     //  on targets that support multi-reg return valuetypes.
     //
-  #ifdef _TARGET_ARM_
+  #ifdef FEATURE_HFA
     // On ARM HFAs are returned in registers.
     if (!info.compIsVarArgs && IsHfa(methInfo->args.retTypeClass))
     {
         return false;
     }
-  #endif
+  #endif // FEATURE_HFA
 
 #endif // FEATURE_MULTIREG_RET
 
@@ -7026,9 +7196,10 @@ GenTreePtr                Compiler::impFixupCallStructReturn(GenTreePtr     call
 
     call->gtCall.gtRetClsHnd = retClsHnd;
 
-#ifdef _TARGET_ARM_
+#if FEATURE_MULTIREG_RET && defined(FEATURE_HFA)
     // There is no fixup necessary if the return type is a HFA struct.
-    // HFA structs are returned in registers s0-s3 or d0-d3 in ARM.
+    // HFA structs are returned in registers for ARM32 and ARM64
+    //
     if (!call->gtCall.IsVarargs() && IsHfa(retClsHnd))
     {
         if (call->gtCall.CanTailCall())
@@ -7216,7 +7387,7 @@ GenTreePtr          Compiler::impFixupStructReturnType(GenTreePtr op, CORINFO_CL
     assert(info.compRetNativeType != TYP_STRUCT);
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
 
-#elif defined(_TARGET_ARM_)
+#elif FEATURE_MULTIREG_RET && defined(FEATURE_HFA)
     if (!info.compIsVarArgs && IsHfa(retClsHnd))
     {
         if (op->gtOper == GT_LCL_VAR)
@@ -7244,7 +7415,7 @@ GenTreePtr          Compiler::impFixupStructReturnType(GenTreePtr op, CORINFO_CL
         }
         return impAssignMultiRegTypeToVar(op, retClsHnd);
     }
-#endif //_TARGET_ARM_
+#endif //  FEATURE_MULTIREG_RET && FEATURE_HFA
 
 REDO_RETURN_NODE:
     // adjust the type away from struct to integral
@@ -9509,7 +9680,7 @@ RET:
             //All calls and delegates need a security callout.
             impHandleAccessAllowed(callInfo.accessAllowed, &callInfo.callsiteCalloutHelper);
 
-            callTyp = impImportCall(CEE_CALL, &resolvedToken, NULL, NULL, PREFIX_TAILCALL_EXPLICIT, &callInfo, impCurILOffset(opcodeOffs, true));
+            callTyp = impImportCall(CEE_CALL, &resolvedToken, NULL, NULL, PREFIX_TAILCALL_EXPLICIT, &callInfo, opcodeOffs);
 
             // And finish with the ret
             goto RET;
@@ -11338,56 +11509,10 @@ DO_LDFTN:
                 // Arrays need to call the NEWOBJ helper.
                 assertImp(clsFlags & CORINFO_FLG_VAROBJSIZE);
 
-                /* The varargs helper needs the type and method handles as last
-                   and  last-1 param (this is a cdecl call, so args will be
-                   pushed in reverse order on the CPU stack) */
-
-                op1 = impParentClassTokenToHandle(&resolvedToken);
-                if (op1 == NULL) // compDonotInline()
+                impImportNewObjArray(&resolvedToken, &callInfo);
+                if (compDonotInline())
                     return;
 
-                args = gtNewArgList(op1);
-
-                // pass number of arguments to the helper
-                op2 = gtNewIconNode(callInfo.sig.numArgs);
-
-                args = gtNewListNode(op2, args);
-
-                assertImp(callInfo.sig.numArgs);
-                if (compIsForInlining())
-                {
-                    if (varTypeIsComposite(JITtype2varType(callInfo.sig.retType)) && callInfo.sig.retTypeClass == NULL)
-                    {
-                        compInlineResult->NoteFatal(InlineObservation::CALLEE_RETURN_TYPE_IS_COMPOSITE);
-                        return;
-                    }
-                }
-             
-                flags = 0;
-                args = impPopList(callInfo.sig.numArgs, &flags, &callInfo.sig, args);
-
-                op1 = gtNewHelperCallNode(  CORINFO_HELP_NEW_MDARR,
-                                            TYP_REF, 0,
-                                            args );
-
-                /* Remember that this basic block contains 'new' of a md array */
-                block->bbFlags |= BBF_HAS_NEWARRAY;
-
-                // varargs, so we pop the arguments
-                op1->gtFlags |= GTF_CALL_POP_ARGS;
-
-#ifdef DEBUG
-                // At the present time we don't track Caller pop arguments
-                // that have GC references in them
-                for (GenTreeArgList* temp = args; temp; temp = temp->Rest())
-                {
-                    assertImp(temp->Current()->gtType != TYP_REF);
-                }
-#endif
-                op1->gtFlags |= args->gtFlags & GTF_GLOB_EFFECT;
-
-                impPushOnStack(op1, typeInfo(TI_REF, resolvedToken.hClass));
-
                 callTyp = TYP_REF;
                 break;
             }
@@ -11681,7 +11806,7 @@ DO_LDFTN:
 #endif // FEATURE_CORECLR
             }
 
-            callTyp = impImportCall(opcode, &resolvedToken, constraintCall ? &constrainedResolvedToken : nullptr, newObjThisPtr, prefixFlags, &callInfo, impCurILOffset(opcodeOffs, true));
+            callTyp = impImportCall(opcode, &resolvedToken, constraintCall ? &constrainedResolvedToken : nullptr, newObjThisPtr, prefixFlags, &callInfo, opcodeOffs);
             if (compDonotInline())
             {
                 return;
@@ -13212,8 +13337,6 @@ INITBLK_OR_INITOBJ:
 
         case CEE_CPBLK:
 
-            assert(!compIsForInlining());
-                        
             if (tiVerificationNeeded)
                 Verify(false, "bad opcode");
             op3 = impPopStack().val;        // Size
@@ -13652,7 +13775,7 @@ void Compiler::impLoadLoc(unsigned ilLclNum, IL_OFFSET offset)
     }            
 }
 
-#if defined(_TARGET_ARM_)
+#ifdef _TARGET_ARM_
 /**************************************************************************************
  *
  *  When assigning a vararg call src to a HFA lcl dest, mark that we cannot promote the
@@ -13674,7 +13797,7 @@ void Compiler::impMarkLclDstNotPromotable(unsigned tmpNum, GenTreePtr src, CORIN
 {
     if (src->gtOper == GT_CALL && src->gtCall.IsVarargs() && IsHfa(hClass))
     {
-        int hfaSlots = GetHfaSlots(hClass);
+        int hfaSlots = GetHfaCount(hClass);
         var_types hfaType = GetHfaType(hClass);
 
         // If we have varargs we morph the method's return type to be "int" irrespective of its original
@@ -13690,16 +13813,16 @@ void Compiler::impMarkLclDstNotPromotable(unsigned tmpNum, GenTreePtr src, CORIN
         }
     }
 }
-#endif
+#endif // _TARGET_ARM_
 
 #if FEATURE_MULTIREG_RET
 GenTreePtr Compiler::impAssignMultiRegTypeToVar(GenTreePtr op, CORINFO_CLASS_HANDLE hClass)
 {
     unsigned tmpNum = lvaGrabTemp(true DEBUGARG("Return value temp for multireg return."));
-    impAssignTempGen(tmpNum, op, hClass, (unsigned) CHECK_SPILL_NONE);
+    impAssignTempGen(tmpNum, op, hClass, (unsigned)CHECK_SPILL_NONE);
     GenTreePtr ret = gtNewLclvNode(tmpNum, op->gtType);
 
-#ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
+#ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING 
     // If single eightbyte, the return type would have been normalized and there won't be a temp var.
     // This code will be called only if the struct return has not been normalized (i.e. 2 eightbytes - max allowed.)
     assert(IsMultiRegReturnedType(hClass));
@@ -13712,7 +13835,7 @@ GenTreePtr Compiler::impAssignMultiRegTypeToVar(GenTreePtr op, CORINFO_CLASS_HAN
 
     return ret;
 }
-#endif // FEATURE_MULTIREG_RET
+#endif // FEATURE_MULTIREG_RET 
 
 // do import for a return
 // returns false if inlining was aborted
@@ -13951,7 +14074,7 @@ bool Compiler::impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &
                 if (IsHfa(retClsHnd))
                 {
                     // Same as !IsHfa but just don't bother with impAssignStructPtr.
-#else // !defined(_TARGET_ARM_)
+#else // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
                 ReturnTypeDesc retTypeDesc;
                 retTypeDesc.Initialize(this, retClsHnd);
                 unsigned retRegCount = retTypeDesc.GetReturnRegCount();
@@ -13962,7 +14085,7 @@ bool Compiler::impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &
                     // This code will be called only if the struct return has not been normalized (i.e. 2 eightbytes - max allowed.)
                     assert(retRegCount == MAX_RET_REG_COUNT);
                     // Same as !structDesc.passedInRegisters but just don't bother with impAssignStructPtr.
-#endif // !defined(_TARGET_ARM_)
+#endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
 
                     if (lvaInlineeReturnSpillTemp != BAD_VAR_NUM)
                     {
@@ -13970,10 +14093,10 @@ bool Compiler::impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &
                         {
 #if defined(_TARGET_ARM_)
                             impInlineInfo->retExpr = gtNewLclvNode(lvaInlineeReturnSpillTemp, info.compRetType);
-#else // !defined(_TARGET_ARM_)
+#else // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
                             // The inlinee compiler has figured out the type of the temp already. Use it here.
                             impInlineInfo->retExpr = gtNewLclvNode(lvaInlineeReturnSpillTemp, lvaTable[lvaInlineeReturnSpillTemp].lvType);
-#endif // !defined(_TARGET_ARM_)
+#endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
                         }
                     }
                     else
@@ -13998,7 +14121,7 @@ bool Compiler::impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &
                     }
                 }
                 else
-#endif // defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#endif // defined(_TARGET_ARM64_)
                 {
                     assert(iciCall->AsCall()->HasRetBufArg());
                     GenTreePtr dest = gtCloneExpr(iciCall->gtCall.gtCallArgs->gtOp.gtOp1);   
@@ -14065,10 +14188,9 @@ bool Compiler::impReturnInstruction(BasicBlock *block, int prefixFlags, OPCODE &
     }
     else if (varTypeIsStruct(info.compRetType))
     {
-#if !defined(_TARGET_ARM_) && !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-        // In ARM HFA native types are maintained as structs.
-        // The multi register System V AMD64 return structs are also left as structs and not normalized.
-        // TODO-ARM64-NYI: HFA
+#if !FEATURE_MULTIREG_RET
+        // For both ARM architectures the HFA native types are maintained as structs.
+        // Also on System V AMD64 the multireg structs returns are also left as structs.
         noway_assert(info.compRetNativeType != TYP_STRUCT);
 #endif
         op2 = impFixupStructReturnType(op2, retClsHnd);
index f9feeec..146ef05 100644 (file)
@@ -443,7 +443,7 @@ void InlineContext::DumpData(unsigned indent)
     if (m_Parent == nullptr)
     {
         // Root method... cons up a policy so we can display the name
-        InlinePolicy* policy = InlinePolicy::GetPolicy(compiler, nullptr, true);
+        InlinePolicy* policy = InlinePolicy::GetPolicy(compiler, true);
         printf("\nInlines [%u] into \"%s\" [%s]\n",
                m_InlineStrategy->GetInlineCount(),
                calleeName,
@@ -549,17 +549,17 @@ void InlineContext::DumpXml(FILE* file, unsigned indent)
 // Arguments:
 //   compiler      - the compiler instance examining a call for inlining
 //   call          - the call in question
-//   inlineContext - the inline context for the inline, if known
+//   stmt          - statement containing the call (if known)
 //   description   - string describing the context of the decision
 
 InlineResult::InlineResult(Compiler*      compiler,
                            GenTreeCall*   call,
-                           InlineContext* inlineContext,
+                           GenTreeStmt*   stmt,
                            const char*    description)
     : m_RootCompiler(nullptr)
     , m_Policy(nullptr)
     , m_Call(call)
-    , m_InlineContext(inlineContext)
+    , m_InlineContext(nullptr)
     , m_Caller(nullptr)
     , m_Callee(nullptr)
     , m_Description(description)
@@ -570,7 +570,20 @@ InlineResult::InlineResult(Compiler*      compiler,
 
     // Set the policy
     const bool isPrejitRoot = false;
-    m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, m_InlineContext, isPrejitRoot);
+    m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, isPrejitRoot);
+
+    // Pass along some optional information to the policy.
+    if (stmt != nullptr)
+    {
+        m_InlineContext = stmt->gtInlineContext;
+        m_Policy->NoteContext(m_InlineContext);
+
+#if defined(DEBUG) || defined(INLINE_DATA)
+        m_Policy->NoteOffset(call->gtRawILOffset);
+#else
+        m_Policy->NoteOffset(stmt->gtStmtILoffsx);
+#endif // defined(DEBUG) || defined(INLINE_DATA)
+    }
 
     // Get method handle for caller. Note we use the
     // handle for the "immediate" caller here.
@@ -616,7 +629,7 @@ InlineResult::InlineResult(Compiler*              compiler,
 
     // Set the policy
     const bool isPrejitRoot = true;
-    m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, nullptr, isPrejitRoot);
+    m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, isPrejitRoot);
 }
 
 //------------------------------------------------------------------------
@@ -1095,6 +1108,8 @@ InlineContext* InlineStrategy::NewSuccess(InlineInfo* inlineInfo)
     calleeContext->m_Callee = inlineInfo->fncHandle;
     // +1 here since we set this before calling NoteOutcome.
     calleeContext->m_Ordinal = m_InlineCount + 1;
+    // Update offset with more accurate info
+    calleeContext->m_Offset = inlineInfo->inlineResult->GetCall()->gtRawILOffset;
 
 #endif // defined(DEBUG) || defined(INLINE_DATA)
 
@@ -1157,6 +1172,13 @@ InlineContext* InlineStrategy::NewFailure(GenTree*      stmt,
     failedContext->m_Callee = inlineResult->GetCallee();
     failedContext->m_Success = false;
 
+#if defined(DEBUG) || defined(INLINE_DATA)
+
+    // Update offset with more accurate info
+    failedContext->m_Offset = inlineResult->GetCall()->gtRawILOffset;
+
+#endif // #if defined(DEBUG) || defined(INLINE_DATA)
+
 #if defined(DEBUG)
 
     failedContext->m_TreeID = inlineResult->GetCall()->gtTreeID;
@@ -1266,7 +1288,7 @@ void InlineStrategy::DumpDataEnsurePolicyIsSet()
     if (m_LastSuccessfulPolicy == nullptr)
     {
         const bool isPrejitRoot = (opts.eeFlags & CORJIT_FLG_PREJIT) != 0;
-        m_LastSuccessfulPolicy = InlinePolicy::GetPolicy(m_Compiler, nullptr, isPrejitRoot);
+        m_LastSuccessfulPolicy = InlinePolicy::GetPolicy(m_Compiler, isPrejitRoot);
 
         // Add in a bit of data....
         const bool isForceInline = (info.compFlags & CORINFO_FLG_FORCEINLINE) != 0;
@@ -1394,6 +1416,14 @@ void InlineStrategy::DumpXml(FILE* file, unsigned indent)
         s_HasDumpedXmlHeader = true;
     }
 
+    // If we're dumping "minimal" Xml, and we didn't do
+    // any inlines into this method, then there's nothing
+    // to emit here.
+    if ((m_InlineCount == 0) && (JitConfig.JitInlineDumpXml() == 2))
+    {
+        return;
+    }
+
     // Cache references to compiler substructures.
     const Compiler::Info& info = m_Compiler->info;
     const Compiler::Options& opts = m_Compiler->opts;
index 4ee03bb..b8a227a 100644 (file)
@@ -56,7 +56,6 @@ INLINE_OBSERVATION(NEEDS_SECURITY_CHECK,      bool,   "needs security check",
 INLINE_OBSERVATION(NO_METHOD_INFO,            bool,   "cannot get method info",        FATAL,       CALLEE)
 INLINE_OBSERVATION(NOT_PROFITABLE_INLINE,     bool,   "unprofitable inline",           FATAL,       CALLEE)
 INLINE_OBSERVATION(RANDOM_REJECT,             bool,   "random reject",                 FATAL,       CALLEE)
-INLINE_OBSERVATION(RETURN_TYPE_IS_COMPOSITE,  bool,   "has composite return type",     FATAL,       CALLEE)
 INLINE_OBSERVATION(STACK_CRAWL_MARK,          bool,   "uses stack crawl mark",         FATAL,       CALLEE)
 INLINE_OBSERVATION(STFLD_NEEDS_HELPER,        bool,   "stfld needs helper",            FATAL,       CALLEE)
 INLINE_OBSERVATION(THROW_WITH_INVALID_STACK,  bool,   "throw with invalid stack",      FATAL,       CALLEE)
index d25152b..effe421 100644 (file)
@@ -218,7 +218,7 @@ class InlinePolicy
 public:
 
     // Factory method for getting policies
-    static InlinePolicy* GetPolicy(Compiler* compiler, InlineContext* context, bool isPrejitRoot);
+    static InlinePolicy* GetPolicy(Compiler* compiler, bool isPrejitRoot);
 
     // Obligatory virtual dtor
     virtual ~InlinePolicy() {}
@@ -235,6 +235,10 @@ public:
     virtual void NoteFatal(InlineObservation obs) = 0;
     virtual void NoteInt(InlineObservation obs, int value) = 0;
 
+    // Optional observations. Most policies ignore these.
+    virtual void NoteContext(InlineContext* context) { (void) context; }
+    virtual void NoteOffset(IL_OFFSETX offset) { (void) offset; }
+
     // Policy determinations
     virtual void DetermineProfitability(CORINFO_METHOD_INFO* methodInfo) = 0;
 
@@ -289,7 +293,7 @@ public:
     // particular call for inlining.
     InlineResult(Compiler*              compiler,
                  GenTreeCall*           call,
-                 InlineContext*         inlineContext,
+                 GenTreeStmt*           stmt,
                  const char*            description);
 
     // Construct a new InlineResult to evaluate a particular
@@ -622,6 +626,12 @@ public:
         return m_CodeSizeEstimate;
     }
 
+    // Get the offset of the call site
+    IL_OFFSETX GetOffset() const
+    {
+        return m_Offset;
+    }
+
     // True if this is the root context
     bool IsRoot() const
     {
index 332ffe0..0f1bd0c 100644 (file)
@@ -15,7 +15,6 @@
 //
 // Arguments:
 //    compiler      - the compiler instance that will evaluate inlines
-//    inlineContext - the context of the inline
 //    isPrejitRoot  - true if this policy is evaluating a prejit root
 //
 // Return Value:
 //    Determines which of the various policies should apply,
 //    and creates (or reuses) a policy instance to use.
 
-InlinePolicy* InlinePolicy::GetPolicy(Compiler* compiler, InlineContext* inlineContext, bool isPrejitRoot)
+InlinePolicy* InlinePolicy::GetPolicy(Compiler* compiler, bool isPrejitRoot)
 {
 
-    // inlineContext only conditionally used below.
-    (void) inlineContext;
-
 #ifdef DEBUG
 
     // Optionally install the RandomPolicy.
@@ -52,7 +48,7 @@ InlinePolicy* InlinePolicy::GetPolicy(Compiler* compiler, InlineContext* inlineC
 
     if (useReplayPolicy)
     {
-        return new (compiler, CMK_Inlining) ReplayPolicy(compiler, inlineContext, isPrejitRoot);
+        return new (compiler, CMK_Inlining) ReplayPolicy(compiler, isPrejitRoot);
     }
 
     // Optionally install the SizePolicy.
@@ -2078,12 +2074,11 @@ CritSecObject ReplayPolicy::s_XmlReaderLock;
 //
 // Arguments:
 //    compiler -- compiler instance doing the inlining (root compiler)
-//    inlineContext -- inline context for the inline
 //    isPrejitRoot -- true if this compiler is prejitting the root method
 
-ReplayPolicy::ReplayPolicy(Compiler* compiler, InlineContext* inlineContext, bool isPrejitRoot)
+ReplayPolicy::ReplayPolicy(Compiler* compiler, bool isPrejitRoot)
     : DiscretionaryPolicy(compiler, isPrejitRoot)
-    , m_InlineContext(inlineContext)
+    , m_InlineContext(nullptr)
 {
     // Is there a log file open already? If so, we can use it.
     if (s_ReplayFile == nullptr)
@@ -2266,8 +2261,9 @@ bool ReplayPolicy::FindContext(InlineContext* context)
     unsigned contextHash =
         m_RootCompiler->info.compCompHnd->getMethodHash(
             context->GetCallee());
+    unsigned contextOffset = (unsigned) context->GetOffset();
 
-    return FindInline(contextToken, contextHash);
+    return FindInline(contextToken, contextHash, contextOffset);
 }
 
 //------------------------------------------------------------------------
@@ -2276,6 +2272,7 @@ bool ReplayPolicy::FindContext(InlineContext* context)
 // Arguments:
 //    token -- token describing the inline
 //    hash  -- hash describing the inline
+//    offset -- IL offset of the call site in the parent method
 //
 // ReturnValue:
 //    true if the inline entry was found
@@ -2288,7 +2285,7 @@ bool ReplayPolicy::FindContext(InlineContext* context)
 //    particular inline, if there are multiple calls to the same
 //    method.
 
-bool ReplayPolicy::FindInline(unsigned token, unsigned hash)
+bool ReplayPolicy::FindInline(unsigned token, unsigned hash, unsigned offset)
 {
     char buffer[256];
     bool foundInline = false;
@@ -2361,11 +2358,10 @@ bool ReplayPolicy::FindInline(unsigned token, unsigned hash)
             break;
         }
 
+        // Match token
         unsigned inlineToken = 0;
         int count = sscanf(buffer, " <Token>%u</Token> ", &inlineToken);
 
-        // Need a secondary check here for callsite.
-        // ...offset or similar.
         if ((count != 1) || (inlineToken != token))
         {
             continue;
@@ -2377,16 +2373,32 @@ bool ReplayPolicy::FindInline(unsigned token, unsigned hash)
             break;
         }
 
+        // Match hash
         unsigned inlineHash = 0;
         count = sscanf(buffer, " <Hash>%u</Hash> ", &inlineHash);
 
-        // Need a secondary check here for callsite ID
-        // ... offset or similar.
         if ((count != 1) || (inlineHash != hash))
         {
             continue;
         }
 
+        // Get next line
+        if (fgets(buffer, sizeof(buffer), s_ReplayFile) == nullptr)
+        {
+            break;
+        }
+
+        // Match offset
+        unsigned inlineOffset = 0;
+        count = sscanf(buffer, " <Offset>%u</Offset> ", &inlineOffset);
+        if ((count != 1) || (inlineOffset != offset))
+        {
+            continue;
+        }
+
+        // Token,Hash,Offset may still not be unique enough, but it's
+        // all we have right now.
+
         // We're good!
         foundInline = true;
         break;
@@ -2420,7 +2432,17 @@ bool ReplayPolicy::FindInline(CORINFO_METHOD_HANDLE callee)
     unsigned calleeHash =
         m_RootCompiler->info.compCompHnd->getMethodHash(callee);
 
-    bool foundInline = FindInline(calleeToken, calleeHash);
+    // Abstract this or just pass through raw bits
+    // See matching code in xml writer
+    int offset = -1;
+    if (m_Offset != BAD_IL_OFFSET)
+    {
+        offset = (int) jitGetILoffs(m_Offset);
+    }
+    
+    unsigned calleeOffset = (unsigned) offset;
+
+    bool foundInline = FindInline(calleeToken, calleeHash, calleeOffset);
 
     return foundInline;
 }
index 21bcf51..4b71106 100644 (file)
@@ -346,7 +346,18 @@ class ReplayPolicy : public DiscretionaryPolicy
 public:
 
     // Construct a ReplayPolicy
-    ReplayPolicy(Compiler* compiler, InlineContext* inlineContext, bool isPrejitRoot);
+    ReplayPolicy(Compiler* compiler, bool isPrejitRoot);
+
+    // Optional observations
+    void NoteContext(InlineContext* context) override
+    {
+        m_InlineContext = context;
+    }
+
+    void NoteOffset(IL_OFFSETX offset) override
+    {
+        m_Offset = offset;
+    }
 
     // Policy determinations
     void DetermineProfitability(CORINFO_METHOD_INFO* methodInfo) override;
@@ -361,12 +372,13 @@ private:
     bool FindMethod();
     bool FindContext(InlineContext* context);
     bool FindInline(CORINFO_METHOD_HANDLE callee);
-    bool FindInline(unsigned token, unsigned hash);
+    bool FindInline(unsigned token, unsigned hash, unsigned offset);
 
     static bool          s_WroteReplayBanner;
     static FILE*         s_ReplayFile;
     static CritSecObject s_XmlReaderLock;
     InlineContext*       m_InlineContext;
+    IL_OFFSETX           m_Offset;
 };
 
 #endif // defined(DEBUG) || defined(INLINE_DATA)
index f5bae93..2693535 100644 (file)
@@ -407,7 +407,6 @@ typedef ptrdiff_t   ssize_t;
 //=============================================================================
 
 #define REDUNDANT_LOAD      1       // track locals in regs, suppress loads
-#define LONG_MATH_REGPARAM  0       // args to long mul/div passed in registers
 #define STACK_PROBES        0       // Support for stack probes
 #define DUMP_FLOWGRAPHS     DEBUG   // Support for creating Xml Flowgraph reports in *.fgx files
 
index 684db06..c156684 100644 (file)
@@ -192,7 +192,7 @@ CONFIG_STRING(TailCallOpt, W("TailCallOpt"))
 
 #if defined(DEBUG) || defined(INLINE_DATA)
 CONFIG_INTEGER(JitInlineDumpData, W("JitInlineDumpData"), 0)
-CONFIG_INTEGER(JitInlineDumpXml, W("JitInlineDumpXml"), 0)
+CONFIG_INTEGER(JitInlineDumpXml, W("JitInlineDumpXml"), 0)   // 1 = full xml (all methods), 2 = minimal xml (only method with inlines)
 CONFIG_INTEGER(JitInlineLimit, W("JitInlineLimit"), -1)
 CONFIG_INTEGER(JitInlinePolicyDiscretionary, W("JitInlinePolicyDiscretionary"), 0)
 CONFIG_INTEGER(JitInlinePolicyModel, W("JitInlinePolicyModel"), 0)
index 8782863..74ba79d 100644 (file)
@@ -55,6 +55,7 @@ void                Compiler::lvaInit()
     lvaPromotedStructAssemblyScratchVar = BAD_VAR_NUM;
 #endif // _TARGET_ARM_
     lvaLocAllocSPvar = BAD_VAR_NUM;
+    lvaNewObjArrayArgs = BAD_VAR_NUM;
     lvaGSSecurityCookie  = BAD_VAR_NUM;
 #ifdef _TARGET_X86_
     lvaVarargsBaseOfStkArgs = BAD_VAR_NUM;
@@ -133,14 +134,13 @@ void                Compiler::lvaInitTypeRef()
     // Change the compRetNativeType if we are returning a struct by value in a register
     if (!hasRetBuffArg && varTypeIsStruct(info.compRetNativeType))
     {
-#ifdef _TARGET_ARM_
-        // TODO-ARM64-NYI: HFA
-        if (!info.compIsVarArgs && !opts.compUseSoftFP && IsHfa(info.compMethodInfo->args.retTypeClass))
+#if FEATURE_MULTIREG_RET && defined(FEATURE_HFA)
+        if (!info.compIsVarArgs && IsHfa(info.compMethodInfo->args.retTypeClass))
         {
             info.compRetNativeType = TYP_STRUCT;
         }
         else
-#endif
+#endif // FEATURE_MULTIREG_RET && defined(FEATURE_HFA)
         {
 #ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING            
             ReturnTypeDesc retTypeDesc;
@@ -533,52 +533,67 @@ void                Compiler::lvaInitUserArgs(InitVarDscInfo *      varDscInfo)
 
     regMaskTP doubleAlignMask = RBM_NONE;
     for (unsigned i = 0;
-         i < argSigLen; 
-         i++, varDscInfo->varNum++, varDscInfo->varDsc++, argLst = info.compCompHnd->getArgNext(argLst))
+        i < argSigLen;
+        i++, varDscInfo->varNum++, varDscInfo->varDsc++, argLst = info.compCompHnd->getArgNext(argLst))
     {
         LclVarDsc * varDsc = varDscInfo->varDsc;
         CORINFO_CLASS_HANDLE typeHnd = NULL;
 
-        CorInfoTypeWithMod corInfoType = info.compCompHnd->getArgType(&info.compMethodInfo->args, 
-                                                                      argLst,
-                                                                      &typeHnd);
+        CorInfoTypeWithMod corInfoType = info.compCompHnd->getArgType(&info.compMethodInfo->args,
+            argLst,
+            &typeHnd);
         varDsc->lvIsParam = 1;
 #if ASSERTION_PROP
         varDsc->lvSingleDef = 1;
 #endif
 
-        lvaInitVarDsc(  varDsc,
-                        varDscInfo->varNum,
-                        strip(corInfoType),
-                        typeHnd,
-                        argLst,
-                        &info.compMethodInfo->args);
+        lvaInitVarDsc(varDsc,
+            varDscInfo->varNum,
+            strip(corInfoType),
+            typeHnd,
+            argLst,
+            &info.compMethodInfo->args);
 
         // For ARM, ARM64, and AMD64 varargs, all arguments go in integer registers
         var_types argType = mangleVarArgsType(varDsc->TypeGet());
+        var_types origArgType = argType;
         unsigned argSize = eeGetArgSize(argLst, &info.compMethodInfo->args);
         unsigned cSlots = argSize / TARGET_POINTER_SIZE;    // the total number of slots of this argument
+        bool      isHfaArg = false;
+        var_types hfaType  = TYP_UNDEF;
 
+        // Methods that use VarArg or SoftFP cannot have HFA arguments
+        if (!info.compIsVarArgs && !opts.compUseSoftFP)
+        {
+            // If the argType is a struct, then check if it is an HFA
+            if (varTypeIsStruct(argType))
+            {
+                hfaType = GetHfaType(typeHnd);   // set to float or double if it is an HFA, otherwise TYP_UNDEF
+                isHfaArg = varTypeIsFloating(hfaType);
+            }
+        }
+        if (isHfaArg)
+        {
+            // We have an HFA argument, so from here on our treat the type as a float or double.
+            // The orginal struct type is available by using origArgType
+            // We also update the cSlots to be the number of float/double fields in the HFA
+            argType = hfaType;
+            cSlots = varDsc->lvHfaSlots();
+        }
         // The number of slots that must be enregistered if we are to consider this argument enregistered.
         // This is normally the same as cSlots, since we normally either enregister the entire object,
         // or none of it. For structs on ARM, however, we only need to enregister a single slot to consider
         // it enregistered, as long as we can split the rest onto the stack.
-        // TODO-ARM64-NYI: we can enregister a struct <= 16 bytes into two consecutive registers, if there are enough remaining argument registers.
-        // TODO-ARM64-NYI: HFA
-        unsigned cSlotsToEnregister = cSlots;
+        unsigned  cSlotsToEnregister = cSlots;
 
 #ifdef _TARGET_ARM_
-
-        var_types hfaType = (varTypeIsStruct(argType)) ? GetHfaType(typeHnd) : TYP_UNDEF;
-        bool isHfaArg = !info.compIsVarArgs && !opts.compUseSoftFP && varTypeIsFloating(hfaType);
-
         // On ARM we pass the first 4 words of integer arguments and non-HFA structs in registers.
         // But we pre-spill user arguments in varargs methods and structs.
-        // 
+        //
         unsigned cAlign;
         bool  preSpill = info.compIsVarArgs || opts.compUseSoftFP;
 
-        switch (argType)
+        switch (origArgType)
         {
         case TYP_STRUCT:
             assert(varDsc->lvSize() == argSize);
@@ -603,12 +618,6 @@ void                Compiler::lvaInitUserArgs(InitVarDscInfo *      varDscInfo)
             break;
         }
 
-        if (isHfaArg)
-        {
-            // We've got the HFA size and alignment, so from here on out treat
-            // the type as a float or double.
-            argType = hfaType;
-        }
         if (isRegParamType(argType))
         {
             compArgSize += varDscInfo->alignReg(argType, cAlign) * REGSIZE_BYTES;
@@ -750,14 +759,14 @@ void                Compiler::lvaInitUserArgs(InitVarDscInfo *      varDscInfo)
                 firstAllocatedRegArgNum = varDscInfo->allocRegArg(argType, cSlots);
             }
 
-#ifdef _TARGET_ARM_
             if (isHfaArg)
             {
                 // We need to save the fact that this HFA is enregistered
-                varDsc->lvIsHfaRegArg = true;
-                varDsc->SetHfaType(argType);
+                varDsc->lvSetIsHfa();
+                varDsc->lvSetIsHfaRegArg();
+                varDsc->SetHfaType(hfaType);
+                varDsc->lvIsMultiRegArgOrRet = (varDsc->lvHfaSlots() > 1);
             }
-#endif // _TARGET_ARM_
 
             varDsc->lvIsRegArg = 1;
 
@@ -912,7 +921,7 @@ void                Compiler::lvaInitUserArgs(InitVarDscInfo *      varDscInfo)
 #else // !FEATURE_UNIX_AMD64_STRUCT_PASSING
         compArgSize += argSize;
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
-        if (info.compIsVarArgs || opts.compUseSoftFP)
+        if (info.compIsVarArgs || isHfaArg || opts.compUseSoftFP)
         {
 #if defined(_TARGET_X86_)
             varDsc->lvStkOffs       = compArgSize;
@@ -1434,13 +1443,13 @@ void   Compiler::lvaCanPromoteStructType(CORINFO_CLASS_HANDLE     typeHnd,
             return;
         }
 
-#ifdef _TARGET_ARM_        
-        // For ARM don't struct promote if we have an CUSTOMLAYOUT flag on an HFA type 
-        if (StructHasCustomLayout(typeFlags) &&  IsHfa(typeHnd))
+        // Don't struct promote if we have an CUSTOMLAYOUT flag on an HFA type 
+        if (StructHasCustomLayout(typeFlags) && IsHfa(typeHnd))
         {
             return;
         }
 
+#ifdef _TARGET_ARM_
         // On ARM, we have a requirement on the struct alignment; see below.
         unsigned structAlignment = roundUp(info.compCompHnd->getClassAlignmentRequirement(typeHnd), TARGET_POINTER_SIZE);
 #endif // _TARGET_ARM
@@ -1600,17 +1609,17 @@ void   Compiler::lvaCanPromoteStructVar(unsigned lclNum, lvaStructPromotionInfo
     
 #endif
 
-#ifdef _TARGET_ARM_
+    // TODO-PERF - Allow struct promotion for HFA register arguments
+
     // Explicitly check for HFA reg args and reject them for promotion here.
     // Promoting HFA args will fire an assert in lvaAssignFrameOffsets 
     // when the HFA reg arg is struct promoted.
     //
-    if (varDsc->lvIsHfaRegArg)
+    if (varDsc->lvIsHfaRegArg())
     {     
         StructPromotionInfo->canPromote = false;
         return;
     }
-#endif
 
     CORINFO_CLASS_HANDLE typeHnd = varDsc->lvVerTypeInfo.GetClassHandle();
     lvaCanPromoteStructType(typeHnd, StructPromotionInfo, true);
@@ -1963,6 +1972,25 @@ void   Compiler::lvaSetStruct(unsigned varNum, CORINFO_CLASS_HANDLE typeHnd, boo
             varDsc->lvBaseType = simdBaseType;
         }
 #endif // FEATURE_SIMD
+#ifdef FEATURE_HFA
+        // for structs that are small enough, we check and set lvIsHfa and lvHfaTypeIsFloat
+        if (varDsc->lvExactSize <= MAX_PASS_MULTIREG_BYTES)
+        {
+            var_types hfaType = GetHfaType(typeHnd);   // set to float or double if it is an HFA, otherwise TYP_UNDEF
+            if (varTypeIsFloating(hfaType))
+            {
+                varDsc->_lvIsHfa = true;
+                varDsc->lvSetHfaTypeIsFloat(hfaType == TYP_FLOAT);
+
+                // hfa variables can never contain GC pointers
+                assert(varDsc->lvStructGcCount == 0);
+                // The size of this struct should be evenly divisible by 4 or 8
+                assert((varDsc->lvExactSize % genTypeSize(hfaType)) == 0);
+                // The number of elements in the HFA should fit into our MAX_ARG_REG_COUNT limit
+                assert((varDsc->lvExactSize / genTypeSize(hfaType)) <= MAX_ARG_REG_COUNT);
+            }
+        }
+#endif // FEATURE_HFA
     }
     else
     {
@@ -5925,10 +5953,9 @@ void   Compiler::lvaDumpEntry(unsigned lclNum, FrameLayoutState curState, size_t
         }
     }
 
-#ifdef _TARGET_ARM_
-    if (varDsc->lvIsHfaRegArg)
+    if (varDsc->lvIsHfaRegArg())
     {
-        if (varDsc->lvHfaTypeIsFloat)
+        if (varDsc->lvHfaTypeIsFloat())
         {
             printf(" (enregistered HFA: float) ");
         }
@@ -5937,7 +5964,6 @@ void   Compiler::lvaDumpEntry(unsigned lclNum, FrameLayoutState curState, size_t
             printf(" (enregistered HFA: double)");
         }
     }
-#endif // _TARGET_ARM_
 
     if (varDsc->lvDoNotEnregister)           
     {
index 7372483..d0ec2a2 100644 (file)
@@ -650,6 +650,9 @@ void Lowering::TreeNodeInfoInit(GenTree* stmt)
                         }
                         else
                         {
+#ifdef DEBUG
+                            compiler->gtDispTree(argNode);
+#endif
                             noway_assert(!"Unsupported TYP_STRUCT arg kind");
                         }
 
@@ -1048,13 +1051,10 @@ void Lowering::TreeNodeInfoInitPutArgStk(GenTree* argNode, fgArgTabEntryPtr info
     argNode->gtLsraInfo.srcCount = 1;
     argNode->gtLsraInfo.dstCount = 0;
 
-    // Do we have a TYP_STRUCT argument (or a GT_LIST), if so it must be a 16-byte pass-by-value struct
+    // Do we have a TYP_STRUCT argument (or a GT_LIST), if so it must be a multireg pass-by-value struct
     if ((putArgChild->TypeGet() == TYP_STRUCT) || (putArgChild->OperGet() == GT_LIST))
     {
-        // We will use two store instructions that each write a register sized value
-
-        // We must have a multi-reg struct 
-        assert(info->numSlots >= 2);
+        // We will use store instructions that each write a register sized value
 
         if (putArgChild->OperGet() == GT_LIST)
         {
index dcf4536..09d6d5e 100644 (file)
@@ -3475,12 +3475,10 @@ LinearScan::updateRegStateForArg(LclVarDsc* argDsc)
 #endif
             );
 
-#ifdef _TARGET_ARM_
-        if (argDsc->lvIsHfaRegArg) 
+        if (argDsc->lvIsHfaRegArg()) 
         {
             isFloat = true;
         }
-#endif // _TARGET_ARM_
 
         if (isFloat)
         {
index 217ac21..1cd9eab 100644 (file)
@@ -903,6 +903,40 @@ unsigned UpdateGT_LISTFlags(GenTreePtr tree)
     return tree->gtFlags;
 }
 
+#ifdef DEBUG
+void fgArgTabEntry::Dump()
+{
+    if (regNum == REG_STK)
+    {
+        printf("fgArgTabEntry[arg%d, stk%02x, slots=%d", argNum, slotNum, numSlots);
+    }
+    else
+    {
+#ifdef _TARGET_ARM64_
+        if (emitter::isFloatReg(regNum))
+        {
+            printf("fgArgTabEntry[arg%d, d%d, regs=%d", argNum, regNum-REG_FP_FIRST, numRegs);
+        }
+        else   // integer register
+        {
+            printf("fgArgTabEntry[arg%d, x%d, regs=%d", argNum, regNum-REG_INT_FIRST, numRegs);
+        }
+#else
+        printf("fgArgTabEntry[arg%02d, r%d, regs=%d", argNum, regNum, numRegs);
+#endif
+    }
+    if (needTmp)
+    {
+        printf(", tmpNum=V%02d", tmpNum);
+    }
+    if (isHfaRegArg)
+    {
+        printf(", isHfa");
+    }
+    printf("]\n");
+}
+#endif
+
 fgArgInfo::fgArgInfo(Compiler *  comp,  GenTreePtr  call, unsigned numArgs)
 {
     compiler     = comp;
@@ -1608,6 +1642,33 @@ void fgArgInfo::ArgsComplete()
                     // Spill multireg struct arguments that are expensive to evaluate twice
                     curArgTabEntry->needTmp = true;
                 }
+                else if (argx->OperGet() == GT_OBJ)
+                {
+                    GenTreeObj*           argObj     = argx->AsObj();
+                    CORINFO_CLASS_HANDLE  objClass   = argObj->gtClass;
+                    unsigned              structSize = compiler->info.compCompHnd->getClassSize(objClass);
+                    switch (structSize)
+                    {
+                    case 11:
+                    case 13:
+                    case 14:
+                    case 15:
+                        // Spill any GT_OBJ multireg structs that are difficult to extract
+                        //
+                        // When we have a GT_OBJ of a struct with the above sizes we would need
+                        // to use 3 or 4 load instructions to load the exact size of this struct.
+                        // Instead we spill the GT_OBJ into a new GT_LCL_VAR temp and this sequence
+                        // will use a GT_CPBLK to copy the exact size into the GT_LCL_VAR temp.
+                        // Then we can just load all 16 bytes of the GT_LCL_VAR temp when passing
+                        // the argument.
+                        //
+                        curArgTabEntry->needTmp = true;
+                        break;
+
+                    default:
+                        break;
+                    }
+                }
             }
         }
 #endif // FEATURE_MULTIREG_ARGS
@@ -2935,7 +2996,7 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
     SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR structDesc;
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
 
-    bool hasStructArgument     = false;   // @TODO-ARM64-UNIX: Eemove this bool during a future refactoring 
+    bool hasStructArgument     = false;   // @TODO-ARM64-UNIX: Remove this bool during a future refactoring 
     bool hasMultiregStructArgs = false;
     for (args = call->gtCallArgs; args; args = args->gtOp.gtOp2)
     {
@@ -2962,16 +3023,27 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
             argx->gtType = TYP_I_IMPL;
 
         bool passUsingFloatRegs;
-        unsigned argAlign = 1;
+        unsigned  argAlign = 1;
+        // Setup any HFA information about 'argx'
+        var_types hfaType  = GetHfaType(argx);
+        bool      isHfaArg = varTypeIsFloating(hfaType);
+        unsigned  hfaSlots = 0;
 
-#ifdef _TARGET_ARM_
-        var_types hfaType = GetHfaType(argx);
-        bool isHfaArg = varTypeIsFloating(hfaType);
-#endif // _TARGET_ARM_
+        if (isHfaArg)
+        {
+            hfaSlots = GetHfaCount(argx);
+
+            // If we have a HFA struct it's possible we transition from a method that originally 
+            // only had integer types to now start having FP types.  We have to communicate this
+            // through this flag since LSRA later on will use this flag to determine whether 
+            // or not to track the FP register set.
+            //
+            compFloatingPointUsed = true;
+        }
 
         unsigned             size         = 0;
         CORINFO_CLASS_HANDLE copyBlkClass = NULL;
-        bool                 isRegArg = false;
+        bool                 isRegArg     = false;
 
         fgArgTabEntryPtr argEntry = NULL;
 
@@ -3034,14 +3106,13 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 
 #elif defined(_TARGET_ARM64_)
 
-        // TODO-ARM64-NYI: HFA/HVA
         if (lateArgsComputed)
         {
             passUsingFloatRegs = isValidFloatArgReg(argEntry->regNum);
         }
         else
         {
-            passUsingFloatRegs = !callIsVararg && varTypeIsFloating(argx);
+            passUsingFloatRegs = !callIsVararg && (isHfaArg || varTypeIsFloating(argx));
         }
 
 #elif defined(_TARGET_AMD64_)
@@ -3070,6 +3141,7 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
         bool         isBackFilled     = false;
         unsigned     nextFltArgRegNum = fltArgRegNum;  // This is the next floating-point argument register number to use
         var_types    structBaseType   = TYP_STRUCT;
+        unsigned     structSize = 0;
 
 #if defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
         unsigned int structFloatRegs = 0;
@@ -3121,13 +3193,12 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
             // This size has now been computed
             assert(size != 0);
         }
-        else
+        else  // !lateArgsComputed
         {
             //
-            // Figure out the size of the argument. This is either in number of registers, or number of register-sized
-            // stack slots, or both if the argument is split between the registers and the stack.
+            // Figure out the size of the argument. This is either in number of registers, or number of TARGET_POINTER_SIZE
+            // stack slots, or the sum of these if the argument is split between the registers and the stack.
             //
-
             if (argx->IsArgPlaceHolderNode() || (!isStructArg))
             {
 #if   defined(_TARGET_AMD64_)
@@ -3151,22 +3222,33 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 #elif defined(_TARGET_ARM64_)    
                 if (isStructArg)
                 {
-                    // Structs are either passed in 1 or 2 (64-bit) slots
-                    size = (unsigned)(roundUp(info.compCompHnd->getClassSize(argx->gtArgPlace.gtArgPlaceClsHnd), TARGET_POINTER_SIZE)) / TARGET_POINTER_SIZE;
-                    if (size > 2)
+                    if (isHfaArg)
                     {
-                        size = 1;  // Large structs are passed by reference (to a copy)
+                        size = GetHfaCount(argx);
+                        // HFA structs are passed by value in multiple registers
+                        hasMultiregStructArgs = true;
                     }
-                    else if (size == 2)
+                    else
                     {
-                        hasMultiregStructArgs = true;
+                        // Structs are either passed in 1 or 2 (64-bit) slots
+                        size = (unsigned)(roundUp(info.compCompHnd->getClassSize(argx->gtArgPlace.gtArgPlaceClsHnd), TARGET_POINTER_SIZE)) / TARGET_POINTER_SIZE;
+
+                        if (size == 2)
+                        {
+                            // Structs that are the size of 2 pointers are passed by value in multiple registers
+                            hasMultiregStructArgs = true;
+                        }
+                        else if (size > 2)
+                        {
+                            size = 1;  // Structs that are larger that 2 pointers (except for HFAs) are passed by reference (to a copy)
+                        }
                     }
-                    // Note that there are some additional rules for size=2 structs,
+                    // Note that there are some additional rules for multireg structs.
                     // (i.e they cannot be split betwen registers and the stack)
                 }
                 else
                 {
-                    size = 1; // On ARM64, all primitive types fit in a single (64-bit) 'slot'
+                    size = 1; // Otherwise, all primitive types fit in a single (64-bit) 'slot'
                 }
 #elif defined(_TARGET_ARM_)
                 if (isStructArg)
@@ -3187,9 +3269,9 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 #ifdef _TARGET_ARM_
             else if (isHfaArg)
             {
-                size = GetHfaSlots(argx);
+                size = GetHfaCount(argx);
             }
-#endif
+#endif // _TARGET_ARM_
             else // struct type
             {
                 // We handle two opcodes: GT_MKREFANY and GT_OBJ
@@ -3217,9 +3299,8 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
                     size = 2;
 #endif
                 }
-                else
+                else // We must have a GT_OBJ with a struct type, but the GT_OBJ may be be a child of a GT_COMMA
                 {
-                    // GT_OBJ case
                     GenTreePtr   argObj         = argx;
                     GenTreePtr*  parentOfArgObj = parentArgx;
 
@@ -3244,6 +3325,9 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
                     unsigned originalSize = info.compCompHnd->getClassSize(objClass);
                     originalSize = (originalSize == 0 ? TARGET_POINTER_SIZE : originalSize);
                     unsigned roundupSize  = (unsigned)roundUp(originalSize, TARGET_POINTER_SIZE);
+
+                    structSize = originalSize;
+
 #ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
                     // On System V OS-es a struct is never passed by reference.
                     // It is either passed by value on the stack or in registers.
@@ -3252,11 +3336,20 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
                     bool     passStructByRef = false;
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
 
+                    // The following if-then-else needs to be carefully refactored
+                    // Basically the else portion wants to turn a struct load (a GT_OBJ)'
+                    // into a GT_IND of the appropriate size. 
+                    // It can do this with structs sizes that are 1,2,4, or 8 bytes
+                    // It can't do this when FEATURE_UNIX_AMD64_STRUCT_PASSING is defined  (Why?)
+                    // TODO-Cleanup: Remove the #ifndef FEATURE_UNIX_AMD64_STRUCT_PASSING below
+                    // It also can't do this if we have a HFA arg, 
+                    // unless we have a 1-elem HFA in which case we want to do the optization
+                    // 
 #ifndef _TARGET_X86_
 #ifndef FEATURE_UNIX_AMD64_STRUCT_PASSING
                     // Check for struct argument with size 1, 2, 4 or 8 bytes
                     // As we can optimize these by turning them into a GT_IND of the correct type
-                    if ((originalSize > TARGET_POINTER_SIZE) || ((originalSize & (originalSize - 1)) != 0))
+                    if ((originalSize > TARGET_POINTER_SIZE) || ((originalSize & (originalSize - 1)) != 0) || (isHfaArg && (hfaSlots != 1)))
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
                     {
                         // Normalize 'size' to the number of pointer sized items
@@ -3281,7 +3374,7 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
                         }
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
 #elif defined(_TARGET_ARM64_)
-                        if (size > 2)
+                        if ((size > 2) && !isHfaArg)
                         {
                             size = 1;      // This must be copied to a temp and passed by address
                             passStructByRef = true;
@@ -3308,11 +3401,17 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 #endif // _TARGET_ARM_
                     }
 #ifndef FEATURE_UNIX_AMD64_STRUCT_PASSING
-                    else 
+                    else   // We have a struct argument with size 1, 2, 4 or 8 bytes
                     {
                         // change our GT_OBJ into a GT_IND of the correct type.
+                        // We've already ensured above that size is a power of 2, and less than or equal to pointer size.
                         structBaseType = argOrReturnTypeForStruct(originalSize, objClass, false /* forReturn */);
-                        // We've already ensured above that size is a power of 2, and less than pointer size.
+                        if (isHfaArg)
+                        {
+                            // If we reach here with an HFA arg it has to be a one element HFA
+                            assert(hfaSlots == 1);
+                            structBaseType = hfaType;   // change the indirection type to a floating point type
+                        }
                         noway_assert(structBaseType != TYP_UNKNOWN);
 
                         argObj->ChangeOper(GT_IND);
@@ -3416,39 +3515,46 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 #endif // !defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
                         )
                     {
-                        // if the valuetype size is not a multiple of sizeof(void*),
-                        // we must copyblk to a temp before doing the obj to avoid
-                        // the obj reading memory past the end of the valuetype
+                        if (isHfaArg && passUsingFloatRegs)
+                        {
+                            size = GetHfaCount(argx);  // GetHfaCount returns number of elements in the HFA
+                        }
+                        else
+                        {
+                            // if the valuetype size is not a multiple of sizeof(void*),
+                            // we must copyblk to a temp before doing the obj to avoid
+                            // the obj reading memory past the end of the valuetype
 #if defined(_TARGET_X86_) && !defined(LEGACY_BACKEND)
                         // TODO-X86-CQ: [1091733] Revisit for small structs, we should use push instruction
-                        copyBlkClass = objClass;
-                        size = roundupSize / TARGET_POINTER_SIZE;   // Normalize size to number of pointer sized items
-#else // !defined(_TARGET_X86_) || defined(LEGACY_BACKEND)
-                        if (roundupSize > originalSize)
-                        {
                             copyBlkClass = objClass;
+                            size = roundupSize / TARGET_POINTER_SIZE;   // Normalize size to number of pointer sized items
+#else // !defined(_TARGET_X86_) || defined(LEGACY_BACKEND)
+                            if (roundupSize > originalSize)
+                            {
+                                copyBlkClass = objClass;
 
-                            // There are a few special cases where we can omit using a CopyBlk
-                            // where we normally would need to use one.
+                                // There are a few special cases where we can omit using a CopyBlk
+                                // where we normally would need to use one.
 
-                            GenTreePtr  objAddr = argObj->gtObj.gtOp1;
-                            if (objAddr->gtOper == GT_ADDR)
-                            {
-                                // exception : no need to use CopyBlk if the valuetype is on the stack
-                                if (objAddr->gtFlags & GTF_ADDR_ONSTACK)
+                                GenTreePtr  objAddr = argObj->gtObj.gtOp1;
+                                if (objAddr->gtOper == GT_ADDR)
                                 {
-                                    copyBlkClass = NO_CLASS_HANDLE;
-                                }
-                                // exception : no need to use CopyBlk if the valuetype is already a struct local
-                                else if (objAddr->gtOp.gtOp1->gtOper == GT_LCL_VAR)
-                                {
-                                    copyBlkClass = NO_CLASS_HANDLE;
+                                    // exception : no need to use CopyBlk if the valuetype is on the stack
+                                    if (objAddr->gtFlags & GTF_ADDR_ONSTACK)
+                                    {
+                                        copyBlkClass = NO_CLASS_HANDLE;
+                                    }
+                                    // exception : no need to use CopyBlk if the valuetype is already a struct local
+                                    else if (objAddr->gtOp.gtOp1->gtOper == GT_LCL_VAR)
+                                    {
+                                        copyBlkClass = NO_CLASS_HANDLE;
+                                    }
                                 }
                             }
-                        }
 
-                        size = roundupSize / TARGET_POINTER_SIZE;   // Normalize size to number of pointer sized items
+                            size = roundupSize / TARGET_POINTER_SIZE;   // Normalize size to number of pointer sized items
 #endif // !defined(_TARGET_X86_) || defined(LEGACY_BACKEND)
+                        }
                     }
                 }
                 if (size > 1)
@@ -3515,6 +3621,15 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
                 {
                     // Check if the last register needed is still in the fp argument register range.
                     isRegArg = (nextFltArgRegNum + (size - 1)) < MAX_FLOAT_REG_ARG;
+
+                    // Do we have a HFA arg that we wanted to pass in registers, but we ran out of FP registers?
+                    if (isHfaArg && !isRegArg)
+                    {
+                        // recompute the 'size' so that it represent the number of stack slots rather than the number of registers
+                        //
+                        unsigned roundupSize = (unsigned)roundUp(structSize, TARGET_POINTER_SIZE);
+                        size = roundupSize / TARGET_POINTER_SIZE;
+                    }
                 }
                 else
                 {
@@ -3749,8 +3864,10 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 #endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
                     );
                 (void)newArg; //prevent "unused variable" error from GCC
+
+                newArg->SetIsHfaRegArg(passUsingFloatRegs && isHfaArg); // Note on Arm32 a HFA is passed in int regs for varargs
+
 #ifdef _TARGET_ARM_
-                newArg->SetIsHfaRegArg(passUsingFloatRegs && isHfaArg); // Note that an HFA is passed in int regs for varargs
                 newArg->SetIsBackFilled(isBackFilled);
 #endif // _TARGET_ARM_
             }
@@ -3940,22 +4057,13 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
     // calls to update lvaOutgoingArgSpaceSize.
     if (!call->IsFastTailCall())
     {
-        unsigned        preallocatedArgCount;
+        unsigned preallocatedArgCount = call->fgArgInfo->GetNextSlotNum();
+
+#if defined(UNIX_AMD64_ABI)
+        opts.compNeedToAlignFrame = true;   // this is currently required for the UNIX ABI to work correctly  
+
+        // ToDo: Remove this re-calculation preallocatedArgCount and use the value assigned above.
 
-#if defined(_TARGET_ARMARCH_)
-        // First slots go in registers only, no stack needed.
-        // TODO-ARMArch-CQ: This calculation is only accurate for integer arguments,
-        // and ignores floating point args (it is overly conservative in that case).
-        if (argSlots <= MAX_REG_ARG)
-        {
-            preallocatedArgCount = 0;
-        }
-        else
-        {
-            preallocatedArgCount = argSlots - MAX_REG_ARG;
-        }
-#elif defined(UNIX_AMD64_ABI)
-        opts.compNeedToAlignFrame = true;
         // First slots go in registers only, no stack needed.
         // TODO-Amd64-Unix-CQ This calculation is only accurate for integer arguments,
         // and ignores floating point args (it is overly conservative in that case).
@@ -3967,11 +4075,9 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
         {
             preallocatedArgCount = argSlots + nonRegPassedStructSlots - MAX_REG_ARG;
         }
-#elif defined(_TARGET_AMD64_)
-        preallocatedArgCount = max(4, argSlots);
-#else
-#error Unsupported or unset target architecture
-#endif // _TARGET_*
+#endif  // UNIX_AMD64_ABI
+
+        // Check if we need to increase the size of our Outgoing Arg Space
         if (preallocatedArgCount * REGSIZE_BYTES > lvaOutgoingArgSpaceSize)
         {
             lvaOutgoingArgSpaceSize = preallocatedArgCount * REGSIZE_BYTES;
@@ -3983,9 +4089,16 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
             // stack alignment boundary.
             if (compLocallocUsed)
             {
-                lvaOutgoingArgSpaceSize = (lvaOutgoingArgSpaceSize + (STACK_ALIGN - 1)) & ~(STACK_ALIGN - 1);
+                lvaOutgoingArgSpaceSize = (unsigned) roundUp(lvaOutgoingArgSpaceSize, STACK_ALIGN);
             }
+        }        
+#ifdef DEBUG
+        if (verbose)
+        {
+            printf("argSlots=%d, preallocatedArgCount=%d, nextSlotNum=%d, lvaOutgoingArgSpaceSize=%d",
+                   argSlots, preallocatedArgCount, call->fgArgInfo->GetNextSlotNum(), lvaOutgoingArgSpaceSize);
         }
+#endif
     }
 #endif // FEATURE_FIXED_OUT_ARGS
 
@@ -4038,6 +4151,19 @@ GenTreeCall* Compiler::fgMorphArgs(GenTreeCall* callNode)
 
 #endif // FEATURE_UNIX_AMD64_STRUCT_PASSING
 
+#ifdef DEBUG
+    if (verbose)
+    {
+        fgArgInfoPtr argInfo = call->fgArgInfo;
+
+        for (unsigned curInx = 0; curInx < argInfo->ArgCount(); curInx++)
+        {
+            fgArgTabEntryPtr curArgEntry = argInfo->ArgTable()[curInx];
+            curArgEntry->Dump();
+        }
+    }
+#endif
+
     return call;
 }
 #ifdef _PREFAST_
@@ -4340,8 +4466,10 @@ void Compiler::fgMorphMultiregStructArgs(GenTreeCall* call)
 //   Morph the argument into a set of GT_LIST nodes.
 //
 // Arguments:
-//     arg   - A GenTree node containing a TYP_STRUCT arg that 
-//             is to be passed in multiple registers
+//     arg        - A GenTree node containing a TYP_STRUCT arg that 
+//                  is to be passed in multiple registers
+//     fgEntryPtr - the fgArgTabEntry information for the current 'arg'
+//
 // Notes:
 //    arg must be a GT_OBJ or GT_LCL_VAR or GT_LCL_FLD of TYP_STRUCT that is suitable
 //    for passing in multiple registers.
@@ -4354,32 +4482,116 @@ void Compiler::fgMorphMultiregStructArgs(GenTreeCall* call)
 //    For the GT_OBJ case will clone the address expression and generate two (or more)
 //    indirections.
 //    Currently the implementation only handles ARM64 and will NYI for other architectures.
-//    And for ARM64 we do not ye handle HFA arguments, so only 16-byte struct sizes are supported.
 //
 GenTreePtr    Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPtr fgEntryPtr)
 {
-    GenTreeArgList*  newArg = nullptr;
     assert(arg->TypeGet() == TYP_STRUCT);
-    GenTreePtr argValue = arg;
 
 #ifndef _TARGET_ARM64_
-    NYI("fgMorphMultiregStructArg non-ARM64 implementation");
+    NYI("fgMorphMultiregStructArg requires implementation for this target");
 #endif
 
-    // If we have a GT_OBJ of a GT_ADDR then
-    //  we set argValue to the child node ofthe GT_ADDR
+#if FEATURE_MULTIREG_ARGS
+    // Examine 'arg' and setup argValue objClass and structSize
+    //
+    CORINFO_CLASS_HANDLE objClass   = NO_CLASS_HANDLE;
+    GenTreePtr           argValue   = arg;   // normally argValue will be arg, but see right below
+    unsigned             structSize = 0;
+
     if (arg->OperGet() == GT_OBJ)
     {
-        GenTreePtr argAddr = arg->gtOp.gtOp1;
+        GenTreeObj*  argObj = arg->AsObj();
+        objClass   = argObj->gtClass;
+        structSize = info.compCompHnd->getClassSize(objClass);
+
+        // If we have a GT_OBJ of a GT_ADDR then we set argValue to the child node of the GT_ADDR
+        //
+        if (argObj->gtOp1->OperGet() == GT_ADDR)
+        {
+            argValue = argObj->gtOp1->gtOp.gtOp1;
+        }
+    }
+    else if (arg->OperGet() == GT_LCL_VAR)
+    {
+        GenTreeLclVarCommon* varNode = arg->AsLclVarCommon();
+        unsigned varNum = varNode->gtLclNum;
+        assert(varNum < lvaCount);
+        LclVarDsc* varDsc = &lvaTable[varNum];
+
+        objClass   = lvaGetStruct(varNum);
+        structSize = varDsc->lvExactSize;
+    }
+    noway_assert(objClass != nullptr);
+
+    var_types  hfaType    = TYP_UNDEF;
+    var_types  elemType   = TYP_UNDEF;
+    unsigned   elemCount  = 0;
+    unsigned   elemSize   = 0;
+    var_types  type[MAX_ARG_REG_COUNT] = {};   // TYP_UNDEF = 0
+
+    hfaType = GetHfaType(objClass);   // set to float or double if it is an HFA, otherwise TYP_UNDEF
+    if (varTypeIsFloating(hfaType))
+    {
+        elemType = hfaType;
+        elemSize = genTypeSize(elemType);
+        elemCount = structSize / elemSize;
+        assert(elemSize*elemCount == structSize);
+        for (unsigned inx = 0; inx<elemCount; inx++)
+        {
+            type[inx] = elemType;
+        }
+    }
+    else
+    {
+        assert(structSize <= 2 * TARGET_POINTER_SIZE);
+        BYTE gcPtrs[2] = { TYPE_GC_NONE, TYPE_GC_NONE };
+        info.compCompHnd->getClassGClayout(objClass, &gcPtrs[0]);
+        elemCount = 2;
+        type[0] = getJitGCType(gcPtrs[0]);
+        type[1] = getJitGCType(gcPtrs[1]);
 
-        if (argAddr->OperGet() == GT_ADDR)
+        if ((argValue->OperGet() == GT_LCL_FLD) ||
+            (argValue->OperGet() == GT_LCL_VAR))
         {
-            argValue = argAddr->gtOp.gtOp1;
+            // We can safely widen this to 16 bytes since we are loading from 
+            // a GT_LCL_VAR or a GT_LCL_FLD which is properly padded and 
+            // lives in the stack frame or will be a promoted field.
+            //
+            elemSize = TARGET_POINTER_SIZE;
+            structSize = 2 * TARGET_POINTER_SIZE;
         }
+        else // we must have a GT_OBJ
+        {
+            assert(argValue->OperGet() == GT_OBJ);
+
+            // We need to load the struct from an arbitrary address
+            // and we can't read past the end of the structSize
+            // We adjust the second load type here
+            // 
+            if (structSize < 2 * TARGET_POINTER_SIZE)
+            {
+                switch (structSize - TARGET_POINTER_SIZE) {
+                case 1:
+                    type[1] = TYP_BYTE;
+                    break;
+                case 2:
+                    type[1] = TYP_SHORT;
+                    break;
+                case 4:
+                    type[1] = TYP_INT;
+                    break;
+                default:
+                    noway_assert(!"NYI: odd sized struct in fgMorphMultiregStructArg");
+                    break;
+                }
+            }
+        }      
     }
     // We should still have a TYP_STRUCT
     assert(argValue->TypeGet() == TYP_STRUCT);
 
+    GenTreeArgList*  newArg = nullptr;
+
     // Are we passing a struct LclVar?
     //
     if (argValue->OperGet() == GT_LCL_VAR)
@@ -4389,18 +4601,63 @@ GenTreePtr    Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPt
         assert(varNum < lvaCount);
         LclVarDsc* varDsc = &lvaTable[varNum];
 
-        // At this point any TYP_STRUCT LclVar must be a 16-byte pass by value argument
-        assert(varDsc->lvSize() == 2 * TARGET_POINTER_SIZE);
+        // At this point any TYP_STRUCT LclVar must be a 16-byte struct
+        // or an HFA struct, both which are passed by value.
+        //
+        assert((varDsc->lvSize() == 2*TARGET_POINTER_SIZE) || varDsc->lvIsHfa());
 
-        const BYTE * gcPtrs = varDsc->lvGcLayout;
+        varDsc->lvIsMultiRegArgOrRet = true;
 
-        var_types type0 = getJitGCType(gcPtrs[0]);
-        var_types type1 = getJitGCType(gcPtrs[1]);
+#ifdef DEBUG
+        if (verbose)
+        {
+            JITDUMP("Multireg struct argument V%02u : ");
+            fgEntryPtr->Dump();
+        }
+#endif // DEBUG
 
-        varDsc->lvIsMultiRegArgOrRet = true;
+        // This local variable must match the layout of the 'objClass' type exactly
+        if (varDsc->lvIsHfa())
+        {
+            // We have a HFA struct
+            noway_assert(elemType == (varDsc->lvHfaTypeIsFloat() ? TYP_FLOAT : TYP_DOUBLE));
+            noway_assert(elemSize == genTypeSize(elemType));
+            noway_assert(elemCount == (varDsc->lvExactSize / elemSize));
+            noway_assert(elemSize*elemCount == varDsc->lvExactSize);
+
+            for (unsigned inx = 0; (inx < elemCount); inx++)
+            {
+                noway_assert(type[inx] == elemType);
+            }
+        }
+        else
+        {
+            // We must have a 16-byte struct (non-HFA)
+            noway_assert(elemCount == 2);
+
+            for (unsigned inx = 0; inx < elemCount; inx++)
+            {
+                CorInfoGCType currentGcLayoutType = (CorInfoGCType)varDsc->lvGcLayout[inx];
 
-        // Is this LclVar a promoted struct with exactly two fields?
-        if ((varDsc->lvPromoted) && (varDsc->lvFieldCnt == 2))
+                // We setup the type[inx] value above using the GC info from 'objClass'
+                // This GT_LCL_VAR must have the same GC layout info
+                // 
+                if (currentGcLayoutType != TYPE_GC_NONE)
+                {
+                    noway_assert(type[inx] == getJitGCType((BYTE)currentGcLayoutType));
+                }
+                else
+                {
+                    // We may have use a small type when we setup the type[inx] values above 
+                    // We can safely widen this to TYP_I_IMPL 
+                    type[inx] = TYP_I_IMPL;
+                }
+            }
+        }
+
+        // Is this LclVar a promoted struct with exactly 2 fields?
+        // TODO-ARM64-CQ: Support struct promoted HFA types here
+        if (varDsc->lvPromoted && (varDsc->lvFieldCnt == 2))
         {
             // See if we have two promoted fields that start at offset 0 and 8?
             unsigned loVarNum = lvaGetFieldLocal(varDsc, 0);
@@ -4440,39 +4697,17 @@ GenTreePtr    Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPt
                 }
             }
         }
-
-        // Check if we couldn't transform the LDOBJ(ADDR(LCLVAR)) into a struct promoted GT_LIST above
-        if (newArg == nullptr)
+        else
         {
             //
-            // We weren't able to pass this LclVar using it's struct promted fields
-            //
-            // So instead we will create a list of GT_LCL_FLDs nodes to pass this struct
+            // We will create a list of GT_LCL_FLDs nodes to pass this struct
             //
             lvaSetVarDoNotEnregister(varNum DEBUG_ARG(DNER_LocalField));
-
-            // If this is going in the register area, we transform it here into a GT_LIST of LCLFLD's
-            // If this is going in the outgoing arg area, it will be transformed later
-            //
-            if (fgEntryPtr->regNum != REG_STK)
-            {
-                GenTreeLclVarCommon* varNode = argValue->AsLclVarCommon();
-                unsigned   varNum = varNode->gtLclNum;
-                assert(varNum < lvaCount);
-                LclVarDsc* varDsc = &lvaTable[varNum];
-
-                GenTreePtr loLclFld = gtNewLclFldNode(varNum, type0, 0);
-                GenTreePtr hiLclFld = gtNewLclFldNode(varNum, type1, TARGET_POINTER_SIZE);
-
-                // Create a new tree for 'arg'
-                //    replace the existing LDOBJ(ADDR(LCLVAR)) 
-                //    with a LIST(LCLFLD-LO, LIST(LCLFLD-HI, nullptr))
-                //
-                newArg = gtNewListNode(loLclFld, gtNewArgList(hiLclFld));
-            }
         }
     }
-    // Check if we already created a replacement newArg above
+
+    // If we didn't set newarg to a new List Node tree
+    //
     if (newArg == nullptr)
     {
         if (fgEntryPtr->regNum == REG_STK)
@@ -4480,73 +4715,116 @@ GenTreePtr    Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPt
             // We leave this stack passed argument alone
             return arg;
         }
-    }
 
-    // Are we passing a GT_LCL_FLD which contain a 16-byte struct inside it?
-    //
-    if (argValue->OperGet() == GT_LCL_FLD)
-    {
-        GenTreeLclVarCommon* varNode = argValue->AsLclVarCommon();
-        unsigned   varNum = varNode->gtLclNum;
-        assert(varNum < lvaCount);
-        LclVarDsc* varDsc = &lvaTable[varNum];
-
-        unsigned baseOffset   = argValue->gtLclFld.gtLclOffs;
-        unsigned baseIndex    = baseOffset / TARGET_POINTER_SIZE;
-        unsigned requiredSize = baseOffset + (2 * TARGET_POINTER_SIZE);
+        // Are we passing a GT_LCL_FLD (or a GT_LCL_VAR that was not struct promoted )
+        // A GT_LCL_FLD could also contain a 16-byte struct or HFA struct inside it?
+        //
+        if ((argValue->OperGet() == GT_LCL_FLD) || (argValue->OperGet() == GT_LCL_VAR))
+        {
+            GenTreeLclVarCommon* varNode = argValue->AsLclVarCommon();
+            unsigned   varNum = varNode->gtLclNum;
+            assert(varNum < lvaCount);
+            LclVarDsc* varDsc = &lvaTable[varNum];
 
-        // The allocated size of our LocalVar must be at least as big as requiredSize
-        assert(varDsc->lvSize() >= requiredSize);
+            unsigned baseOffset = (argValue->OperGet() == GT_LCL_FLD) ? argValue->gtLclFld.gtLclOffs : 0;
+            unsigned lastOffset = baseOffset + (elemCount * elemSize);
 
-        const BYTE * gcPtrs = varDsc->lvGcLayout;
+            // The allocated size of our LocalVar must be at least as big as lastOffset
+            assert(varDsc->lvSize() >= lastOffset);
 
-        var_types type0 = getJitGCType(gcPtrs[baseIndex+0]);
-        var_types type1 = getJitGCType(gcPtrs[baseIndex+1]);
+            if (varDsc->lvStructGcCount > 0)
+            {
+                // alignment of the baseOffset is required
+                noway_assert((baseOffset % TARGET_POINTER_SIZE) == 0);
+                noway_assert(elemSize == TARGET_POINTER_SIZE);
+                unsigned baseIndex = baseOffset / TARGET_POINTER_SIZE;
+                const BYTE * gcPtrs = varDsc->lvGcLayout;  // Get the GC layout for the local variable
+                for (unsigned inx = 0; (inx < elemCount); inx++)
+                {
+                    // The GC information must match what we setup using 'objClass'
+                    noway_assert(type[inx] == getJitGCType(gcPtrs[baseIndex + inx]));
+                }
+            }
+            else //  this varDsc contains no GC pointers
+            {
+                for (unsigned inx = 0; inx<elemCount; inx++)
+                {
+                    // The GC information must match what we setup using 'objClass'               
+                    noway_assert(!varTypeIsGC(type[inx]));
+                }
+            }
 
-        //
-        // We create a list of two GT_LCL_FLDs nodes to pass this struct
-        //
-        lvaSetVarDoNotEnregister(varNum DEBUG_ARG(DNER_LocalField));
+            //
+            // We create a list of GT_LCL_FLDs nodes to pass this struct
+            //
+            lvaSetVarDoNotEnregister(varNum DEBUG_ARG(DNER_LocalField));
 
-        GenTreePtr loLclFld = gtNewLclFldNode(varNum, type0, baseOffset);
-        GenTreePtr hiLclFld = gtNewLclFldNode(varNum, type1, baseOffset + TARGET_POINTER_SIZE);
+            // Start building our list from the last element
+            unsigned offset = lastOffset;
+            unsigned inx = elemCount;
 
-        // Create a new tree for 'arg'
-        //    replace the existing LDOBJ(ADDR(LCLVAR)) 
-        //    with a LIST(LCLFLD-LO, LIST(LCLFLD-HI, nullptr))
+            // Create a new tree for 'arg'
+            //    replace the existing LDOBJ(ADDR(LCLVAR)) 
+            //    with a LIST(LCLFLD-LO, LIST(LCLFLD-HI, nullptr) ...)
+            //
+            while (inx > 0)
+            {
+                inx--;
+                offset -= elemSize;
+                GenTreePtr nextLclFld = gtNewLclFldNode(varNum, type[inx], offset);
+                if (newArg == nullptr)
+                {
+                    newArg = gtNewArgList(nextLclFld);
+                }
+                else
+                {
+                    newArg = gtNewListNode(nextLclFld, newArg);
+                }
+            }
+        }
+        // Are we passing a GT_OBJ struct?
         //
-        newArg = gtNewListNode(loLclFld, gtNewArgList(hiLclFld));
-    }
-    // Are we passing a GT_OBJ struct?
-    //
-    else if (argValue->OperGet() == GT_OBJ)
-    {
-        GenTreeObj*          argObj   = argValue->AsObj();
-        CORINFO_CLASS_HANDLE objClass = argObj->gtClass;
-
-        int structSize = info.compCompHnd->getClassSize(objClass);
-        assert(structSize <= 2 * TARGET_POINTER_SIZE);
-        BYTE gcPtrs[2] = { TYPE_GC_NONE, TYPE_GC_NONE };
-        info.compCompHnd->getClassGClayout(objClass, &gcPtrs[0]);
-
-        var_types  type0 = getJitGCType(gcPtrs[0]);
-        var_types  type1 = getJitGCType(gcPtrs[1]);
-
-        GenTreePtr  baseAddr    = argObj->gtOp1;
-        GenTreePtr  baseAddrDup = gtCloneExpr(baseAddr);
-        noway_assert(baseAddrDup != nullptr);
+        else if (argValue->OperGet() == GT_OBJ)
+        {
+            GenTreeObj*  argObj   = argValue->AsObj();
+            GenTreePtr   baseAddr = argObj->gtOp1;
+            var_types    addrType = baseAddr->TypeGet();
 
-        var_types   addrType = baseAddr->TypeGet();
-        GenTreePtr  loAddr   = baseAddr;
-        GenTreePtr  hiAddr   = gtNewOperNode(GT_ADD, addrType, baseAddrDup, gtNewIconNode(TARGET_POINTER_SIZE, TYP_I_IMPL));
-        GenTreePtr  loValue  = gtNewOperNode(GT_IND, type0, loAddr);
-        GenTreePtr  hiValue  = gtNewOperNode(GT_IND, type1, hiAddr);
+            // Create a new tree for 'arg'
+            //    replace the existing LDOBJ(EXPR) 
+            //    with a LIST(IND(EXPR), LIST(IND(EXPR+8), nullptr) ...)
+            //
 
-        // Create a new tree for 'arg'
-        //    replace the existing LDOBJ(EXPR) 
-        //    with a LIST(IND(EXPR), LIST(IND(EXPR+8), nullptr))
-        //
-        newArg = gtNewListNode(loValue, gtNewArgList(hiValue));
+            // Start building our list from the last element
+            unsigned offset = structSize;
+            unsigned inx = elemCount;
+            while (inx > 0)
+            {
+                inx--;
+                elemSize = genTypeSize(type[inx]);
+                offset -= elemSize;
+                GenTreePtr  curAddr = baseAddr;
+                if (offset != 0)
+                {
+                    GenTreePtr  baseAddrDup = gtCloneExpr(baseAddr);
+                    noway_assert(baseAddrDup != nullptr);
+                    curAddr = gtNewOperNode(GT_ADD, addrType, baseAddrDup, gtNewIconNode(offset, TYP_I_IMPL));
+                }
+                else
+                {
+                    curAddr = baseAddr;
+                }
+                GenTreePtr curItem = gtNewOperNode(GT_IND, type[inx], curAddr);
+                if (newArg == nullptr)
+                {
+                    newArg = gtNewArgList(curItem);
+                }
+                else
+                {
+                    newArg = gtNewListNode(curItem, newArg);
+                }
+            }
+        }
     }
 
     // If we reach here we should have set newArg to something 
@@ -4567,9 +4845,13 @@ GenTreePtr    Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPt
 #endif
 
     arg = newArg;   // consider calling fgMorphTree(newArg);
+
+#endif // FEATURE_MULTIREG_ARGS
+
     return arg;
 }
 
+
 // Make a copy of a struct variable if necessary, to pass to a callee.
 // returns: tree that computes address of the outgoing arg
 void
@@ -4593,7 +4875,11 @@ Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call,
             if (lvaIsImplicitByRefLocal(varNum))
             {
                 LclVarDsc* varDsc = &lvaTable[varNum];
-                if (varDsc->lvRefCnt == 1 && !fgMightHaveLoop())
+                // JIT_TailCall helper has an implicit assumption that all tail call arguments live
+                // on the caller's frame. If an argument lives on the caller caller's frame, it may get
+                // overwritten if that frame is reused for the tail call. Therefore, we should always copy
+                // struct parameters if they are passed as arguments to a tail call.
+                if (!call->IsTailCallViaHelper() && (varDsc->lvRefCnt == 1) && !fgMightHaveLoop())
                 {
                     varDsc->lvRefCnt = 0;
                     args->gtOp.gtOp1 = lcl;
@@ -4601,13 +4887,8 @@ Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call,
                     fp->node = lcl;
 
                     JITDUMP("did not have to make outgoing copy for V%2d", varNum);
-                    varDsc->lvRefCnt = 0;
                     return;
                 }
-                else
-                {
-                    varDsc->lvRefCnt = 0;
-                }
             }
         }
     }
@@ -4757,7 +5038,7 @@ void                Compiler::fgFixupStructReturn(GenTreePtr     callNode)
 
     if (!callHasRetBuffArg && varTypeIsStruct(call))
     {
-#ifdef _TARGET_ARM_
+#ifdef FEATURE_HFA
         if (call->gtCall.IsVarargs() || !IsHfa(call))
 #endif 
         {
@@ -4767,7 +5048,7 @@ void                Compiler::fgFixupStructReturn(GenTreePtr     callNode)
         }
     }
 
-#ifdef _TARGET_ARM_
+#ifdef FEATURE_HFA
     // Either we don't have a struct now or if struct, then it is HFA returned in regs.
     assert(!varTypeIsStruct(call) || (IsHfa(call) && !callHasRetBuffArg));
 #elif defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
@@ -7255,7 +7536,7 @@ GenTreePtr          Compiler::fgMorphCall(GenTreeCall* call)
         GenTree* result = call;
         if (callType != TYP_VOID && info.compRetType != TYP_VOID)
         {
-#ifdef _TARGET_ARM_
+#ifdef FEATURE_HFA
             // Return a dummy node, as the return is already removed.
             if (callType == TYP_STRUCT)
             {
@@ -9289,7 +9570,6 @@ GenTreePtr          Compiler::fgMorphSmpOp(GenTreePtr tree, MorphAddrContext* ma
     case GT_MUL:
 
 #ifndef _TARGET_64BIT_
-#if !LONG_MATH_REGPARAM
         if  (typ == TYP_LONG)
         {
             /* For (long)int1 * (long)int2, we dont actually do the
@@ -9409,7 +9689,6 @@ NO_MUL_64RSLT:
                 assert(tree->gtIsValid64RsltMul());
             }
         }
-#endif // !LONG_MATH_REGPARAM
 #endif // !_TARGET_64BIT_
         break;
 
@@ -9417,13 +9696,11 @@ NO_MUL_64RSLT:
     case GT_DIV:
 
 #ifndef _TARGET_64BIT_
-#if !LONG_MATH_REGPARAM
         if  (typ == TYP_LONG)
         {
             helper = CORINFO_HELP_LDIV;
             goto USE_HELPER_FOR_ARITH;
         }
-#endif
 
 #if  USE_HELPERS_FOR_INT_DIV
         if  (typ == TYP_INT && !fgIsSignedDivOptimizable(op2))
@@ -9453,13 +9730,11 @@ NO_MUL_64RSLT:
     case GT_UDIV:
 
 #ifndef _TARGET_64BIT_
-#if !LONG_MATH_REGPARAM
         if  (typ == TYP_LONG)
         {
             helper = CORINFO_HELP_ULDIV;
             goto USE_HELPER_FOR_ARITH;
         }
-#endif
 #if  USE_HELPERS_FOR_INT_DIV
         if  (typ == TYP_INT && !fgIsUnsignedDivOptimizable(op2))
         {
@@ -9564,13 +9839,11 @@ NO_MUL_64RSLT:
         }
 
 #ifndef  _TARGET_64BIT_
-#if !LONG_MATH_REGPARAM
         if  (typ == TYP_LONG)
         {
             helper = (oper == GT_UMOD) ? CORINFO_HELP_ULMOD : CORINFO_HELP_LMOD;
             goto USE_HELPER_FOR_ARITH;
         }
-#endif
 
 #if  USE_HELPERS_FOR_INT_DIV
         if  (typ == TYP_INT)
@@ -10913,14 +11186,12 @@ COMPARE:
     case GT_MUL:
 
 #ifndef _TARGET_64BIT_
-#if!LONG_MATH_REGPARAM
         if (typ == TYP_LONG)
         {
             // This must be GTF_MUL_64RSLT
             assert(tree->gtIsValid64RsltMul());
             return tree;
         }
-#endif
 #endif // _TARGET_64BIT_
         goto CM_OVF_OP;
 
@@ -15934,7 +16205,7 @@ Compiler::fgWalkResult      Compiler::fgMorphLocalField(GenTreePtr tree, fgWalkD
 /*****************************************************************************
  *
  *  Mark irregular parameters.  For x64 this is 3, 5, 6, 7, >8 byte structs that are passed by reference.
- *  For ARM64, this is structs larger than 16 bytes that are passed by reference.
+ *  For ARM64, this is structs larger than 16 bytes that are also not HFAs that are passed by reference.
  */
 void                Compiler::fgMarkImplicitByRefArgs()
 {
@@ -15969,7 +16240,8 @@ void                Compiler::fgMarkImplicitByRefArgs()
 #if defined(_TARGET_AMD64_)
             if (size > REGSIZE_BYTES || (size & (size - 1)) != 0)
 #elif defined(_TARGET_ARM64_)
-            if (size > 16)
+            if ((size > TARGET_POINTER_SIZE) && !varDsc->lvIsMultiregStruct())
+
 #endif
             {
                 // Previously nobody was ever setting lvIsParam and lvIsTemp on the same local
@@ -15981,7 +16253,6 @@ void                Compiler::fgMarkImplicitByRefArgs()
 
                 // Also marking them as BYREF will hide them from struct promotion.
                 varDsc->lvType = TYP_BYREF;
-
                 varDsc->lvRefCnt = 0;
 
                 // Since this previously was a TYP_STRUCT and we have changed it to a TYP_BYREF
@@ -15994,6 +16265,11 @@ void                Compiler::fgMarkImplicitByRefArgs()
                 // This should not be converted to a double in stress mode,
                 // because it is really a pointer
                 varDsc->lvKeepType = 1;
+
+                if (verbose)
+                {
+                    printf("Changing the lvType for struct parameter V%02d to TYP_BYREF.\n", lclNum);
+                }
 #endif // DEBUG
             }
 #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
index cfd0803..5f01465 100644 (file)
@@ -2074,7 +2074,7 @@ void                Compiler::optOptimizeValnumCSEs()
     if  (verbose) 
         printf("\n*************** In optOptimizeValnumCSEs()\n");
 
-    if (optConfigDisableCSE(false))
+    if (optConfigDisableCSE())
         return;   // Disabled by JitNoCSE 
 #endif
 
@@ -2271,18 +2271,8 @@ bool                Compiler::optIsCSEcandidate(GenTreePtr tree)
 // If this method returns false then the CSE phase should be performed.
 // If the method returns true then the CSE phase should be skipped.
 //
-bool                Compiler::optConfigDisableCSE(bool lexicalCSE)
+bool                Compiler::optConfigDisableCSE()
 {
-    bool enabled = true;
-
-#if VALNUM_CSE_ENABLED
-    if (lexicalCSE)
-        return true;        // lexical CSE phase is disabled
-#else
-    if (!lexicalCSE)
-        return true;        // valnum CSE phase is disabled
-#endif
-
     // Next check if COMPlus_JitNoCSE is set and applies to this method
     //
     unsigned jitNoCSE = JitConfig.JitNoCSE();
@@ -2297,20 +2287,27 @@ bool                Compiler::optConfigDisableCSE(bool lexicalCSE)
             unsigned bitsOne         = (jitNoCSE >>  0) & 0xFFF;
              
             if ((( methodCountMask & bitsOne)  == bitsOne) &&
-                ((~methodCountMask & bitsZero) == bitsZero)   )
+                ((~methodCountMask & bitsZero) == bitsZero))
             {
-                if  (verbose) 
+                if (verbose)
+                {
                     printf(" Disabled by JitNoCSE methodCountMask\n");
+                }
+
                 return true;  // The CSE phase for this method is disabled
             }
         }
         else if (jitNoCSE <= (methodCount+1))
         {
-            if  (verbose) 
+            if (verbose)
+            {
                 printf(" Disabled by JitNoCSE > methodCount\n");
+            }
+
             return true;  // The CSE phase for this method is disabled
         }
     }
+
     return false;
 }
 
index f5b55ab..e3cc769 100644 (file)
@@ -5,16 +5,16 @@ add_definitions(-DFEATURE_NO_HOST)
 add_definitions(-DSELF_NO_HOST)
 remove_definitions(-DFEATURE_MERGE_JIT_AND_ENGINE)
 
-if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_NETBSD)
-    # This is required to force using our own PAL, not one that we are loaded with.
-    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic -Bsymbolic-functions")
-endif(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_NETBSD)
-
 add_library_clr(protojit
    SHARED
    ${SHARED_LIB_SOURCES}
 )
 
+add_dependencies(protojit jit_exports)
+
+set_property(TARGET protojit APPEND_STRING PROPERTY LINK_FLAGS ${JIT_EXPORTS_LINKER_OPTION})
+set_property(TARGET protojit APPEND_STRING PROPERTY LINK_DEPENDS ${JIT_EXPORTS_FILE})
+
 set(RYUJIT_LINK_LIBRARIES
    utilcodestaticnohost
    gcinfo
index 4d10ea0..78c8dff 100644 (file)
@@ -293,13 +293,11 @@ regMaskTP               Compiler::genReturnRegForTree(GenTreePtr tree)
 {
     var_types type = tree->TypeGet();
 
-#ifdef _TARGET_ARM_
     if (type == TYP_STRUCT && IsHfa(tree))
     {
-        int retSlots = GetHfaSlots(tree);
+        int retSlots = GetHfaCount(tree);
         return ((1 << retSlots) - 1) << REG_FLOATRET;
     }
-#endif
 
     const  static
     regMaskTP returnMap[TYP_COUNT] =
@@ -672,22 +670,6 @@ regNumber     Compiler::raUpdateRegStateForArg(RegState *regState, LclVarDsc *ar
 
     regState->rsCalleeRegArgMaskLiveIn |= genRegMask(inArgReg);
 
-#if FEATURE_MULTIREG_ARGS
-#ifdef _TARGET_ARM64_
-    if ((argDsc->lvOtherArgReg != REG_STK) && (argDsc->lvOtherArgReg != REG_NA))
-    {
-        assert(argDsc->lvIsMultiregStruct());
-
-        regNumber secondArgReg = argDsc->lvOtherArgReg;
-
-        noway_assert(regState->rsIsFloat == false);
-        noway_assert(genRegMask(secondArgReg) & RBM_ARG_REGS);
-
-        regState->rsCalleeRegArgMaskLiveIn |= genRegMask(secondArgReg);
-    }
-#endif // TARGET_ARM64_
-#endif // FEATURE_MULTIREG_ARGS
-
 #ifdef _TARGET_ARM_
     if (argDsc->lvType == TYP_DOUBLE)
     {
@@ -710,12 +692,15 @@ regNumber     Compiler::raUpdateRegStateForArg(RegState *regState, LclVarDsc *ar
         regState->rsCalleeRegArgMaskLiveIn |= genRegMask((regNumber)(inArgReg+1));
         
     }
-    else if (argDsc->lvType == TYP_STRUCT)
+#endif // _TARGET_ARM_
+
+#if FEATURE_MULTIREG_ARGS
+    if (argDsc->lvType == TYP_STRUCT)
     {
-        if (argDsc->lvIsHfaRegArg)
+        if (argDsc->lvIsHfaRegArg())
         {
             assert(regState->rsIsFloat);
-            unsigned cSlots = GetHfaSlots(argDsc->lvVerTypeInfo.GetClassHandleForValueClass());
+            unsigned cSlots = GetHfaCount(argDsc->lvVerTypeInfo.GetClassHandleForValueClass());
             for (unsigned i = 1; i < cSlots; i++)
             {
                 assert(inArgReg + i <= LAST_FP_ARGREG);
@@ -732,12 +717,12 @@ regNumber     Compiler::raUpdateRegStateForArg(RegState *regState, LclVarDsc *ar
                 {
                     break;
                 }
-                assert(!regState->rsIsFloat);
+                assert(regState->rsIsFloat == false);
                 regState->rsCalleeRegArgMaskLiveIn |= genRegMask(nextArgReg);
             }
         }
     }
-#endif // _TARGET_ARM_
+#endif // FEATURE_MULTIREG_ARGS
 
     return inArgReg;
 }
@@ -3471,10 +3456,6 @@ GENERIC_UNARY:
         case GT_MUL:
 
 #ifndef _TARGET_AMD64_
-#if LONG_MATH_REGPARAM
-        if  (type == TYP_LONG)
-            goto LONG_MATH;
-#endif
         if (type == TYP_LONG)
         {
             assert(tree->gtIsValid64RsltMul());
@@ -3674,7 +3655,6 @@ GENERIC_BINARY:
 
 #ifndef _TARGET_64BIT_
 
-#if!LONG_MATH_REGPARAM
             if  (type == TYP_LONG && (oper == GT_MOD || oper == GT_UMOD))
             {
                 /* Special case:  a mod with an int op2 is done inline using idiv or div
@@ -3706,42 +3686,6 @@ GENERIC_BINARY:
 
                 goto RETURN_CHECK;
             }
-#else // LONG_MATH_REGPARAM
-            if  (type == TYP_LONG)
-            {
-LONG_MATH:      /* LONG_MATH_REGPARAM case */
-
-                noway_assert(type == TYP_LONG);
-#ifdef _TARGET_X86_
-                if  (tree->gtFlags & GTF_REVERSE_OPS)
-                {
-                    rpPredictTreeRegUse(op2, PREDICT_PAIR_ECXEBX, lockedRegs,  rsvdRegs | op1->gtRsvdRegs);
-                    rpPredictTreeRegUse(op1, PREDICT_PAIR_EAXEDX, lockedRegs | RBM_ECX | RBC_EBX, RBM_LASTUSE);
-                }
-                else
-                {
-                    rpPredictTreeRegUse(op1, PREDICT_PAIR_EAXEDX, lockedRegs,  rsvdRegs | op2->gtRsvdRegs);
-                    rpPredictTreeRegUse(op2, PREDICT_PAIR_ECXEBX, lockedRegs | RBM_EAX | RBM_EDX, RBM_LASTUSE);
-                }
-#elif defined(_TARGET_ARM_)
-                NYI_ARM("64-bit MOD");
-#else // !_TARGET_X86_ && !_TARGET_ARM_
-#error "Non-ARM or x86 _TARGET_ in RegPredict for 64-bit MOD"
-#endif // !_TARGET_X86_ && !_TARGET_ARM_
-
-                /* grab EAX, EDX for this tree node */
-
-                regMask          |=  (RBM_EAX | RBM_EDX);
-
-                tree->gtUsedRegs  = (regMaskSmall)regMask  | (RBM_ECX | RBM_EBX);
-
-                tree->gtUsedRegs |= op1->gtUsedRegs | op2->gtUsedRegs;
-
-                regMask = RBM_EAX | RBM_EDX;
-
-                goto RETURN_CHECK;
-            }
-#endif
 #endif // _TARGET_64BIT_
 
             /* no divide immediate, so force integer constant which is not
index 7f8d8ac..f873dc7 100644 (file)
@@ -999,12 +999,10 @@ void                CodeGen::psiBegProlog()
             {
 #ifdef DEBUG
                 var_types regType = compiler->mangleVarArgsType(lclVarDsc1->TypeGet());
-#ifdef _TARGET_ARM_
-                if (lclVarDsc1->lvIsHfaRegArg)
+                if (lclVarDsc1->lvIsHfaRegArg())
                 {
                     regType = lclVarDsc1->GetHfaType();
                 }
-#endif // _TARGET_ARM_
                 assert(genMapRegNumToRegArgNum(lclVarDsc1->lvArgReg, regType) != (unsigned)-1);
 #endif // DEBUG
 
index 122972a..4536f6d 100644 (file)
@@ -540,8 +540,8 @@ const SIMDIntrinsicInfo* Compiler::getSIMDIntrinsicInfo(CORINFO_CLASS_HANDLE*  i
                         assert(expectedArgType != TYP_UNDEF);
                         if (expectedArgType == TYP_UNKNOWN)
                         {
-                            // JIT maps uint/ulong type vars to TYP_INT/TYP_LONG.                            
-                            expectedArgType = (*baseType == TYP_UINT || *baseType == TYP_ULONG) ? genActualType(*baseType) : *baseType;
+                            // The type of the argument will be genActualType(*baseType).                            
+                            expectedArgType = genActualType(*baseType);
                         }
                     }
                     else
index 4e70b9e..b4efc30 100644 (file)
@@ -8,16 +8,16 @@ if(CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_ARM)
   add_definitions(-DLEGACY_BACKEND)
 endif()
 
-if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_NETBSD)
-    # This is required to force using our own PAL, not one that we are loaded with.
-    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic -Bsymbolic-functions")
-endif(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_NETBSD)
-
 add_library_clr(${JIT_BASE_NAME}
    SHARED
    ${SHARED_LIB_SOURCES}
 )
 
+add_dependencies(${JIT_BASE_NAME} jit_exports)
+
+set_property(TARGET ${JIT_BASE_NAME} APPEND_STRING PROPERTY LINK_FLAGS ${JIT_EXPORTS_LINKER_OPTION})
+set_property(TARGET ${JIT_BASE_NAME} APPEND_STRING PROPERTY LINK_DEPENDS ${JIT_EXPORTS_FILE})
+
 set(RYUJIT_LINK_LIBRARIES
    utilcodestaticnohost
    gcinfo
index ce23bb4..81c3f53 100644 (file)
@@ -330,10 +330,6 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
 
 /*****************************************************************************/
 
-#define VALNUM_CSE_ENABLED      1
-
-/*****************************************************************************/
-
 #if defined(_TARGET_X86_)
 
   #define CPU_LOAD_STORE_ARCH      0
@@ -415,7 +411,7 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
 #else // LEGACY_BACKEND
   #define FEATURE_STACK_FP_X87     1       // Use flat register file model    
 #endif // LEGACY_BACKEND
-  #define FEATURE_X87_DOUBLES      (1-VALNUM_CSE_ENABLED)       // FP tree temps always use x87 doubles (when 1) or can be double or float (when 0)
+  #define FEATURE_X87_DOUBLES      0       // FP tree temps always use x87 doubles (when 1) or can be double or float (when 0).
   #define ETW_EBP_FRAMED           1       // if 1 we cannot use EBP as a scratch register and must create EBP based frames for most methods
   #define CSE_CONSTS               1       // Enable if we want to CSE constants
 
@@ -595,8 +591,10 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define REG_PINVOKE_SCRATCH      REG_EAX
   #define RBM_PINVOKE_SCRATCH      RBM_EAX
 
+#ifdef LEGACY_BACKEND
   #define REG_SPILL_CHOICE         REG_EAX
   #define RBM_SPILL_CHOICE         RBM_EAX
+#endif // LEGACY_BACKEND
 
   // The following defines are useful for iterating a regNumber
   #define REG_FIRST                REG_EAX
@@ -719,15 +717,15 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define FEATURE_MULTIREG_ARGS         1  // Support for passing a single argument in more than one register  
   #define FEATURE_MULTIREG_RET          1  // Support for returning a single value in more than one register
   #define FEATURE_STRUCT_CLASSIFIER     1  // Uses a classifier function to determine if structs are passed/returned in more than one register
-  #define MAX_PASS_MULTIREG_BYTES      32  // Maximum size of a struct that could be passed in more than one register
-  #define MAX_RET_MULTIREG_BYTES       32  // Maximum size of a struct that could be returned in more than one register
-  #define MAX_ARG_REG_COUNT             2  // Maximum registers used to pass an argument.
+  #define MAX_PASS_MULTIREG_BYTES      32  // Maximum size of a struct that could be passed in more than one register (Max is two SIMD16s)
+  #define MAX_RET_MULTIREG_BYTES       32  // Maximum size of a struct that could be returned in more than one register  (Max is two SIMD16s)
+  #define MAX_ARG_REG_COUNT             2  // Maximum registers used to pass a single argument in multiple registers.
   #define MAX_RET_REG_COUNT             2  // Maximum registers used to return a value.
 #else // !UNIX_AMD64_ABI
   #define FEATURE_MULTIREG_ARGS_OR_RET  0  // Support for passing and/or returning single values in more than one register
   #define FEATURE_MULTIREG_ARGS         0  // Support for passing a single argument in more than one register  
   #define FEATURE_MULTIREG_RET          0  // Support for returning a single value in more than one register  
-  #define MAX_ARG_REG_COUNT             1  // Maximum registers used to pass an argument.
+  #define MAX_ARG_REG_COUNT             1  // Maximum registers used to pass a single argument (no arguments are passed using multiple registers)
   #define MAX_RET_REG_COUNT             1  // Maximum registers used to return a value.
 #endif // !UNIX_AMD64_ABI
 
@@ -967,9 +965,6 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define REG_PINVOKE_SCRATCH      REG_EAX
   #define RBM_PINVOKE_SCRATCH      RBM_EAX
 
-  #define REG_SPILL_CHOICE         REG_EAX
-  #define RBM_SPILL_CHOICE         RBM_EAX
-
   // The following defines are useful for iterating a regNumber
   #define REG_FIRST                REG_EAX
   #define REG_INT_FIRST            REG_EAX
@@ -1162,8 +1157,9 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define FEATURE_STRUCT_CLASSIFIER     0  // Uses a classifier function to determine is structs are passed/returned in more than one register
   #define MAX_PASS_MULTIREG_BYTES      32  // Maximum size of a struct that could be passed in more than one register (Max is an HFA of 4 doubles)
   #define MAX_RET_MULTIREG_BYTES       32  // Maximum size of a struct that could be returned in more than one register (Max is an HFA of 4 doubles)
-  #define MAX_ARG_REG_COUNT             4  // Maximum registers used to pass an argument.
+  #define MAX_ARG_REG_COUNT             4  // Maximum registers used to pass a single argument in multiple registers. (max is 4 floats or doubles using an HFA)
   #define MAX_RET_REG_COUNT             4  // Maximum registers used to return a value.
+
 #ifdef FEATURE_USE_ASM_GC_WRITE_BARRIERS
   #define NOGC_WRITE_BARRIERS      0       // We DO-NOT have specialized WriteBarrier JIT Helpers that DO-NOT trash the RBM_CALLEE_TRASH registers
 #else
@@ -1350,10 +1346,12 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define REG_PINVOKE_SCRATCH      REG_R6
   #define RBM_PINVOKE_SCRATCH      RBM_R6
 
+#ifdef LEGACY_BACKEND
   #define REG_SPILL_CHOICE         REG_LR
   #define RBM_SPILL_CHOICE         RBM_LR
   #define REG_SPILL_CHOICE_FLT     REG_F14
   #define RBM_SPILL_CHOICE_FLT    (RBM_F14|RBM_F15)
+#endif // LEGACY_BACKEND
 
   // The following defines are useful for iterating a regNumber
   #define REG_FIRST                REG_R0
@@ -1423,8 +1421,7 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
 
   #define RBM_ARG_REGS            (RBM_ARG_0|RBM_ARG_1|RBM_ARG_2|RBM_ARG_3)
   #define RBM_FLTARG_REGS         (RBM_F0|RBM_F1|RBM_F2|RBM_F3|RBM_F4|RBM_F5|RBM_F6|RBM_F7|RBM_F8|RBM_F9|RBM_F10|RBM_F11|RBM_F12|RBM_F13|RBM_F14|RBM_F15)
-  #define RBM_DBL_REGS            (RBM_F0|RBM_F2|RBM_F4|RBM_F6|RBM_F8|RBM_F10|RBM_F12|RBM_F14|RBM_F16|RBM_F18|RBM_F20|RBM_F22|RBM_F24|RBM_F26|RBM_F28|RBM_F30)
-
+  #define RBM_DBL_REGS            RBM_ALLDOUBLE
 
   SELECTANY const regNumber fltArgRegs [] = {REG_F0, REG_F1, REG_F2, REG_F3, REG_F4, REG_F5, REG_F6, REG_F7, REG_F8, REG_F9, REG_F10, REG_F11, REG_F12, REG_F13, REG_F14, REG_F15 };
   SELECTANY const regMaskTP fltArgMasks[] = {RBM_F0, RBM_F1, RBM_F2, RBM_F3, RBM_F4, RBM_F5, RBM_F6, RBM_F7, RBM_F8, RBM_F9, RBM_F10, RBM_F11, RBM_F12, RBM_F13, RBM_F14, RBM_F15 };
@@ -1474,10 +1471,11 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define FEATURE_MULTIREG_ARGS_OR_RET  1  // Support for passing and/or returning single values in more than one register  
   #define FEATURE_MULTIREG_ARGS         1  // Support for passing a single argument in more than one register  
   #define FEATURE_MULTIREG_RET          0  // Support for returning a single value in more than one register  
-  #define FEATURE_STRUCT_CLASSIFIER     0   // Uses a classifier function to determine is structs are passed/returned in more than one register
-  #define MAX_PASS_MULTIREG_BYTES      16   // Maximum size of a struct that could be passed in more than one register
-  #define MAX_ARG_REG_COUNT             2  // Maximum registers used to pass an argument.
-  #define MAX_RET_REG_COUNT             2  // Maximum registers used to return a value.
+  #define FEATURE_STRUCT_CLASSIFIER     0  // Uses a classifier function to determine is structs are passed/returned in more than one register
+  #define MAX_PASS_MULTIREG_BYTES      32  // Maximum size of a struct that could be passed in more than one register (max is 4 doubles using an HFA)
+  #define MAX_RET_MULTIREG_BYTES        0  // Maximum size of a struct that could be returned in more than one register (Max is an HFA of 4 doubles)
+  #define MAX_ARG_REG_COUNT             4  // Maximum registers used to pass a single argument in multiple registers. (max is 4 floats or doubles using an HFA)
+  #define MAX_RET_REG_COUNT             1  // Maximum registers used to return a value.
 
 #ifdef FEATURE_USE_ASM_GC_WRITE_BARRIERS
   #define NOGC_WRITE_BARRIERS      1       // We have specialized WriteBarrier JIT Helpers that DO-NOT trash the RBM_CALLEE_TRASH registers
@@ -1528,8 +1526,8 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define RBM_ALLFLOAT            (RBM_FLT_CALLEE_SAVED | RBM_FLT_CALLEE_TRASH)
   #define RBM_ALLDOUBLE            RBM_ALLFLOAT
 
-  #define REG_VAR_ORDER            REG_R8,REG_R9,REG_R10,REG_R11,REG_R12,REG_R13,REG_R14,REG_R15,\
-                                   REG_R7,REG_R6,REG_R5,REG_R4,REG_R3,REG_R2,REG_R1,REG_R0,\
+  #define REG_VAR_ORDER            REG_R9,REG_R10,REG_R11,REG_R12,REG_R13,REG_R14,REG_R15,\
+                                   REG_R8,REG_R7,REG_R6,REG_R5,REG_R4,REG_R3,REG_R2,REG_R1,REG_R0,\
                                    REG_R19,REG_R20,REG_R21,REG_R22,REG_R23,REG_R24,REG_R25,REG_R26,REG_R27,REG_R28,\
 
   #define REG_VAR_ORDER_FLT        REG_V16, REG_V17, REG_V18, REG_V19, \
@@ -1558,12 +1556,12 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define REG_L_STK                REG_ZR
 
   //  This is the first register in REG_TMP_ORDER
-  #define REG_TMP_0                REG_R8
-  #define RBM_TMP_0                RBM_R8
+  #define REG_TMP_0                REG_R9
+  #define RBM_TMP_0                RBM_R9
 
   //  This is the second register in REG_TMP_ORDER
-  #define REG_TMP_1                REG_R9
-  #define RBM_TMP_1                RBM_R9
+  #define REG_TMP_1                REG_R10
+  #define RBM_TMP_1                RBM_R10
 
   // register to hold shift amount; no special register is required on ARM64.
   #define REG_SHIFT                REG_NA
@@ -1571,8 +1569,8 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define PREDICT_REG_SHIFT        PREDICT_REG
 
   // This is a general scratch register that does not conflict with the argument registers
-  #define REG_SCRATCH              REG_R8
-  #define RBM_SCRATCH              RBM_R8
+  #define REG_SCRATCH              REG_R9
+  #define RBM_SCRATCH              RBM_R9
 
   // This is a general register that can be optionally reserved for other purposes during codegen
   #define REG_OPT_RSVD             REG_IP1
@@ -1621,18 +1619,13 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
   #define PREDICT_REG_RER_INDIRECT_PARAM  PREDICT_REG_R11
 
   // Registers used by PInvoke frame setup
-  #define REG_PINVOKE_FRAME        REG_R8
-  #define RBM_PINVOKE_FRAME        RBM_R8
-  #define REG_PINVOKE_TCB          REG_R9
-  #define RBM_PINVOKE_TCB          RBM_R9
+  #define REG_PINVOKE_FRAME        REG_R9
+  #define RBM_PINVOKE_FRAME        RBM_R9
+  #define REG_PINVOKE_TCB          REG_R10
+  #define RBM_PINVOKE_TCB          RBM_R10
   #define REG_PINVOKE_SCRATCH      REG_R10
   #define RBM_PINVOKE_SCRATCH      RBM_R10
 
-  #define REG_SPILL_CHOICE         REG_R8
-  #define RBM_SPILL_CHOICE         RBM_R8
-  #define REG_SPILL_CHOICE_FLT     REG_F16
-  #define RBM_SPILL_CHOICE_FLT     RBM_F16
-
   // The following defines are useful for iterating a regNumber
   #define REG_FIRST                REG_R0
   #define REG_INT_FIRST            REG_R0
@@ -1679,7 +1672,6 @@ typedef unsigned short          regPairNoSmall; // arm: need 12 bits
 
   #define MAX_REG_ARG              8
   #define MAX_FLOAT_REG_ARG        8
-  #define MAX_HFA_RET_SLOTS        8
 
   #define REG_ARG_FIRST            REG_R0
   #define REG_ARG_LAST             REG_R7
index cf7d4c6..c8ec69e 100644 (file)
@@ -99,7 +99,6 @@ const BYTE          opcodeArgKinds[] =
 };
 #endif
 
-#if defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF)
 /*****************************************************************************/
 
 const   char *      varTypeName(var_types vt)
@@ -116,7 +115,6 @@ const   char *      varTypeName(var_types vt)
 
     return  varTypeNames[vt];
 }
-#endif // DEBUG || FEATURE_JIT_METHOD_PERF
 
 #if defined(DEBUG) || defined(LATE_DISASM)
 /*****************************************************************************
@@ -1702,26 +1700,26 @@ unsigned __int64 FloatingPointUtils::convertDoubleToUInt64(double d) {
 
 // Rounds a double-precision floating-point value to the nearest integer,
 // and rounds midpoint values to the nearest even number.
-// Note this should align with classlib in floatnative.cpp
+// Note this should align with classlib in floatdouble.cpp
 // Specializing for x86 using a x87 instruction is optional since
 // this outcome is identical across targets.
-double FloatingPointUtils::round(double d)
+double FloatingPointUtils::round(double x)
 {
     // If the number has no fractional part do nothing
     // This shortcut is necessary to workaround precision loss in borderline cases on some platforms
-    if (d == (double)(__int64)d)
-        return d;
+    if (x == ((double)((__int64)x))) {
+        return x;
+    }
+
+    // We had a number that was equally close to 2 integers.
+    // We need to return the even one.
 
-    double tempVal = (d + 0.5);
-    //We had a number that was equally close to 2 integers.
-    //We need to return the even one.
+    double tempVal = (x + 0.5);
     double flrTempVal = floor(tempVal);
-    if (flrTempVal == tempVal) {
-        if (fmod(tempVal, 2.0) != 0) {
-            flrTempVal -= 1.0;
-        }
+
+    if ((flrTempVal == tempVal) && (fmod(tempVal, 2.0) != 0)) {
+        flrTempVal -= 1.0;
     }
 
-    flrTempVal = _copysign(flrTempVal, d);
-    return flrTempVal;
+    return _copysign(flrTempVal, x);
 }
index af9f2db..7d77e76 100644 (file)
@@ -575,7 +575,7 @@ public:
 
     static unsigned __int64 convertDoubleToUInt64(double d);
 
-    static double round(double d);
+    static double round(double x);
 };
 
 
index 146b04e..5b4d95c 100644 (file)
@@ -157,7 +157,9 @@ HRESULT CheckIfWinMDAdapterNeeded(IMDCommon *pRawMDCommon)
         LPCSTR arefName;
         USHORT usMajorVersion;
         IfFailGo(pNewAdapter->m_pRawMetaModelCommonRO->CommonGetAssemblyRefProps(mdar, &usMajorVersion, NULL, NULL, NULL, NULL, NULL, NULL, &arefName, NULL, NULL, NULL));
-        if (0 == strcmp(arefName, CoreLibName_A))
+        
+        // We check for legacy Core library name since Windows.winmd references mscorlib and not System.Private.CoreLib
+        if (0 == strcmp(arefName, LegacyCoreLibName_A))
         {
             pNewAdapter->m_assemblyRefMscorlib = mdar;
 
index f44944e..468b694 100644 (file)
@@ -7,12 +7,13 @@
  
   <!-- Compilation options -->
   <PropertyGroup>
-    <AvailablePlatforms>amd64,x86,arm,arm64</AvailablePlatforms>
+    <AvailablePlatforms>amd64,x86,arm,arm-softfp,arm64</AvailablePlatforms>
     <Configuration Condition=" '$(Configuration)' == '' ">$(BuildType)</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">$(BuildArch)</Platform>
     <!-- The CLR properties use amd64 as their platform string, we want to keep in sync with those, so set Platform appropriately,
          though still use the 'x64' output path (see use of BuildArch below) -->
     <Platform Condition=" '$(Platform)' == 'x64' ">amd64</Platform>
+    <Platform Condition=" '$(Platform)' == 'arm-softfp' ">arm</Platform>
     <ProjectGuid>{3DA06C3A-2E7B-4CB7-80ED-9B12916013F9}</ProjectGuid>
 
     <OutputType>Library</OutputType>
@@ -29,7 +30,6 @@
     <HighEntropyVA>true</HighEntropyVA>
     <ErrorReport>prompt</ErrorReport>
     <Optimize Condition="'$(Optimize)' == ''">true</Optimize>
-    <GenerateNativeVersionInfo Condition="'$(OsEnvironment)'=='Windows_NT'">true</GenerateNativeVersionInfo>
     <CLSCompliant>true</CLSCompliant>
     <WarningLevel>4</WarningLevel>
     <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
index 9806ee0..d163967 100644 (file)
 
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
-    <AvailablePlatforms>amd64,x86,arm,arm64</AvailablePlatforms>
+    <AvailablePlatforms>amd64,x86,arm,arm-softfp,arm64</AvailablePlatforms>
     <Configuration Condition=" '$(Configuration)' == '' ">$(BuildType)</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">$(BuildArch)</Platform>
     <!-- The CLR properties use amd64 as their platform string, we want to keep in sync with those, so set Platform appropriately,
          though still use the 'x64' output path (see use of BuildArch below) -->
     <Platform Condition=" '$(Platform)' == 'x64' ">amd64</Platform>
+    <Platform Condition=" '$(Platform)' == 'arm-softfp' ">arm</Platform>
+
+    <!-- We want to exclude the transitive closure of the packages pulled in via project.json as that introduces ambiguity -->
+    <OmitTransitiveCompileReferences>true</OmitTransitiveCompileReferences>
   </PropertyGroup>
 
   <!-- Default configurations to help VS understand the options -->
diff --git a/src/mscorlib/facade/project.json b/src/mscorlib/facade/project.json
new file mode 100644 (file)
index 0000000..c3a0e7d
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "dependencies": {
+    "System.Security.Cryptography.Primitives": "4.0.0-rc2-24027",
+    "System.Security.Claims": "4.0.0-rc2-24027"
+  },
+  "frameworks": {
+    "netstandard1.3": {
+      "imports": [
+        "dotnet5.4"
+      ]
+    }
+  }
+}
\ No newline at end of file
index ef9cb15..2df044a 100644 (file)
       <Member MemberType="Property" Name="Default" />
       <Member Name="GetAssemblyName(System.String)" />
       <Member Name="GetLoadContext(System.Reflection.Assembly)" />
-      <Member Name="InitializeDefaultContext(System.Runtime.Loader.AssemblyLoadContext)" />
       <Member Name="LoadFromAssemblyName(System.Reflection.AssemblyName)" />
       <Member Name="Load(System.Reflection.AssemblyName)" />
       <Member Name="LoadFromAssemblyPath(System.String)" />
       <Member Name="LoadFromStream(System.IO.Stream)" />
       <Member Name="LoadFromStream(System.IO.Stream,System.IO.Stream)" />
       <Member Name="Resolve(System.IntPtr,System.Reflection.AssemblyName)" />
+      <Member Name="ResolveUsingResolvingEvent(System.IntPtr,System.Reflection.AssemblyName)" />
       <Member Name="ResolveUnmanagedDll(System.String,System.IntPtr)" />
       <Member Name="LoadUnmanagedDll(System.String)" />
       <Member Name="LoadUnmanagedDllFromPath(System.String)" />
index 0a5be7a..23b7d5c 100644 (file)
       <Member MemberType="Property" Name="Default" />
       <Member Name="GetAssemblyName(System.String)" />
       <Member Name="GetLoadContext(System.Reflection.Assembly)" />
-      <Member Name="InitializeDefaultContext(System.Runtime.Loader.AssemblyLoadContext)" />
       <Member Name="LoadFromAssemblyName(System.Reflection.AssemblyName)" />
       <Member Name="Load(System.Reflection.AssemblyName)" />
       <Member Name="LoadFromAssemblyPath(System.String)" />
       <Member Name="LoadFromStream(System.IO.Stream)" />
       <Member Name="LoadFromStream(System.IO.Stream,System.IO.Stream)" />
       <Member Name="Resolve(System.IntPtr,System.Reflection.AssemblyName)" />
+      <Member Name="ResolveUsingResolvingEvent(System.IntPtr,System.Reflection.AssemblyName)" />
       <Member Name="ResolveUnmanagedDll(System.String,System.IntPtr)" />
       <Member Name="LoadUnmanagedDll(System.String)" />
       <Member Name="LoadUnmanagedDllFromPath(System.String)" />
index 9f5615d..ec96bf1 100644 (file)
@@ -7,12 +7,13 @@
  
   <!-- Compilation options -->
   <PropertyGroup>
-    <AvailablePlatforms>amd64,x86,arm,arm64</AvailablePlatforms>
+    <AvailablePlatforms>amd64,x86,arm,arm-softfp,arm64</AvailablePlatforms>
     <Configuration Condition=" '$(Configuration)' == '' ">$(BuildType)</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">$(BuildArch)</Platform>
     <!-- The CLR properties use amd64 as their platform string, we want to keep in sync with those, so set Platform appropriately,
          though still use the 'x64' output path (see use of BuildArch below) -->
     <Platform Condition=" '$(Platform)' == 'x64' ">amd64</Platform>
+    <Platform Condition=" '$(Platform)' == 'arm-softfp' ">arm</Platform>
     <ProjectGuid>{3DA06C3A-2E7B-4CB7-80ED-9B12916013F9}</ProjectGuid>
 
     <OutputType>Library</OutputType>
@@ -29,7 +30,6 @@
     <HighEntropyVA>true</HighEntropyVA>
     <ErrorReport>prompt</ErrorReport>
     <Optimize Condition="'$(Optimize)' == ''">true</Optimize>
-    <GenerateNativeVersionInfo Condition="'$(OsEnvironment)'=='Windows_NT'">true</GenerateNativeVersionInfo>
     <CLSCompliant>true</CLSCompliant>
     <WarningLevel>4</WarningLevel>
     <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
index 5d62087..2522241 100644 (file)
@@ -1,3 +1,5 @@
+[assembly:System.Runtime.CompilerServices.InternalsVisibleTo("System.Runtime.WindowsRuntime, PublicKey=00000000000000000400000000000000")]
+
 namespace Microsoft.Win32.SafeHandles
 {
     [System.Security.SecurityCriticalAttribute]
@@ -17,6 +19,12 @@ namespace Microsoft.Win32.SafeHandles
 }
 namespace System
 {
+    [System.Runtime.InteropServices.ComVisible(true)]
+    public interface ICloneable
+    {
+        object Clone();
+    }
+
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public partial class AccessViolationException : System.SystemException
     {
@@ -1749,6 +1757,9 @@ namespace System
         public virtual System.Exception GetBaseException() { return default(System.Exception); }
         [System.Security.SecuritySafeCriticalAttribute]
         public override string ToString() { return default(string); }
+
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal void AddExceptionDataForRestrictedErrorInfo(string restrictedError, string restrictedErrorReference, string restrictedCapabilitySid, object restrictedErrorObject, bool hasrestrictedLanguageErrorObject = false) { }
     }
     [System.ObsoleteAttribute("This type previously indicated an unspecified fatal error in the runtime. The runtime no longer raises this exception so this type is obsolete.")]
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
@@ -4806,6 +4817,60 @@ namespace System.Diagnostics.SymbolStore
 }
 namespace System.Diagnostics.Tracing
 {
+    [System.Diagnostics.Tracing.EventSourceAttribute(Guid = "8E9F5090-2D75-4d03-8A81-E5AFBF85DAF1", Name = "System.Diagnostics.Eventing.FrameworkEventSource")]
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal sealed partial class FrameworkEventSource : System.Diagnostics.Tracing.EventSource
+    {
+        internal static readonly System.Diagnostics.Tracing.FrameworkEventSource Log;
+        private FrameworkEventSource() { }
+        internal static bool IsInitialized { get { return default(bool); } }
+        [System.Diagnostics.Tracing.EventAttribute(31, Level = (System.Diagnostics.Tracing.EventLevel)(5), Keywords = (System.Diagnostics.Tracing.EventKeywords)(18))]
+        internal void ThreadPoolDequeueWork(long workID) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal void ThreadPoolDequeueWorkObject(object workID) { }
+        [System.Diagnostics.Tracing.EventAttribute(30, Level = (System.Diagnostics.Tracing.EventLevel)(5), Keywords = (System.Diagnostics.Tracing.EventKeywords)(18))]
+        internal void ThreadPoolEnqueueWork(long workID) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal void ThreadPoolEnqueueWorkObject(object workID) { }
+        [System.Diagnostics.Tracing.EventAttribute(151, Level = (System.Diagnostics.Tracing.EventLevel)(4), Keywords = (System.Diagnostics.Tracing.EventKeywords)(16), Task = (System.Diagnostics.Tracing.EventTask)(3), Opcode = (System.Diagnostics.Tracing.EventOpcode)(240))]
+        internal void ThreadTransferReceive(long id, int kind, string info) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal void ThreadTransferReceiveObj(object id, int kind, string info) { }
+        [System.Diagnostics.Tracing.EventAttribute(150, Level = (System.Diagnostics.Tracing.EventLevel)(4), Keywords = (System.Diagnostics.Tracing.EventKeywords)(16), Task = (System.Diagnostics.Tracing.EventTask)(3), Opcode = (System.Diagnostics.Tracing.EventOpcode)(9))]
+        internal void ThreadTransferSend(long id, int kind, string info, bool multiDequeues) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal void ThreadTransferSendObj(object id, int kind, string info, bool multiDequeues) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        private void WriteEvent(int eventId, long arg1, int arg2, string arg3) { }
+        [System.Diagnostics.Tracing.NonEventAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        private void WriteEvent(int eventId, long arg1, int arg2, string arg3, bool arg4) { }
+        public static partial class Keywords
+        {
+            public const System.Diagnostics.Tracing.EventKeywords DynamicTypeUsage = (System.Diagnostics.Tracing.EventKeywords)8;
+            public const System.Diagnostics.Tracing.EventKeywords Loader = (System.Diagnostics.Tracing.EventKeywords)1;
+            public const System.Diagnostics.Tracing.EventKeywords NetClient = (System.Diagnostics.Tracing.EventKeywords)4;
+            public const System.Diagnostics.Tracing.EventKeywords ThreadPool = (System.Diagnostics.Tracing.EventKeywords)2;
+            public const System.Diagnostics.Tracing.EventKeywords ThreadTransfer = (System.Diagnostics.Tracing.EventKeywords)16;
+        }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        public static partial class Opcodes
+        {
+            public const System.Diagnostics.Tracing.EventOpcode ReceiveHandled = (System.Diagnostics.Tracing.EventOpcode)11;
+        }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        public static partial class Tasks
+        {
+            public const System.Diagnostics.Tracing.EventTask GetRequestStream = (System.Diagnostics.Tracing.EventTask) 2;
+            public const System.Diagnostics.Tracing.EventTask GetResponse = (System.Diagnostics.Tracing.EventTask)1;
+            public const System.Diagnostics.Tracing.EventTask ThreadTransfer = (System.Diagnostics.Tracing.EventTask)3;
+        }
+    }
     [System.FlagsAttribute]
     public enum EventActivityOptions
     {
@@ -5132,6 +5197,386 @@ namespace System.Diagnostics.Tracing
 }
 namespace System.Globalization
 {
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal partial class CultureData
+    {
+        private bool bNeutral;
+        private bool bUseOverrides;
+        private System.Globalization.CalendarData[] calendars;
+        private int iCurrency;
+        private int iCurrencyDigits;
+        private int iDigits;
+        private int iDigitSubstitution;
+        private int iFirstDayOfWeek;
+        private int iFirstWeekOfYear;
+        private int iGeoId;
+        private int iLeadingZeros;
+        private int iMeasure;
+        private int iNegativeCurrency;
+        private int iNegativeNumber;
+        private int iNegativePercent;
+        private int iPositivePercent;
+        private int iReadingLayout;
+        private const uint LOCALE_FONTSIGNATURE = (uint)88;
+        private const uint LOCALE_ICALENDARTYPE = (uint)4105;
+        private const uint LOCALE_ICENTURY = (uint)36;
+        private const uint LOCALE_ICOUNTRY = (uint)5;
+        private const uint LOCALE_ICURRDIGITS = (uint)25;
+        private const uint LOCALE_ICURRENCY = (uint)27;
+        private const uint LOCALE_IDATE = (uint)33;
+        private const uint LOCALE_IDAYLZERO = (uint)38;
+        private const uint LOCALE_IDEFAULTANSICODEPAGE = (uint)4100;
+        private const uint LOCALE_IDEFAULTCODEPAGE = (uint)11;
+        private const uint LOCALE_IDEFAULTCOUNTRY = (uint)10;
+        private const uint LOCALE_IDEFAULTEBCDICCODEPAGE = (uint)4114;
+        private const uint LOCALE_IDEFAULTLANGUAGE = (uint)9;
+        private const uint LOCALE_IDEFAULTMACCODEPAGE = (uint)4113;
+        private const uint LOCALE_IDIGITS = (uint)17;
+        private const uint LOCALE_IDIGITSUBSTITUTION = (uint)4116;
+        private const uint LOCALE_IFIRSTDAYOFWEEK = (uint)4108;
+        private const uint LOCALE_IFIRSTWEEKOFYEAR = (uint)4109;
+        private const uint LOCALE_IGEOID = (uint)91;
+        private const uint LOCALE_IINTLCURRDIGITS = (uint)26;
+        private const uint LOCALE_ILDATE = (uint)34;
+        private const uint LOCALE_ILZERO = (uint)18;
+        private const uint LOCALE_IMEASURE = (uint)13;
+        private const uint LOCALE_IMONLZERO = (uint)39;
+        private const uint LOCALE_INEGATIVEPERCENT = (uint)116;
+        private const uint LOCALE_INEGCURR = (uint)28;
+        private const uint LOCALE_INEGNUMBER = (uint)4112;
+        private const uint LOCALE_INEGSEPBYSPACE = (uint)87;
+        private const uint LOCALE_INEGSIGNPOSN = (uint)83;
+        private const uint LOCALE_INEGSYMPRECEDES = (uint)86;
+        private const uint LOCALE_INEUTRAL = (uint)113;
+        private const uint LOCALE_IOPTIONALCALENDAR = (uint)4107;
+        private const uint LOCALE_IPAPERSIZE = (uint)4106;
+        private const uint LOCALE_IPOSITIVEPERCENT = (uint)117;
+        private const uint LOCALE_IPOSSEPBYSPACE = (uint)85;
+        private const uint LOCALE_IPOSSIGNPOSN = (uint)82;
+        private const uint LOCALE_IPOSSYMPRECEDES = (uint)84;
+        private const uint LOCALE_IREADINGLAYOUT = (uint)112;
+        private const uint LOCALE_ITIME = (uint)35;
+        private const uint LOCALE_ITIMEMARKPOSN = (uint)4101;
+        private const uint LOCALE_ITLZERO = (uint)37;
+        private const uint LOCALE_NOUSEROVERRIDE = (uint)2147483648;
+        private const uint LOCALE_RETURN_GENITIVE_NAMES = (uint)268435456;
+        private const uint LOCALE_RETURN_NUMBER = (uint)536870912;
+        private const uint LOCALE_S1159 = (uint)40;
+        private const uint LOCALE_S2359 = (uint)41;
+        private const uint LOCALE_SABBREVCTRYNAME = (uint)7;
+        private const uint LOCALE_SABBREVDAYNAME1 = (uint)49;
+        private const uint LOCALE_SABBREVDAYNAME2 = (uint)50;
+        private const uint LOCALE_SABBREVDAYNAME3 = (uint)51;
+        private const uint LOCALE_SABBREVDAYNAME4 = (uint)52;
+        private const uint LOCALE_SABBREVDAYNAME5 = (uint)53;
+        private const uint LOCALE_SABBREVDAYNAME6 = (uint)54;
+        private const uint LOCALE_SABBREVDAYNAME7 = (uint)55;
+        private const uint LOCALE_SABBREVLANGNAME = (uint)3;
+        private const uint LOCALE_SABBREVMONTHNAME1 = (uint)68;
+        private const uint LOCALE_SABBREVMONTHNAME10 = (uint)77;
+        private const uint LOCALE_SABBREVMONTHNAME11 = (uint)78;
+        private const uint LOCALE_SABBREVMONTHNAME12 = (uint)79;
+        private const uint LOCALE_SABBREVMONTHNAME13 = (uint)4111;
+        private const uint LOCALE_SABBREVMONTHNAME2 = (uint)69;
+        private const uint LOCALE_SABBREVMONTHNAME3 = (uint)70;
+        private const uint LOCALE_SABBREVMONTHNAME4 = (uint)71;
+        private const uint LOCALE_SABBREVMONTHNAME5 = (uint)72;
+        private const uint LOCALE_SABBREVMONTHNAME6 = (uint)73;
+        private const uint LOCALE_SABBREVMONTHNAME7 = (uint)74;
+        private const uint LOCALE_SABBREVMONTHNAME8 = (uint)75;
+        private const uint LOCALE_SABBREVMONTHNAME9 = (uint)76;
+        private const uint LOCALE_SCONSOLEFALLBACKNAME = (uint)110;
+        private const uint LOCALE_SCURRENCY = (uint)20;
+        private const uint LOCALE_SDATE = (uint)29;
+        private const uint LOCALE_SDAYNAME1 = (uint)42;
+        private const uint LOCALE_SDAYNAME2 = (uint)43;
+        private const uint LOCALE_SDAYNAME3 = (uint)44;
+        private const uint LOCALE_SDAYNAME4 = (uint)45;
+        private const uint LOCALE_SDAYNAME5 = (uint)46;
+        private const uint LOCALE_SDAYNAME6 = (uint)47;
+        private const uint LOCALE_SDAYNAME7 = (uint)48;
+        private const uint LOCALE_SDECIMAL = (uint)14;
+        private const uint LOCALE_SDURATION = (uint)93;
+        private const uint LOCALE_SENGCURRNAME = (uint)4103;
+        private const uint LOCALE_SENGLISHCOUNTRYNAME = (uint)4098;
+        private const uint LOCALE_SENGLISHDISPLAYNAME = (uint)114;
+        private const uint LOCALE_SENGLISHLANGUAGENAME = (uint)4097;
+        private const uint LOCALE_SGROUPING = (uint)16;
+        private const uint LOCALE_SINTLSYMBOL = (uint)21;
+        private const uint LOCALE_SISO3166CTRYNAME = (uint)90;
+        private const uint LOCALE_SISO3166CTRYNAME2 = (uint)104;
+        private const uint LOCALE_SISO639LANGNAME = (uint)89;
+        private const uint LOCALE_SISO639LANGNAME2 = (uint)103;
+        private const uint LOCALE_SKEYBOARDSTOINSTALL = (uint)94;
+        private const uint LOCALE_SLIST = (uint)12;
+        private const uint LOCALE_SLOCALIZEDCOUNTRYNAME = (uint)6;
+        private const uint LOCALE_SLOCALIZEDDISPLAYNAME = (uint)2;
+        private const uint LOCALE_SLOCALIZEDLANGUAGENAME = (uint)111;
+        private const uint LOCALE_SLONGDATE = (uint)32;
+        private const uint LOCALE_SMONDECIMALSEP = (uint)22;
+        private const uint LOCALE_SMONGROUPING = (uint)24;
+        private const uint LOCALE_SMONTHDAY = (uint)120;
+        private const uint LOCALE_SMONTHNAME1 = (uint)56;
+        private const uint LOCALE_SMONTHNAME10 = (uint)65;
+        private const uint LOCALE_SMONTHNAME11 = (uint)66;
+        private const uint LOCALE_SMONTHNAME12 = (uint)67;
+        private const uint LOCALE_SMONTHNAME13 = (uint)4110;
+        private const uint LOCALE_SMONTHNAME2 = (uint)57;
+        private const uint LOCALE_SMONTHNAME3 = (uint)58;
+        private const uint LOCALE_SMONTHNAME4 = (uint)59;
+        private const uint LOCALE_SMONTHNAME5 = (uint)60;
+        private const uint LOCALE_SMONTHNAME6 = (uint)61;
+        private const uint LOCALE_SMONTHNAME7 = (uint)62;
+        private const uint LOCALE_SMONTHNAME8 = (uint)63;
+        private const uint LOCALE_SMONTHNAME9 = (uint)64;
+        private const uint LOCALE_SMONTHOUSANDSEP = (uint)23;
+        private const uint LOCALE_SNAME = (uint)92;
+        private const uint LOCALE_SNAN = (uint)105;
+        private const uint LOCALE_SNATIVECOUNTRYNAME = (uint)8;
+        private const uint LOCALE_SNATIVECURRNAME = (uint)4104;
+        private const uint LOCALE_SNATIVEDIGITS = (uint)19;
+        private const uint LOCALE_SNATIVEDISPLAYNAME = (uint)115;
+        private const uint LOCALE_SNATIVELANGUAGENAME = (uint)4;
+        private const uint LOCALE_SNEGATIVESIGN = (uint)81;
+        private const uint LOCALE_SNEGINFINITY = (uint)107;
+        private const uint LOCALE_SOPENTYPELANGUAGETAG = (uint)122;
+        private const uint LOCALE_SPARENT = (uint)109;
+        private const uint LOCALE_SPERCENT = (uint)118;
+        private const uint LOCALE_SPERMILLE = (uint)119;
+        private const uint LOCALE_SPOSINFINITY = (uint)106;
+        private const uint LOCALE_SPOSITIVESIGN = (uint)80;
+        private const uint LOCALE_SSCRIPTS = (uint)108;
+        private const uint LOCALE_SSHORTDATE = (uint)31;
+        private const uint LOCALE_SSHORTESTDAYNAME1 = (uint)96;
+        private const uint LOCALE_SSHORTESTDAYNAME2 = (uint)97;
+        private const uint LOCALE_SSHORTESTDAYNAME3 = (uint)98;
+        private const uint LOCALE_SSHORTESTDAYNAME4 = (uint)99;
+        private const uint LOCALE_SSHORTESTDAYNAME5 = (uint)100;
+        private const uint LOCALE_SSHORTESTDAYNAME6 = (uint)101;
+        private const uint LOCALE_SSHORTESTDAYNAME7 = (uint)102;
+        private const uint LOCALE_SSHORTTIME = (uint)121;
+        private const uint LOCALE_SSORTLOCALE = (uint)123;
+        private const uint LOCALE_SSORTNAME = (uint)4115;
+        private const uint LOCALE_STHOUSAND = (uint)15;
+        private const uint LOCALE_STIME = (uint)30;
+        private const uint LOCALE_STIMEFORMAT = (uint)4099;
+        private const uint LOCALE_SYEARMONTH = (uint)4102;
+        private static System.Collections.Generic.Dictionary<string, System.Globalization.CultureData> s_cachedCultures;
+        private static System.Collections.Generic.Dictionary<string, System.Globalization.CultureData> s_cachedRegions;
+        private static System.Globalization.CultureData s_Invariant;
+        private string[] saDurationFormats;
+        private string[] saLongTimes;
+        private string sAM1159;
+        private string[] saNativeDigits;
+        private string[] saShortTimes;
+        private string sCompareInfo;
+        private string sCurrency;
+        private string sDecimalSeparator;
+        private string sEnglishCountry;
+        private string sEnglishCurrency;
+        private string sEnglishDisplayName;
+        private string sEnglishLanguage;
+        private string sIntlMonetarySymbol;
+        private string sISO3166CountryName;
+        private string sISO639Language;
+        private string sListSeparator;
+        private string sLocalizedCountry;
+        private string sLocalizedDisplayName;
+        private string sLocalizedLanguage;
+        private string sMonetaryDecimal;
+        private string sMonetaryThousand;
+        private string sName;
+        private string sNaN;
+        private string sNativeCountry;
+        private string sNativeCurrency;
+        private string sNativeDisplayName;
+        private string sNativeLanguage;
+        private string sNegativeInfinity;
+        private string sNegativeSign;
+        private string sParent;
+        internal static System.Globalization.CultureInfo[] specificCultures;
+        private string sPercent;
+        private string sPerMille;
+        private string sPM2359;
+        private string sPositiveInfinity;
+        private string sPositiveSign;
+        private string sRealName;
+        private string sRegionName;
+        private string sScripts;
+        private string sSpecificCulture;
+        private string sTextInfo;
+        private string sThousandSeparator;
+        private string sTimeSeparator;
+        private string sWindowsName;
+        internal const uint TIME_NOSECONDS = (uint)2;
+        private const int undef = -1;
+        private int[] waCalendars;
+        private int[] waGrouping;
+        private int[] waMonetaryGrouping;
+        public CultureData() { }
+        internal int[] CalendarIds { get { return default(int[]); } }
+        internal string CultureName { get { return default(string); } }
+        internal System.Globalization.Calendar DefaultCalendar { get { return default(System.Globalization.Calendar); } }
+        internal int IFIRSTDAYOFWEEK { get { return default(int); } }
+        internal int IFIRSTWEEKOFYEAR { get { return default(int); } }
+        internal int IMEASURE { get { return default(int); } }
+        internal int INEGATIVEPERCENT { get { return default(int); } }
+        internal static System.Globalization.CultureData Invariant { get { return default(System.Globalization.CultureData); } }
+        internal int IPOSITIVEPERCENT { get { return default(int); } }
+        private int IREADINGLAYOUT { get { return default(int); } }
+        internal bool IsInvariantCulture { get { return default(bool); } }
+        internal bool IsNeutralCulture { get { return default(bool); } }
+        internal bool IsRightToLeft { get { return default(bool); } }
+        internal string[] LongTimes { get { return default(string[]); } }
+        internal string SAM1159 { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SCOMPAREINFO { get { return default(string); } }
+        internal string SCURRENCY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SENGCOUNTRY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SENGDISPLAYNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SENGLISHLANGUAGE { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string[] ShortTimes { get { return default(string[]); } }
+        internal string SINTLSYMBOL { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SISO3166CTRYNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SISO639LANGNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SLIST { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SLOCALIZEDCOUNTRY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SLOCALIZEDDISPLAYNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SLOCALIZEDLANGUAGE { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SNAME { get { return default(string); } }
+        internal string SNAN { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SNATIVECOUNTRY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SNATIVEDISPLAYNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SNATIVELANGUAGE { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SNEGINFINITY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SPARENT { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        private static System.Globalization.CultureInfo[] SpecificCultures { get { return default(System.Globalization.CultureInfo[]); } }
+        internal string SPERCENT { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SPERMILLE { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SPM2359 { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SPOSINFINITY { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string SREGIONNAME { [System.Security.SecurityCriticalAttribute]get { return default(string); } }
+        internal string STEXTINFO { get { return default(string); } }
+        internal string TimeSeparator { [System.Security.SecuritySafeCriticalAttribute]get { return default(string); } }
+        internal bool UseUserOverride { get { return default(bool); } }
+        internal int[] WAGROUPING { [System.Security.SecurityCriticalAttribute]get { return default(int[]); } }
+        internal int[] WAMONGROUPING { [System.Security.SecurityCriticalAttribute]get { return default(int[]); } }
+        internal string[] AbbrevEraNames(int calendarId) { return default(string[]); }
+        internal string[] AbbreviatedDayNames(int calendarId) { return default(string[]); }
+        internal string[] AbbreviatedEnglishEraNames(int calendarId) { return default(string[]); }
+        internal string[] AbbreviatedGenitiveMonthNames(int calendarId) { return default(string[]); }
+        internal string[] AbbreviatedMonthNames(int calendarId) { return default(string[]); }
+        internal static string AnsiToLower(string testString) { return default(string); }
+        private static int ConvertFirstDayOfWeekMonToSun(int iTemp) { return default(int); }
+        private static int[] ConvertWin32GroupString(string win32Str) { return default(int[]); }
+        private static System.Globalization.CultureData CreateCultureData(string cultureName, bool useUserOverride) { return default(System.Globalization.CultureData); }
+        internal string DateSeparator(int calendarId) { return default(string); }
+        internal string[] DayNames(int calendarId) { return default(string[]); }
+        private string[] DeriveShortTimesFromLong() { return default(string[]); }
+        private string[] DoEnumShortTimeFormats() { return default(string[]); }
+        private string[] DoEnumTimeFormats() { return default(string[]); }
+        [System.Security.SecurityCriticalAttribute]
+        private string DoGetLocaleInfo(string localeName, uint lctype) { return default(string); }
+        [System.Security.SecurityCriticalAttribute]
+        private string DoGetLocaleInfo(uint lctype) { return default(string); }
+        private int DoGetLocaleInfoInt(uint lctype) { return default(int); }
+        internal string[] EraNames(int calendarId) { return default(string[]); }
+        internal string[] GenitiveMonthNames(int calendarId) { return default(string[]); }
+        internal System.Globalization.CalendarData GetCalendar(int calendarId) { return default(System.Globalization.CalendarData); }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static System.Globalization.CultureData GetCultureData(string cultureName, bool useUserOverride) { return default(System.Globalization.CultureData); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.Globalization.CultureData GetCultureDataForRegion(string cultureName, bool useUserOverride) { return default(System.Globalization.CultureData); }
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal static System.Globalization.CultureInfo[] GetCultures(System.Globalization.CultureTypes types) { return default(System.Globalization.CultureInfo[]); }
+        private static string GetDateSeparator(string format) { return default(string); }
+        private static int GetIndexOfNextTokenAfterSeconds(string time, int index, out bool containsSpace) { containsSpace = default(bool); return default(int); }
+        [System.Security.SecurityCriticalAttribute]
+        internal void GetNFIValues(System.Globalization.NumberFormatInfo nfi) { }
+        private static string GetSeparator(string format, string timeParts) { return default(string); }
+        private static string GetTimeSeparator(string format) { return default(string); }
+        private static int IndexOfTimePart(string format, int startIndex, string timeParts) { return default(int); }
+        private bool InitCultureData() { return default(bool); }
+        internal string[] LeapYearMonthNames(int calendarId) { return default(string[]); }
+        internal string[] LongDates(int calendarId) { return default(string[]); }
+        internal string MonthDay(int calendarId) { return default(string); }
+        internal string[] MonthNames(int calendarId) { return default(string[]); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.PreserveSig)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static int nativeEnumCultureNames(int cultureTypes, System.Runtime.CompilerServices.ObjectHandleOnStack retStringArray) { return default(int); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecuritySafeCriticalAttribute]
+        private static string[] nativeEnumTimeFormats(string localeName, uint dwFlags, bool useUserOverride) { return default(string[]); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal static bool nativeGetNumberFormatInfoValues(string localeName, System.Globalization.NumberFormatInfo nfi, bool useUserOverride) { return default(bool); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal static bool nativeInitCultureData(System.Globalization.CultureData cultureData) { return default(bool); }
+        internal static string ReescapeWin32String(string str) { return default(string); }
+        internal static string[] ReescapeWin32Strings(string[] array) { return default(string[]); }
+        internal string[] ShortDates(int calendarId) { return default(string[]); }
+        private static string StripSecondsFromPattern(string time) { return default(string); }
+        internal string[] SuperShortDayNames(int calendarId) { return default(string[]); }
+        private static string UnescapeNlsString(string str, int start, int end) { return default(string); }
+        internal string[] YearMonths(int calendarId) { return default(string[]); }
+    }
+
+    internal partial class CalendarData
+    {
+        internal bool bUseUserOverrides;
+        internal int iCurrentEra;
+        internal static System.Globalization.CalendarData Invariant;
+        internal int iTwoDigitYearMax;
+        internal const int MAX_CALENDARS = 23;
+        internal string[] saAbbrevDayNames;
+        internal string[] saAbbrevEnglishEraNames;
+        internal string[] saAbbrevEraNames;
+        internal string[] saAbbrevMonthGenitiveNames;
+        internal string[] saAbbrevMonthNames;
+        internal string[] saDayNames;
+        internal string[] saEraNames;
+        internal string[] saLeapYearMonthNames;
+        internal string[] saLongDates;
+        internal string[] saMonthGenitiveNames;
+        internal string[] saMonthNames;
+        internal string[] saShortDates;
+        internal string[] saSuperShortDayNames;
+        internal string[] saYearMonths;
+        internal string sMonthDay;
+        internal string sNativeName;
+        private CalendarData() { }
+        internal CalendarData(string localeName, int calendarId, bool bUseUserOverrides) { }
+        private static string CalendarIdToCultureName(int calendarId) { return default(string); }
+        internal static System.Globalization.CalendarData GetCalendarData(int calendarId) { return default(System.Globalization.CalendarData); }
+        private void InitializeAbbreviatedEraNames(string localeName, int calendarId) { }
+        private void InitializeEraNames(string localeName, int calendarId) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecuritySafeCriticalAttribute]
+        private static bool nativeGetCalendarData(System.Globalization.CalendarData data, string localeName, int calendar) { return default(bool); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal static int nativeGetCalendars(string localeName, bool useUserOverride, int[] calendars) { calendars = default(int[]); return default(int); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static int nativeGetTwoDigitYearMax(int calID) { return default(int); }
+    }
+
+    [System.FlagsAttribute]
+    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
+    internal enum CultureTypes
+    {
+        AllCultures = 7,
+        [System.ObsoleteAttribute("This value has been deprecated.  Please use other values in CultureTypes.")]
+        FrameworkCultures = 64,
+        InstalledWin32Cultures = 4,
+        NeutralCultures = 1,
+        ReplacementCultures = 16,
+        SpecificCultures = 2,
+        UserCustomCulture = 8,
+        [System.ObsoleteAttribute("This value has been deprecated.  Please use other values in CultureTypes.")]
+        WindowsOnlyCultures = 32,
+    }
+
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public abstract partial class Calendar
     {
@@ -5966,6 +6411,67 @@ namespace System.Globalization
 }
 namespace System.IO
 {
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
+    internal sealed partial class BufferedStream : System.IO.Stream
+    {
+        private byte[] _buffer;
+        private readonly int _bufferSize;
+        private const int _DefaultBufferSize = 4096;
+        private System.Threading.Tasks.Task<int> _lastSyncCompletedReadTask;
+        private int _readLen;
+        private int _readPos;
+        private System.IO.Stream _stream;
+        private int _writePos;
+        private const int MaxShadowBufferSize = 81920;
+        private BufferedStream() { }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal BufferedStream(System.IO.Stream stream, int bufferSize) { }
+        internal int BufferSize { [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]get { return default(int); } }
+        public override bool CanRead { get { return default(bool); } }
+        public override bool CanSeek { get { return default(bool); } }
+        public override bool CanWrite { get { return default(bool); } }
+        public override long Length { get { return default(long); } }
+        public override long Position { get { return default(long); } set { } }
+        internal System.IO.Stream UnderlyingStream { [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]get { return default(System.IO.Stream); } }
+        public override System.IAsyncResult BeginRead(byte[] buffer, int offset, int count, System.AsyncCallback callback, object state) { return default(System.IAsyncResult); }
+        private System.IAsyncResult BeginReadFromUnderlyingStream(byte[] buffer, int offset, int count, System.AsyncCallback callback, object state, int bytesAlreadySatisfied, System.Threading.Tasks.Task semaphoreLockTask) { return default(System.IAsyncResult); }
+        public override System.IAsyncResult BeginWrite(byte[] buffer, int offset, int count, System.AsyncCallback callback, object state) { return default(System.IAsyncResult); }
+        private System.IAsyncResult BeginWriteToUnderlyingStream(byte[] buffer, int offset, int count, System.AsyncCallback callback, object state, System.Threading.Tasks.Task semaphoreLockTask) { return default(System.IAsyncResult); }
+        private void ClearReadBufferBeforeWrite() { }
+        protected override void Dispose(bool disposing) { }
+        public override int EndRead(System.IAsyncResult asyncResult) { return default(int); }
+        public override void EndWrite(System.IAsyncResult asyncResult) { }
+        private void EnsureBeginEndAwaitableAllocated() { }
+        private void EnsureBufferAllocated() { }
+        private void EnsureCanRead() { }
+        private void EnsureCanSeek() { }
+        private void EnsureCanWrite() { }
+        private void EnsureNotClosed() { }
+        private void EnsureShadowBufferAllocated() { }
+        public override void Flush() { }
+        public override System.Threading.Tasks.Task FlushAsync(System.Threading.CancellationToken cancellationToken) { return default(System.Threading.Tasks.Task); }
+        private static System.Threading.Tasks.Task FlushAsyncInternal(System.Threading.CancellationToken cancellationToken, System.IO.BufferedStream _this, System.IO.Stream stream, int writePos, int readPos, int readLen) { return default(System.Threading.Tasks.Task); }
+        private void FlushRead() { }
+        private void FlushWrite() { }
+        private System.Threading.Tasks.Task FlushWriteAsync(System.Threading.CancellationToken cancellationToken) { return default(System.Threading.Tasks.Task); }
+        private System.Threading.Tasks.Task<int> LastSyncCompletedReadTask(int val) { return default(System.Threading.Tasks.Task<int>); }
+        public override int Read(byte[] array, int offset, int count) { array = default(byte[]); return default(int); }
+        public override System.Threading.Tasks.Task<int> ReadAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) { return default(System.Threading.Tasks.Task<int>); }
+        public override int ReadByte() { return default(int); }
+        private int ReadFromBuffer(byte[] array, int offset, int count) { return default(int); }
+        private int ReadFromBuffer(byte[] array, int offset, int count, out System.Exception error) { error = default(System.Exception); return default(int); }
+        private System.Threading.Tasks.Task<int> ReadFromUnderlyingStreamAsync(byte[] array, int offset, int count, System.Threading.CancellationToken cancellationToken, int bytesAlreadySatisfied, System.Threading.Tasks.Task semaphoreLockTask, bool useApmPattern) { return default(System.Threading.Tasks.Task<int>); }
+        public override long Seek(long offset, System.IO.SeekOrigin origin) { return default(long); }
+        public override void SetLength(long value) { }
+        public override void Write(byte[] array, int offset, int count) { }
+        public override System.Threading.Tasks.Task WriteAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) { return default(System.Threading.Tasks.Task); }
+        public override void WriteByte(byte value) { }
+        private void WriteToBuffer(byte[] array, ref int offset, ref int count) { }
+        private void WriteToBuffer(byte[] array, ref int offset, ref int count, out System.Exception error) { error = default(System.Exception); }
+        private System.Threading.Tasks.Task WriteToUnderlyingStreamAsync(byte[] array, int offset, int count, System.Threading.CancellationToken cancellationToken, System.Threading.Tasks.Task semaphoreLockTask, bool useApmPattern) { return default(System.Threading.Tasks.Task); }
+    }
+
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public partial class BinaryReader : System.IDisposable
     {
@@ -8889,6 +9395,28 @@ namespace System.Reflection.Metadata
 }
 namespace System.Resources
 {
+    [System.Security.SecurityCriticalAttribute]
+    internal partial class WindowsRuntimeResourceManagerBase
+    {
+        public WindowsRuntimeResourceManagerBase() { }
+        public virtual System.Globalization.CultureInfo GlobalResourceContextBestFitCultureInfo { [System.Security.SecurityCriticalAttribute]get { return default(System.Globalization.CultureInfo); } }
+        [System.Security.SecurityCriticalAttribute]
+        public virtual string GetString(string stringName, string startingCulture, string neutralResourcesCulture) { return default(string); }
+        [System.Security.SecurityCriticalAttribute]
+        public virtual bool Initialize(string libpath, string reswFilename, out System.Resources.PRIExceptionInfo exceptionInfo) { exceptionInfo = default(System.Resources.PRIExceptionInfo); return default(bool); }
+        [System.Security.SecurityCriticalAttribute]
+        public virtual bool SetGlobalResourceContextDefaultCulture(System.Globalization.CultureInfo ci) { return default(bool); }
+    }
+
+    internal partial class PRIExceptionInfo
+    {
+        [System.CLSCompliantAttribute(false)]
+        public string _PackageSimpleName;
+        [System.CLSCompliantAttribute(false)]
+        public string _ResWFile;
+        public PRIExceptionInfo() { }
+    }
+
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public partial interface IResourceReader : System.Collections.IEnumerable, System.IDisposable
     {
@@ -9002,6 +9530,56 @@ namespace System.Runtime
 }
 namespace System.Runtime.CompilerServices
 {
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal static partial class JitHelpers
+    {
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.Runtime.CompilerServices.ObjectHandleOnStack GetObjectHandleOnStack<T>(ref T o) where T : class { return default(System.Runtime.CompilerServices.ObjectHandleOnStack); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.Runtime.CompilerServices.PinningHelper GetPinningHelper(object o) { return default(System.Runtime.CompilerServices.PinningHelper); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.Runtime.CompilerServices.StackCrawlMarkHandle GetStackCrawlMarkHandle(ref System.Threading.StackCrawlMark stackMark) { return default(System.Runtime.CompilerServices.StackCrawlMarkHandle); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.Runtime.CompilerServices.StringHandleOnStack GetStringHandleOnStack(ref string s) { return default(System.Runtime.CompilerServices.StringHandleOnStack); }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecurityCriticalAttribute]
+        internal static T UnsafeCast<T>(object o) where T : class { return default(T); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr UnsafeCastToStackPointer<T>(ref T val) { return default(System.IntPtr); }
+        internal static int UnsafeEnumCast<T>(T val) where T : struct { return default(int); }
+        internal static long UnsafeEnumCastLong<T>(T val) where T : struct { return default(long); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static void UnsafeSetArrayElement(object[] target, int index, object element) { }
+    }
+    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+    internal partial struct ObjectHandleOnStack
+    {
+        private System.IntPtr m_ptr;
+        internal ObjectHandleOnStack(System.IntPtr pObject) { throw new System.NotImplementedException(); }
+    }
+    internal partial class PinningHelper
+    {
+        public byte m_data;
+        public PinningHelper() { }
+    }
+    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+    internal partial struct StackCrawlMarkHandle
+    {
+        private System.IntPtr m_ptr;
+        internal StackCrawlMarkHandle(System.IntPtr stackMark) { throw new System.NotImplementedException(); }
+    }
+    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+    internal partial struct StringHandleOnStack
+    {
+        private System.IntPtr m_ptr;
+        internal StringHandleOnStack(System.IntPtr pString) { throw new System.NotImplementedException(); }
+    }
+    [System.AttributeUsageAttribute((System.AttributeTargets)(2044), AllowMultiple = false, Inherited = false)]
+    internal sealed partial class FriendAccessAllowedAttribute : System.Attribute
+    {
+        public FriendAccessAllowedAttribute() { }
+    }
     [System.AttributeUsageAttribute((System.AttributeTargets)(256))]
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public sealed partial class AccessedThroughPropertyAttribute : System.Attribute
@@ -9132,6 +9710,10 @@ namespace System.Runtime.CompilerServices
         [System.Security.SecuritySafeCriticalAttribute]
         public bool TryGetValue(TKey key, out TValue value) { value = default(TValue); return default(bool); }
         public delegate TValue CreateValueCallback(TKey key);
+
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal TKey FindEquivalentKeyUnsafe(TKey key, out TValue value) { value = default(TValue); return default(TKey); }
     }
     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
     public partial struct ConfiguredTaskAwaitable
@@ -10949,6 +11531,20 @@ namespace System.Runtime.InteropServices.ComTypes
 }
 namespace System.Runtime.InteropServices.WindowsRuntime
 {
+    [System.AttributeUsageAttribute((System.AttributeTargets)(5148), Inherited = false)]
+    internal sealed partial class WindowsRuntimeImportAttribute : System.Attribute
+    {
+        internal WindowsRuntimeImportAttribute() { }
+    }
+
+    [System.Runtime.InteropServices.GuidAttribute("82BA7092-4C88-427D-A7BC-16DD93FEB67E")]
+    [System.Runtime.InteropServices.InterfaceTypeAttribute((System.Runtime.InteropServices.ComInterfaceType)(1))]
+    internal partial interface IRestrictedErrorInfo
+    {
+        void GetErrorDetails(out string description, out int error, out string restrictedDescription, out string capabilitySid);
+        void GetReference(out string reference);
+    }
+
 #if FEATURE_COMINTEROP    
     [System.AttributeUsageAttribute((System.AttributeTargets)(1028), AllowMultiple=false, Inherited=false)]
     public sealed partial class DefaultInterfaceAttribute : System.Attribute
@@ -10972,6 +11568,9 @@ namespace System.Runtime.InteropServices.WindowsRuntime
         public static System.Runtime.InteropServices.WindowsRuntime.EventRegistrationTokenTable<T> GetOrCreateEventRegistrationTokenTable(ref System.Runtime.InteropServices.WindowsRuntime.EventRegistrationTokenTable<T> refEventTable) { return default(System.Runtime.InteropServices.WindowsRuntime.EventRegistrationTokenTable<T>); }
         public void RemoveEventHandler(T handler) { }
         public void RemoveEventHandler(System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken token) { }
+
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal T ExtractHandler(System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken token) { return default(T); }
     }
     [System.Runtime.InteropServices.GuidAttribute("00000035-0000-0000-C000-000000000046")]
     public partial interface IActivationFactory
@@ -11015,6 +11614,9 @@ namespace System.Runtime.InteropServices.WindowsRuntime
         public static void RemoveEventHandler<T>(System.Action<System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken> removeMethod, T handler) { }
         [System.Security.SecurityCriticalAttribute]
         public static System.IntPtr StringToHString(string s) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecuritySafeCriticalAttribute]
+        internal static bool ReportUnhandledError(System.Exception e) { return default(bool); }
     }
     [System.AttributeUsageAttribute((System.AttributeTargets)(2048), Inherited=false, AllowMultiple=false)]
     public sealed partial class WriteOnlyArrayAttribute : System.Attribute
@@ -11160,6 +11762,147 @@ namespace System.Runtime.Versioning
         public static string MakeVersionSafeName(string name, System.Runtime.Versioning.ResourceScope from, System.Runtime.Versioning.ResourceScope to, System.Type type) { return default(string); }
     }
 }
+namespace System.StubHelpers
+{
+    [System.Security.SecurityCriticalAttribute]
+    internal static partial class StubHelpers
+    {
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr AddToCleanupList(ref System.StubHelpers.CleanupWorkList pCleanupWorkList, System.Runtime.InteropServices.SafeHandle handle) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static object AllocateInternal(System.IntPtr typeHandle) { return default(object); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static uint CalcVaListSize(System.IntPtr va_list) { return default(uint); }
+        internal static void CheckStringLength(int length) { }
+        internal static void CheckStringLength(uint length) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void ClearLastError() { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr CreateCustomMarshalerHelper(System.IntPtr pMD, int paramToken, System.IntPtr hndManagedType) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void DecimalCanonicalizeInternal(ref decimal dec) { }
+        [System.Security.SecurityCriticalAttribute]
+        internal static void DestroyCleanupList(ref System.StubHelpers.CleanupWorkList pCleanupWorkList) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal unsafe static void FmtClassUpdateCLRInternal(object obj, byte* pNative) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal unsafe static void FmtClassUpdateNativeInternal(object obj, byte* pNative, ref System.StubHelpers.CleanupWorkList pCleanupWorkList) { }
+        internal static System.Exception GetCOMHRExceptionObject(int hr, System.IntPtr pCPCMD, object pThis) { return default(System.Exception); }
+        internal static System.Exception GetCOMHRExceptionObject_WinRT(int hr, System.IntPtr pCPCMD, object pThis) { return default(System.Exception); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetCOMIPFromRCW(object objSrc, System.IntPtr pCPCMD, out System.IntPtr ppTarget, out bool pfNeedsRelease) { ppTarget = default(System.IntPtr); pfNeedsRelease = default(bool); return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetCOMIPFromRCW_WinRT(object objSrc, System.IntPtr pCPCMD, out System.IntPtr ppTarget) { ppTarget = default(System.IntPtr); return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetCOMIPFromRCW_WinRTDelegate(object objSrc, System.IntPtr pCPCMD, out System.IntPtr ppTarget) { ppTarget = default(System.IntPtr); return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetCOMIPFromRCW_WinRTSharedGeneric(object objSrc, System.IntPtr pCPCMD, out System.IntPtr ppTarget) { ppTarget = default(System.IntPtr); return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetDelegateInvokeMethod(System.Delegate pThis) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetDelegateTarget(System.Delegate pThis, ref System.IntPtr pStubArg) { return default(System.IntPtr); }
+        internal static System.Exception GetHRExceptionObject(int hr) { return default(System.Exception); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetNDirectTarget(System.IntPtr pMD) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr GetOuterInspectable(object pThis, System.IntPtr pCtorMD) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr GetStubContext() { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.Delegate GetTargetForAmbiguousVariantCall(object objSrc, System.IntPtr pMT, out bool fUseString) { fUseString = default(bool); return default(System.Delegate); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static object GetWinRTFactoryObject(System.IntPtr pCPCMD) { return default(object); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr GetWinRTFactoryReturnValue(object pThis, System.IntPtr pCtorEntry) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void InitDeclaringType(System.IntPtr pMD) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.Exception InternalGetCOMHRExceptionObject(int hr, System.IntPtr pCPCMD, object pThis, bool fForWinRT) { return default(System.Exception); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.Exception InternalGetHRExceptionObject(int hr) { return default(System.Exception); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static bool IsQCall(System.IntPtr pMD) { return default(bool); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal unsafe static void LayoutDestroyNativeInternal(byte* pNative, System.IntPtr pMT) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void LogPinnedArgument(System.IntPtr localDesc, System.IntPtr nativeArg) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void MarshalToManagedVaListInternal(System.IntPtr va_list, System.IntPtr pArgIterator) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void MarshalToUnmanagedVaListInternal(System.IntPtr va_list, uint vaListSize, System.IntPtr pArgIterator) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr ProfilerBeginTransitionCallback(System.IntPtr pSecretParam, System.IntPtr pThread, object pThis) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void ProfilerEndTransitionCallback(System.IntPtr pMD, System.IntPtr pThread) { }
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr SafeHandleAddRef(System.Runtime.InteropServices.SafeHandle pHandle, ref bool success) { return default(System.IntPtr); }
+        [System.Security.SecurityCriticalAttribute]
+        internal static void SafeHandleRelease(System.Runtime.InteropServices.SafeHandle pHandle) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void SetLastError() { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static bool ShouldCallWinRTInterface(object objSrc, System.IntPtr pCPCMD) { return default(bool); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal unsafe static int strlen(sbyte* ptr) { return default(int); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void StubRegisterRCW(object pThis) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void StubUnregisterRCW(object pThis) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void ThrowInteropParamException(int resID, int paramIdx) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void ValidateByref(System.IntPtr byref, System.IntPtr pMD, object pThis) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static void ValidateObject(object obj, System.IntPtr pMD, object pThis) { }
+    }
+
+    [System.Security.SecurityCriticalAttribute]
+    internal sealed partial class CleanupWorkList
+    {
+        private System.Collections.Generic.List<System.StubHelpers.CleanupWorkListElement> m_list;
+        public CleanupWorkList() { }
+        public void Add(System.StubHelpers.CleanupWorkListElement elem) { }
+        public void Destroy() { }
+    }
+    [System.Security.SecurityCriticalAttribute]
+    internal sealed partial class CleanupWorkListElement
+    {
+        public System.Runtime.InteropServices.SafeHandle m_handle;
+        public bool m_owned;
+        public CleanupWorkListElement(System.Runtime.InteropServices.SafeHandle handle) { }
+    }
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal static partial class EventArgsMarshaler
+    {
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr CreateNativeNCCEventArgsInstance(int action, object newItems, object oldItems, int newIndex, int oldIndex) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.PreserveSig)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr CreateNativeNCCEventArgsInstanceHelper(int action, System.IntPtr newItem, System.IntPtr oldItem, int newIndex, int oldIndex) { return default(System.IntPtr); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.PreserveSig)]
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecurityCriticalAttribute]
+        internal static System.IntPtr CreateNativePCEventArgsInstance(string name) { return default(System.IntPtr); }
+    }
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal static partial class InterfaceMarshaler
+    {
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.PreserveSig)]
+        [System.Security.SecurityCriticalAttribute]
+        internal static void ClearNative(System.IntPtr pUnk) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static object ConvertToManaged(System.IntPtr pUnk, System.IntPtr itfMT, System.IntPtr classMT, int flags) { return default(object); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static object ConvertToManagedWithoutUnboxing(System.IntPtr pNative) { return default(object); }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        internal static System.IntPtr ConvertToNative(object objSrc, System.IntPtr itfMT, System.IntPtr classMT, int flags) { return default(System.IntPtr); }
+    }
+}
 namespace System.Security
 {
     [System.AttributeUsageAttribute((System.AttributeTargets)(1), AllowMultiple=false, Inherited=false)]
@@ -11865,6 +12608,21 @@ namespace System.Text
 }
 namespace System.Threading
 {
+    internal enum StackCrawlMark
+    {
+        LookForMe = 0,
+        LookForMyCaller = 1,
+        LookForMyCallersCaller = 2,
+        LookForThread = 3,
+    }
+    [System.Security.SecurityCriticalAttribute]
+    internal partial class WinRTSynchronizationContextFactoryBase
+    {
+        public WinRTSynchronizationContextFactoryBase() { }
+        [System.Security.SecurityCriticalAttribute]
+        public virtual System.Threading.SynchronizationContext Create(object coreDispatcher) { return default(System.Threading.SynchronizationContext); }
+    }
+
     [System.Runtime.InteropServices.ComVisibleAttribute(false)]
     public partial class AbandonedMutexException : System.SystemException
     {
@@ -11929,6 +12687,9 @@ namespace System.Threading
         public override int GetHashCode() { return default(int); }
         public static bool operator ==(System.Threading.CancellationTokenRegistration left, System.Threading.CancellationTokenRegistration right) { return default(bool); }
         public static bool operator !=(System.Threading.CancellationTokenRegistration left, System.Threading.CancellationTokenRegistration right) { return default(bool); }
+
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal bool TryDeregister() { return default(bool); }
     }
     [System.Runtime.InteropServices.ComVisibleAttribute(false)]
     
@@ -12012,6 +12773,10 @@ namespace System.Threading
         [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute]
         [System.Security.SecurityCriticalAttribute]
         public static void Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) { }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        [System.Security.SecurityCriticalAttribute]
+        internal static void Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) { }
+        internal static System.Threading.ExecutionContext FastCapture() { return default(System.Threading.ExecutionContext); }
     }
     public static partial class Interlocked
     {
@@ -12584,6 +13349,71 @@ namespace System.Threading
 }
 namespace System.Threading.Tasks
 {
+#if FEATURE_COMINTEROP
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal enum AsyncCausalityStatus
+    {
+        Canceled = 2,
+        Completed = 1,
+        Error = 3,
+        Started = 0,
+    }
+    internal enum CausalityRelation
+    {
+        AssignDelegate = 0,
+        Cancel = 3,
+        Choice = 2,
+        Error = 4,
+        Join = 1,
+    }
+    internal enum CausalitySynchronousWork
+    {
+        CompletionNotification = 0,
+        Execution = 2,
+        ProgressNotification = 1,
+    }
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal static partial class AsyncCausalityTracer
+    {
+        private static System.Threading.Tasks.AsyncCausalityTracer.Loggers f_LoggingOn;
+        //private const Windows.Foundation.Diagnostics.CausalitySource s_CausalitySource = 1;
+        private static readonly System.Guid s_PlatformId;
+        private static Windows.Foundation.Diagnostics.IAsyncCausalityTracerStatics s_TracerFactory;
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static bool LoggingOn { [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]get { return default(bool); } }
+        internal static void EnableToETW(bool enabled) { }
+        private static ulong GetOperationId(uint taskId) { return default(ulong); }
+        private static void LogAndDisable(System.Exception ex) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static void TraceOperationCompletion(System.Threading.Tasks.CausalityTraceLevel traceLevel, int taskId, System.Threading.Tasks.AsyncCausalityStatus status) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static void TraceOperationCreation(System.Threading.Tasks.CausalityTraceLevel traceLevel, int taskId, string operationName, ulong relatedContext) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+        internal static void TraceOperationRelation(System.Threading.Tasks.CausalityTraceLevel traceLevel, int taskId, System.Threading.Tasks.CausalityRelation relation) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+        internal static void TraceSynchronousWorkCompletion(System.Threading.Tasks.CausalityTraceLevel traceLevel, System.Threading.Tasks.CausalitySynchronousWork work) { }
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+        internal static void TraceSynchronousWorkStart(System.Threading.Tasks.CausalityTraceLevel traceLevel, int taskId, System.Threading.Tasks.CausalitySynchronousWork work) { }
+        [System.Security.SecuritySafeCriticalAttribute]
+        private static void TracingStatusChangedHandler(object sender, Windows.Foundation.Diagnostics.TracingStatusChangedEventArgs args) { }
+        [System.FlagsAttribute]
+        private enum Loggers : byte
+        {
+            CausalityTracer = (byte)1,
+            ETW = (byte)2,
+        }
+    }
+    [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+    internal enum CausalityTraceLevel
+    {
+        Important = 1,
+        Required = 0,
+        Verbose = 2,
+    }
+#endif
+
     [System.Diagnostics.DebuggerDisplayAttribute("Concurrent={ConcurrentTaskCountForDebugger}, Exclusive={ExclusiveTaskCountForDebugger}, Mode={ModeForDebugger}")]   
     public partial class ConcurrentExclusiveSchedulerPair
     {
@@ -12600,6 +13430,13 @@ namespace System.Threading.Tasks
    
     public partial class Task : System.IAsyncResult, System.IDisposable
     {
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static bool s_asyncDebuggingEnabled;
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static bool AddToActiveTasks(System.Threading.Tasks.Task task) { return default(bool); }
+        [System.Runtime.CompilerServices.FriendAccessAllowedAttribute]
+        internal static void RemoveFromActiveTasks(int taskId) { }
+
         [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]public Task(System.Action action) { }
         [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]public Task(System.Action action, System.Threading.CancellationToken cancellationToken) { }
         [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]public Task(System.Action action, System.Threading.CancellationToken cancellationToken, System.Threading.Tasks.TaskCreationOptions creationOptions) { }
@@ -12963,3 +13800,352 @@ namespace System.Threading.Tasks
         public void SetObserved() { }
     }
 }
+
+namespace System.Security.Cryptography
+{
+    public abstract class HashAlgorithm : System.IDisposable, System.Security.Cryptography.ICryptoTransform
+    {
+        protected internal byte[] HashValue;
+        protected int HashSizeValue;
+        protected int State;
+        protected HashAlgorithm() { }
+        public virtual bool CanReuseTransform { get { return default(bool); } }
+        public virtual bool CanTransformMultipleBlocks { get { return default(bool); } }
+        public virtual byte[] Hash { get { return default(byte[]); } }
+        public virtual int HashSize { get { return default(int); } }
+        public virtual int InputBlockSize { get { return default(int); } }
+        public virtual int OutputBlockSize { get { return default(int); } }
+        public void Clear() { }
+        public byte[] ComputeHash(byte[] buffer) { return default(byte[]); }
+        public byte[] ComputeHash(byte[] buffer, int offset, int count) { return default(byte[]); }
+        public byte[] ComputeHash(System.IO.Stream inputStream) { return default(byte[]); }
+        public static HashAlgorithm Create() { return default(HashAlgorithm); }
+        public static HashAlgorithm Create(string hashName) { return default(HashAlgorithm); }
+        public void Dispose() { }
+        protected virtual void Dispose(bool disposing) { }
+        protected abstract void HashCore(byte[] array, int ibStart, int cbSize);
+        protected abstract byte[] HashFinal();
+        public abstract void Initialize();
+        public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { return default(int); }
+        public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) { return default(byte[]); }
+    }
+
+    public abstract class SymmetricAlgorithm : System.IDisposable
+    {
+        protected byte[] IVValue;
+        protected byte[] KeyValue;
+        protected int BlockSizeValue;
+        protected int FeedbackSizeValue;
+        protected int KeySizeValue;
+        protected CipherMode ModeValue;
+        protected KeySizes[] LegalBlockSizesValue;
+        protected KeySizes[] LegalKeySizesValue;
+        protected PaddingMode PaddingValue;
+        protected SymmetricAlgorithm() { }
+        public virtual int BlockSize { get; set; }
+        public virtual int FeedbackSize { get; set; }
+        public virtual byte[] IV { get; set; }
+        public virtual byte[] Key { get; set; }
+        public virtual int KeySize { get; set; }
+        public virtual KeySizes[] LegalBlockSizes { get; }
+        public virtual KeySizes[] LegalKeySizes { get; }
+        public virtual CipherMode Mode { get; set; }
+        public virtual PaddingMode Padding { get; set; }
+        public void Clear() { }
+        public static SymmetricAlgorithm Create() { return default(SymmetricAlgorithm); }
+        public static SymmetricAlgorithm Create(string algName) { return default(SymmetricAlgorithm); }
+        public virtual ICryptoTransform CreateDecryptor() { return default(ICryptoTransform); }
+        public abstract ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV);
+        public virtual ICryptoTransform CreateEncryptor() { return default(ICryptoTransform); }
+        public abstract ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV);
+        public void Dispose() { }
+        protected virtual void Dispose(bool disposing) { }
+        public abstract void GenerateIV();
+        public abstract void GenerateKey();
+        public bool ValidKeySize(int bitLength) { return default(bool); }
+    }
+
+    public interface ICryptoTransform : System.IDisposable
+    {
+        int InputBlockSize { get; }
+        int OutputBlockSize { get; }
+        bool CanTransformMultipleBlocks { get; }
+        bool CanReuseTransform { get; }
+        int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset);
+        byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);
+    }
+
+    public sealed class KeySizes
+    {
+        public KeySizes(int minSize, int maxSize, int skipSize) { }
+        public int MaxSize { get; }
+        public int MinSize { get; }
+        public int SkipSize { get; }
+    }
+
+    public enum PaddingMode
+    {
+        ANSIX923 = 4,
+        ISO10126 = 5,
+        None = 1,
+        PKCS7 = 2,
+        Zeros = 3,
+    }
+
+    public enum CipherMode
+    {
+        CBC = 1,
+        CFB = 4,
+        CTS = 5,
+        ECB = 2,
+        OFB = 3,
+    }
+}
+
+#if FEATURE_COMINTEROP
+namespace Windows.Foundation.Diagnostics
+{
+    internal enum AsyncCausalityStatus
+    {
+        Canceled = 2,
+        Completed = 1,
+        Error = 3,
+        Started = 0,
+    }
+    internal enum CausalityRelation
+    {
+        AssignDelegate = 0,
+        Cancel = 3,
+        Choice = 2,
+        Error = 4,
+        Join = 1,
+    }
+    internal enum CausalitySource
+    {
+        Application = 0,
+        Library = 1,
+        System = 2,
+    }
+    internal enum CausalitySynchronousWork
+    {
+        CompletionNotification = 0,
+        Execution = 2,
+        ProgressNotification = 1,
+    }
+    internal enum CausalityTraceLevel
+    {
+        Important = 1,
+        Required = 0,
+        Verbose = 2,
+    }
+    [System.Runtime.InteropServices.GuidAttribute("50850B26-267E-451B-A890-AB6A370245EE")]
+    internal partial interface IAsyncCausalityTracerStatics
+    {
+        System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken add_TracingStatusChanged(System.EventHandler<Windows.Foundation.Diagnostics.TracingStatusChangedEventArgs> eventHandler);
+        void TraceOperationCompletion(Windows.Foundation.Diagnostics.CausalityTraceLevel traceLevel, Windows.Foundation.Diagnostics.CausalitySource source, System.Guid platformId, ulong operationId, Windows.Foundation.Diagnostics.AsyncCausalityStatus status);
+        void TraceOperationCreation(Windows.Foundation.Diagnostics.CausalityTraceLevel traceLevel, Windows.Foundation.Diagnostics.CausalitySource source, System.Guid platformId, ulong operationId, string operationName, ulong relatedContext);
+        void TraceOperationRelation(Windows.Foundation.Diagnostics.CausalityTraceLevel traceLevel, Windows.Foundation.Diagnostics.CausalitySource source, System.Guid platformId, ulong operationId, Windows.Foundation.Diagnostics.CausalityRelation relation);
+        void TraceSynchronousWorkCompletion(Windows.Foundation.Diagnostics.CausalityTraceLevel traceLevel, Windows.Foundation.Diagnostics.CausalitySource source, Windows.Foundation.Diagnostics.CausalitySynchronousWork work);
+        void TraceSynchronousWorkStart(Windows.Foundation.Diagnostics.CausalityTraceLevel traceLevel, Windows.Foundation.Diagnostics.CausalitySource source, System.Guid platformId, ulong operationId, Windows.Foundation.Diagnostics.CausalitySynchronousWork work);
+    }
+    [System.Runtime.InteropServices.GuidAttribute("410B7711-FF3B-477F-9C9A-D2EFDA302DC3")]
+    internal partial interface ITracingStatusChangedEventArgs
+    {
+        bool Enabled { get; }
+        Windows.Foundation.Diagnostics.CausalityTraceLevel TraceLevel { get; }
+    }
+    [System.Runtime.InteropServices.GuidAttribute("410B7711-FF3B-477F-9C9A-D2EFDA302DC3")]
+    internal sealed partial class TracingStatusChangedEventArgs : Windows.Foundation.Diagnostics.ITracingStatusChangedEventArgs
+    {
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+        public TracingStatusChangedEventArgs() { }
+        public bool Enabled { [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]get { return default(bool); } }
+        public Windows.Foundation.Diagnostics.CausalityTraceLevel TraceLevel { [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]get { return default(Windows.Foundation.Diagnostics.CausalityTraceLevel); } }
+    }
+}
+#endif
+
+namespace System.Security.Claims
+{
+    public partial class Claim
+    {
+        public Claim(System.IO.BinaryReader reader) { }
+        public Claim(System.IO.BinaryReader reader, System.Security.Claims.ClaimsIdentity subject) { }
+        protected Claim(System.Security.Claims.Claim other) { }
+        protected Claim(System.Security.Claims.Claim other, System.Security.Claims.ClaimsIdentity subject) { }
+        public Claim(string type, string value) { }
+        public Claim(string type, string value, string valueType) { }
+        public Claim(string type, string value, string valueType, string issuer) { }
+        public Claim(string type, string value, string valueType, string issuer, string originalIssuer) { }
+        public Claim(string type, string value, string valueType, string issuer, string originalIssuer, System.Security.Claims.ClaimsIdentity subject) { }
+        protected virtual byte[] CustomSerializationData { get { return default(byte[]); } }
+        public string Issuer { get { return default(string); } }
+        public string OriginalIssuer { get { return default(string); } }
+        public System.Collections.Generic.IDictionary<string, string> Properties { get { return default(System.Collections.Generic.IDictionary<string, string>); } }
+        public System.Security.Claims.ClaimsIdentity Subject { get { return default(System.Security.Claims.ClaimsIdentity); } }
+        public string Type { get { return default(string); } }
+        public string Value { get { return default(string); } }
+        public string ValueType { get { return default(string); } }
+        public virtual System.Security.Claims.Claim Clone() { return default(System.Security.Claims.Claim); }
+        public virtual System.Security.Claims.Claim Clone(System.Security.Claims.ClaimsIdentity identity) { return default(System.Security.Claims.Claim); }
+        public override string ToString() { return default(string); }
+        public virtual void WriteTo(System.IO.BinaryWriter writer) { }
+        protected virtual void WriteTo(System.IO.BinaryWriter writer, byte[] userData) { }
+    }
+    public partial class ClaimsIdentity : System.Security.Principal.IIdentity
+    {
+        public const string DefaultIssuer = "LOCAL AUTHORITY";
+        public const string DefaultNameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";
+        public const string DefaultRoleClaimType = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role";
+        public ClaimsIdentity() { }
+        public ClaimsIdentity(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) { }
+        public ClaimsIdentity(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, string authenticationType) { }
+        public ClaimsIdentity(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, string authenticationType, string nameType, string roleType) { }
+        public ClaimsIdentity(System.IO.BinaryReader reader) { }
+        protected ClaimsIdentity(System.Security.Claims.ClaimsIdentity other) { }
+        public ClaimsIdentity(System.Security.Principal.IIdentity identity) { }
+        public ClaimsIdentity(System.Security.Principal.IIdentity identity, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) { }
+        public ClaimsIdentity(System.Security.Principal.IIdentity identity, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, string authenticationType, string nameType, string roleType) { }
+        public ClaimsIdentity(string authenticationType) { }
+        public ClaimsIdentity(string authenticationType, string nameType, string roleType) { }
+        public System.Security.Claims.ClaimsIdentity Actor { get { return default(System.Security.Claims.ClaimsIdentity); } set { } }
+        public virtual string AuthenticationType { get { return default(string); } }
+        public object BootstrapContext { get { return default(object); } set { } }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> Claims { get { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); } }
+        protected virtual byte[] CustomSerializationData { get { return default(byte[]); } }
+        public virtual bool IsAuthenticated { get { return default(bool); } }
+        public string Label { get { return default(string); } set { } }
+        public virtual string Name { get { return default(string); } }
+        public string NameClaimType { get { return default(string); } }
+        public string RoleClaimType { get { return default(string); } }
+        public virtual void AddClaim(System.Security.Claims.Claim claim) { }
+        public virtual void AddClaims(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) { }
+        public virtual System.Security.Claims.ClaimsIdentity Clone() { return default(System.Security.Claims.ClaimsIdentity); }
+        protected virtual System.Security.Claims.Claim CreateClaim(System.IO.BinaryReader reader) { return default(System.Security.Claims.Claim); }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> FindAll(System.Predicate<System.Security.Claims.Claim> match) { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> FindAll(string type) { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); }
+        public virtual System.Security.Claims.Claim FindFirst(System.Predicate<System.Security.Claims.Claim> match) { return default(System.Security.Claims.Claim); }
+        public virtual System.Security.Claims.Claim FindFirst(string type) { return default(System.Security.Claims.Claim); }
+        public virtual bool HasClaim(System.Predicate<System.Security.Claims.Claim> match) { return default(bool); }
+        public virtual bool HasClaim(string type, string value) { return default(bool); }
+        public virtual void RemoveClaim(System.Security.Claims.Claim claim) { }
+        public virtual bool TryRemoveClaim(System.Security.Claims.Claim claim) { return default(bool); }
+        public virtual void WriteTo(System.IO.BinaryWriter writer) { }
+        protected virtual void WriteTo(System.IO.BinaryWriter writer, byte[] userData) { }
+    }
+    public partial class ClaimsPrincipal : System.Security.Principal.IPrincipal
+    {
+        public ClaimsPrincipal() { }
+        public ClaimsPrincipal(System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity> identities) { }
+        public ClaimsPrincipal(System.IO.BinaryReader reader) { }
+        public ClaimsPrincipal(System.Security.Principal.IIdentity identity) { }
+        public ClaimsPrincipal(System.Security.Principal.IPrincipal principal) { }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> Claims { get { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); } }
+        public static System.Func<System.Security.Claims.ClaimsPrincipal> ClaimsPrincipalSelector { get { return default(System.Func<System.Security.Claims.ClaimsPrincipal>); } set { } }
+        public static System.Security.Claims.ClaimsPrincipal Current { get { return default(System.Security.Claims.ClaimsPrincipal); } }
+        protected virtual byte[] CustomSerializationData { get { return default(byte[]); } }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity> Identities { get { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity>); } }
+        public virtual System.Security.Principal.IIdentity Identity { get { return default(System.Security.Principal.IIdentity); } }
+        public static System.Func<System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity>, System.Security.Claims.ClaimsIdentity> PrimaryIdentitySelector { get { return default(System.Func<System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity>, System.Security.Claims.ClaimsIdentity>); } set { } }
+        public virtual void AddIdentities(System.Collections.Generic.IEnumerable<System.Security.Claims.ClaimsIdentity> identities) { }
+        public virtual void AddIdentity(System.Security.Claims.ClaimsIdentity identity) { }
+        public virtual System.Security.Claims.ClaimsPrincipal Clone() { return default(System.Security.Claims.ClaimsPrincipal); }
+        protected virtual System.Security.Claims.ClaimsIdentity CreateClaimsIdentity(System.IO.BinaryReader reader) { return default(System.Security.Claims.ClaimsIdentity); }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> FindAll(System.Predicate<System.Security.Claims.Claim> match) { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); }
+        public virtual System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> FindAll(string type) { return default(System.Collections.Generic.IEnumerable<System.Security.Claims.Claim>); }
+        public virtual System.Security.Claims.Claim FindFirst(System.Predicate<System.Security.Claims.Claim> match) { return default(System.Security.Claims.Claim); }
+        public virtual System.Security.Claims.Claim FindFirst(string type) { return default(System.Security.Claims.Claim); }
+        public virtual bool HasClaim(System.Predicate<System.Security.Claims.Claim> match) { return default(bool); }
+        public virtual bool HasClaim(string type, string value) { return default(bool); }
+        public virtual bool IsInRole(string role) { return default(bool); }
+        public virtual void WriteTo(System.IO.BinaryWriter writer) { }
+        protected virtual void WriteTo(System.IO.BinaryWriter writer, byte[] userData) { }
+    }
+    public static partial class ClaimTypes
+    {
+        public const string Actor = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor";
+        public const string Anonymous = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous";
+        public const string Authentication = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authentication";
+        public const string AuthenticationInstant = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant";
+        public const string AuthenticationMethod = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod";
+        public const string AuthorizationDecision = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision";
+        public const string CookiePath = "http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath";
+        public const string Country = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country";
+        public const string DateOfBirth = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth";
+        public const string DenyOnlyPrimaryGroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid";
+        public const string DenyOnlyPrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid";
+        public const string DenyOnlySid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid";
+        public const string DenyOnlyWindowsDeviceGroup = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlywindowsdevicegroup";
+        public const string Dns = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns";
+        public const string Dsa = "http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa";
+        public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
+        public const string Expiration = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration";
+        public const string Expired = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expired";
+        public const string Gender = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender";
+        public const string GivenName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname";
+        public const string GroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid";
+        public const string Hash = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash";
+        public const string HomePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone";
+        public const string IsPersistent = "http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent";
+        public const string Locality = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality";
+        public const string MobilePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone";
+        public const string Name = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";
+        public const string NameIdentifier = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier";
+        public const string OtherPhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone";
+        public const string PostalCode = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode";
+        public const string PrimaryGroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid";
+        public const string PrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid";
+        public const string Role = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role";
+        public const string Rsa = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa";
+        public const string SerialNumber = "http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber";
+        public const string Sid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid";
+        public const string Spn = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn";
+        public const string StateOrProvince = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince";
+        public const string StreetAddress = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress";
+        public const string Surname = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname";
+        public const string System = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/system";
+        public const string Thumbprint = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/thumbprint";
+        public const string Upn = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
+        public const string Uri = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri";
+        public const string UserData = "http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata";
+        public const string Version = "http://schemas.microsoft.com/ws/2008/06/identity/claims/version";
+        public const string Webpage = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage";
+        public const string WindowsAccountName = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname";
+        public const string WindowsDeviceClaim = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdeviceclaim";
+        public const string WindowsDeviceGroup = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup";
+        public const string WindowsFqbnVersion = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsfqbnversion";
+        public const string WindowsSubAuthority = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowssubauthority";
+        public const string WindowsUserClaim = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsuserclaim";
+        public const string X500DistinguishedName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname";
+    }
+    public static partial class ClaimValueTypes
+    {
+        public const string Base64Binary = "http://www.w3.org/2001/XMLSchema#base64Binary";
+        public const string Base64Octet = "http://www.w3.org/2001/XMLSchema#base64Octet";
+        public const string Boolean = "http://www.w3.org/2001/XMLSchema#boolean";
+        public const string Date = "http://www.w3.org/2001/XMLSchema#date";
+        public const string DateTime = "http://www.w3.org/2001/XMLSchema#dateTime";
+        public const string DaytimeDuration = "http://www.w3.org/TR/2002/WD-xquery-operators-20020816#dayTimeDuration";
+        public const string DnsName = "http://schemas.xmlsoap.org/claims/dns";
+        public const string Double = "http://www.w3.org/2001/XMLSchema#double";
+        public const string DsaKeyValue = "http://www.w3.org/2000/09/xmldsig#DSAKeyValue";
+        public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
+        public const string Fqbn = "http://www.w3.org/2001/XMLSchema#fqbn";
+        public const string HexBinary = "http://www.w3.org/2001/XMLSchema#hexBinary";
+        public const string Integer = "http://www.w3.org/2001/XMLSchema#integer";
+        public const string Integer32 = "http://www.w3.org/2001/XMLSchema#integer32";
+        public const string Integer64 = "http://www.w3.org/2001/XMLSchema#integer64";
+        public const string KeyInfo = "http://www.w3.org/2000/09/xmldsig#KeyInfo";
+        public const string Rfc822Name = "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name";
+        public const string Rsa = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa";
+        public const string RsaKeyValue = "http://www.w3.org/2000/09/xmldsig#RSAKeyValue";
+        public const string Sid = "http://www.w3.org/2001/XMLSchema#sid";
+        public const string String = "http://www.w3.org/2001/XMLSchema#string";
+        public const string Time = "http://www.w3.org/2001/XMLSchema#time";
+        public const string UInteger32 = "http://www.w3.org/2001/XMLSchema#uinteger32";
+        public const string UInteger64 = "http://www.w3.org/2001/XMLSchema#uinteger64";
+        public const string UpnName = "http://schemas.xmlsoap.org/claims/UPN";
+        public const string X500Name = "urn:oasis:names:tc:xacml:1.0:data-type:x500Name";
+        public const string YearMonthDuration = "http://www.w3.org/TR/2002/WD-xquery-operators-20020816#yearMonthDuration";
+    }
+}
\ No newline at end of file
index 9827fe7..9830f09 100644 (file)
@@ -23,7 +23,6 @@
     
     <ErrorReport>prompt</ErrorReport>
     <Optimize Condition="'$(Optimize)' == ''">true</Optimize>
-    <GenerateNativeVersionInfo Condition="'$(OsEnvironment)'=='Windows_NT'">true</GenerateNativeVersionInfo>
     <CLSCompliant>true</CLSCompliant>
     <WarningLevel>4</WarningLevel>
     <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
index db272eb..aaa98b9 100644 (file)
@@ -41,23 +41,30 @@ namespace System.Collections.Generic
         // saves the right instantiations
         //
         [System.Security.SecuritySafeCritical]  // auto-generated
-        private static Comparer<T> CreateComparer() {
+        private static Comparer<T> CreateComparer()
+        {
+            object result = null;
             RuntimeType t = (RuntimeType)typeof(T);
 
             // If T implements IComparable<T> return a GenericComparer<T>
-            if (typeof(IComparable<T>).IsAssignableFrom(t)) {
-                return (Comparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericComparer<int>), t);
+            if (typeof(IComparable<T>).IsAssignableFrom(t))
+            {
+                result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericComparer<int>), t);
             }
-
-            // If T is a Nullable<U> where U implements IComparable<U> return a NullableComparer<U>
-            if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
-                RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
-                if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) {
-                    return (Comparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(NullableComparer<int>), u);
+            else if (default(T) == null)
+            {
+                // If T is a Nullable<U> where U implements IComparable<U> return a NullableComparer<U>
+                if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
+                    RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
+                    if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) {
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(NullableComparer<int>), u);
+                    }
                 }
             }
-            // Otherwise return an ObjectComparer<T>
-          return new ObjectComparer<T>();
+            
+            return result != null ?
+                (Comparer<T>)result :
+                new ObjectComparer<T>(); // Fallback to ObjectComparer, which uses boxing
         }
 
         public abstract int Compare(T x, T y);
index 054d06c..b845d64 100644 (file)
@@ -33,28 +33,34 @@ namespace System.Collections.Generic
         // saves the right instantiations
         //
         [System.Security.SecuritySafeCritical]  // auto-generated
-        private static EqualityComparer<T> CreateComparer() {
+        private static EqualityComparer<T> CreateComparer()
+        {
             Contract.Ensures(Contract.Result<EqualityComparer<T>>() != null);
-
+            
+            object result = null;
             RuntimeType t = (RuntimeType)typeof(T);
+            
             // Specialize type byte for performance reasons
             if (t == typeof(byte)) {
-                return (EqualityComparer<T>)(object)(new ByteEqualityComparer());
+                result = new ByteEqualityComparer();
             }
             // If T implements IEquatable<T> return a GenericEqualityComparer<T>
-            if (typeof(IEquatable<T>).IsAssignableFrom(t)) {
-                return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericEqualityComparer<int>), t);
+            else if (typeof(IEquatable<T>).IsAssignableFrom(t))
+            {
+                result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericEqualityComparer<int>), t);
             }
-            // If T is a Nullable<U> where U implements IEquatable<U> return a NullableEqualityComparer<U>
-            if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
-                RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
-                if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) {
-                    return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(NullableEqualityComparer<int>), u);
+            else if (default(T) == null) // Reference type/Nullable
+            {
+                // If T is a Nullable<U> where U implements IEquatable<U> return a NullableEqualityComparer<U>
+                if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
+                    RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
+                    if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) {
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(NullableEqualityComparer<int>), u);
+                    }
                 }
             }
-            
             // See the METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST and METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST_LONG cases in getILIntrinsicImplementation
-            if (t.IsEnum) {
+            else if (t.IsEnum) {
                 TypeCode underlyingTypeCode = Type.GetTypeCode(Enum.GetUnderlyingType(t));
 
                 // Depending on the enum type, we need to special case the comparers so that we avoid boxing
@@ -62,21 +68,27 @@ namespace System.Collections.Generic
                 // implementation of GetHashCode is more complex than for the other types.
                 switch (underlyingTypeCode) {
                     case TypeCode.Int16: // short
-                        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(ShortEnumEqualityComparer<short>), t);
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(ShortEnumEqualityComparer<short>), t);
+                        break;
                     case TypeCode.SByte:
-                        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(SByteEnumEqualityComparer<sbyte>), t);
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(SByteEnumEqualityComparer<sbyte>), t);
+                        break;
                     case TypeCode.Int32:
                     case TypeCode.UInt32:
                     case TypeCode.Byte:
                     case TypeCode.UInt16: //ushort
-                        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(EnumEqualityComparer<int>), t);
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(EnumEqualityComparer<int>), t);
+                        break;
                     case TypeCode.Int64:
                     case TypeCode.UInt64:
-                        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(LongEnumEqualityComparer<long>), t);
+                        result = RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(LongEnumEqualityComparer<long>), t);
+                        break;
                 }
             }
-            // Otherwise return an ObjectEqualityComparer<T>
-            return new ObjectEqualityComparer<T>();
+            
+            return result != null ?
+                (EqualityComparer<T>)result :
+                new ObjectEqualityComparer<T>(); // Fallback to ObjectEqualityComparer, which uses boxing
         }
 
         [Pure]
@@ -300,8 +312,8 @@ namespace System.Collections.Generic
 #if FEATURE_CORECLR
     // NonRandomizedStringEqualityComparer is the comparer used by default with the Dictionary<string,...> 
     // As the randomized string hashing is turned on by default on coreclr, we need to keep the performance not affected 
-    // as much as possible in the main stream scenarios like Dictionary<string,\85>
-    // We use NonRandomizedStringEqualityComparer as default comparer as it doesn\92t use the randomized string hashing which 
+    // as much as possible in the main stream scenarios like Dictionary<string,>
+    // We use NonRandomizedStringEqualityComparer as default comparer as it doesnt use the randomized string hashing which 
     // keep the perofrmance not affected till we hit collision threshold and then we switch to the comparer which is using 
     // randomized string hashing GenericEqualityComparer<string>
 
index 73b23bc..28c50a8 100644 (file)
@@ -1974,7 +1974,7 @@ namespace System.Diagnostics.Tracing
                                         m_eventData[eventId].Descriptor.Level,
                                         m_eventData[eventId].Descriptor.Opcode,
                                         m_eventData[eventId].Descriptor.Task,
-                                        unchecked((long)(ulong)etwSessions | origKwd));
+                                        unchecked((long)etwSessions.ToEventKeywords() | origKwd));
 
                                     if (!m_provider.WriteEvent(ref desc, pActivityId, childActivityID, args))
                                         ThrowEventSourceException(m_eventData[eventId].Name);
@@ -1995,7 +1995,7 @@ namespace System.Diagnostics.Tracing
                                 // TODO: activity ID support
                                 EventSourceOptions opt = new EventSourceOptions
                                 {
-                                    Keywords = (EventKeywords)unchecked((long)(ulong)etwSessions | origKwd),
+                                    Keywords = (EventKeywords)unchecked((long)etwSessions.ToEventKeywords() | origKwd),
                                     Level = (EventLevel)m_eventData[eventId].Descriptor.Level,
                                     Opcode = (EventOpcode)m_eventData[eventId].Descriptor.Opcode
                                 };
index 6b53ba3..527fbe4 100644 (file)
@@ -111,13 +111,6 @@ namespace System.Runtime.Loader
                 throw new ArgumentException( Environment.GetResourceString("Argument_AbsolutePathRequired"), "nativeImagePath");
             }
 
-            // Check if the nativeImagePath has ".ni.dll" or ".ni.exe" extension
-            if (!(nativeImagePath.EndsWith(".ni.dll", StringComparison.InvariantCultureIgnoreCase) || 
-                  nativeImagePath.EndsWith(".ni.exe", StringComparison.InvariantCultureIgnoreCase)))
-            {
-                throw new ArgumentException("nativeImagePath");
-            }
-
             if (assemblyPath != null && Path.IsRelative(assemblyPath))
             {
                 throw new ArgumentException(Environment.GetResourceString("Argument_AbsolutePathRequired"), "assemblyPath");
@@ -184,7 +177,17 @@ namespace System.Runtime.Loader
         {
             AssemblyLoadContext context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target);
             
-            return context.LoadFromAssemblyName(assemblyName);
+            return context.ResolveUsingLoad(assemblyName);
+        }
+        
+        // This method is invoked by the VM to resolve an assembly reference using the Resolving event
+        // after trying assembly resolution via Load override and TPA load context without success.
+        private static Assembly ResolveUsingResolvingEvent(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
+        {
+            AssemblyLoadContext context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target);
+            
+            // Invoke the AssemblyResolve event callbacks if wired up
+            return context.ResolveUsingEvent(assemblyName);
         }
         
         private Assembly GetFirstResolvedAssembly(AssemblyName assemblyName)
@@ -210,23 +213,8 @@ namespace System.Runtime.Loader
             return resolvedAssembly;
         }
 
-        public Assembly LoadFromAssemblyName(AssemblyName assemblyName)
+        private Assembly ValidateAssemblyNameWithSimpleName(Assembly assembly, string requestedSimpleName)
         {
-            // AssemblyName is mutable. Cache the expected name before anybody gets a chance to modify it.
-            string requestedSimpleName = assemblyName.Name;
-            Assembly assembly = Load(assemblyName);
-            if (assembly == null)
-            {
-                // Invoke the AssemblyResolve event callbacks if wired up
-                assembly = GetFirstResolvedAssembly(assemblyName);
-            }
-
-            if (assembly == null)
-            {
-                throw new FileNotFoundException(Environment.GetResourceString("IO.FileLoad"), requestedSimpleName);
-            }
-            
             // Get the name of the loaded assembly
             string loadedSimpleName = null;
             
@@ -244,7 +232,56 @@ namespace System.Runtime.Loader
                 throw new InvalidOperationException(Environment.GetResourceString("Argument_CustomAssemblyLoadContextRequestedNameMismatch"));
  
             return assembly;
+            
+        }
+        
+        private Assembly ResolveUsingLoad(AssemblyName assemblyName)
+        {
+            string simpleName = assemblyName.Name;
+            Assembly assembly = Load(assemblyName);
+            
+            if (assembly != null)
+            {
+                assembly = ValidateAssemblyNameWithSimpleName(assembly, simpleName);
+            }
+            
+            return assembly;
+        }
+        
+        private Assembly ResolveUsingEvent(AssemblyName assemblyName)
+        {
+            string simpleName = assemblyName.Name;
+            
+            // Invoke the AssemblyResolve event callbacks if wired up
+            Assembly assembly = GetFirstResolvedAssembly(assemblyName);
+            if (assembly != null)
+            {
+                assembly = ValidateAssemblyNameWithSimpleName(assembly, simpleName);
+            }
+            
+            // Since attempt to resolve the assembly via Resolving event is the last option,
+            // throw an exception if we do not find any assembly.
+            if (assembly == null)
+            {
+                throw new FileNotFoundException(Environment.GetResourceString("IO.FileLoad"), simpleName);
+            }
+            
+            return assembly;
+        }
+        
+        public Assembly LoadFromAssemblyName(AssemblyName assemblyName)
+        {
+            // AssemblyName is mutable. Cache the expected name before anybody gets a chance to modify it.
+            string requestedSimpleName = assemblyName.Name;
+            
+            Assembly assembly = ResolveUsingLoad(assemblyName);
+            if (assembly == null)
+            {
+                // Invoke the AssemblyResolve event callbacks if wired up
+                assembly = ResolveUsingEvent(assemblyName);
+            }
 
+            return assembly;
         }
 
         [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
index 55f96b4..b2eb48e 100644 (file)
@@ -2299,8 +2299,46 @@ namespace System {
 
         [Pure]
         [System.Security.SecuritySafeCritical]  // auto-generated
-        [MethodImplAttribute(MethodImplOptions.InternalCall)]
-        public extern int IndexOf(char value, int startIndex, int count);
+        public unsafe int IndexOf(char value, int startIndex, int count) {
+            if (startIndex < 0 || startIndex > Length)
+                throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
+
+            if (count < 0 || count > Length - startIndex)
+                throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
+
+            fixed (char* pChars = &m_firstChar)
+            {
+                char* pCh = pChars + startIndex;
+
+                while (count >= 4)
+                {
+                    if (*pCh == value) goto ReturnIndex;
+                    if (*(pCh + 1) == value) goto ReturnIndex1;
+                    if (*(pCh + 2) == value) goto ReturnIndex2;
+                    if (*(pCh + 3) == value) goto ReturnIndex3;
+
+                    count -= 4;
+                    pCh += 4;
+                }
+
+                while (count > 0)
+                {
+                    if (*pCh == value)
+                        goto ReturnIndex;
+
+                    count--;
+                    pCh++;
+                }
+
+                return -1;
+
+                ReturnIndex3: pCh++;
+                ReturnIndex2: pCh++;
+                ReturnIndex1: pCh++;
+                ReturnIndex:
+                return (int)(pCh - pChars);
+            }
+        }
     
         // Returns the index of the first occurrence of any specified character in the current instance.
         // The search starts at startIndex and runs to startIndex + count -1.
@@ -2426,8 +2464,50 @@ namespace System {
 
         [Pure]
         [System.Security.SecuritySafeCritical]  // auto-generated
-        [MethodImplAttribute(MethodImplOptions.InternalCall)]
-        public extern int LastIndexOf(char value, int startIndex, int count);
+        public unsafe int LastIndexOf(char value, int startIndex, int count) {
+            if (Length == 0)
+                return -1;
+
+            if (startIndex < 0 || startIndex >= Length)
+                throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
+
+            if (count < 0 || count - 1 > startIndex)
+                throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
+
+            fixed (char* pChars = &m_firstChar)
+            {
+                char* pCh = pChars + startIndex;
+
+                //We search [startIndex..EndIndex]
+                while (count >= 4)
+                {
+                    if (*pCh == value) goto ReturnIndex;
+                    if (*(pCh - 1) == value) goto ReturnIndex1;
+                    if (*(pCh - 2) == value) goto ReturnIndex2;
+                    if (*(pCh - 3) == value) goto ReturnIndex3;
+
+                    count -= 4;
+                    pCh -= 4;
+                }
+
+                while (count > 0)
+                {
+                    if (*pCh == value)
+                        goto ReturnIndex;
+
+                    count--;
+                    pCh--;
+                }
+
+                return -1;
+
+                ReturnIndex3: pCh--;
+                ReturnIndex2: pCh--;
+                ReturnIndex1: pCh--;
+                ReturnIndex:
+                return (int)(pCh - pChars);
+            }
+        }
     
         // Returns the index of the last occurrence of any specified character in the current instance.
         // The search starts at startIndex and runs backwards to startIndex - count + 1.
index 6031457..777c7b9 100644 (file)
@@ -164,11 +164,9 @@ namespace System.Threading.Tasks
         internal object m_stateObject; // A state object that can be optionally supplied, passed to action.
         internal TaskScheduler m_taskScheduler; // The task scheduler this task runs under. 
 
-        internal readonly Task m_parent; // A task's parent, or null if parent-less.
-
         internal volatile int m_stateFlags;
 
-        private Task ParentForDebugger => m_parent; // Private property used by a debugger to access this Task's parent
+        private Task ParentForDebugger => m_contingentProperties?.m_parent; // Private property used by a debugger to access this Task's parent
         private int StateFlagsForDebugger => m_stateFlags; // Private property used by a debugger to access this Task's state flags
 
         // State constants for m_stateFlags;
@@ -252,7 +250,7 @@ namespace System.Threading.Tasks
         {
             // Additional context
 
-            internal ExecutionContext m_capturedContext; // The execution context to run the task within, if any.
+            internal ExecutionContext m_capturedContext; // The execution context to run the task within, if any. Only set from non-concurrent contexts.
 
             // Completion fields (exceptions and event)
 
@@ -275,6 +273,8 @@ namespace System.Threading.Tasks
             // A list of child tasks that threw an exception (TCEs don't count),
             // but haven't yet been waited on by the parent, lazily initialized.
             internal volatile List<Task> m_exceptionalChildren;
+            // A task's parent, or null if parent-less. Only set during Task construction.
+            internal Task m_parent; 
 
             /// <summary>
             /// Sets the internal completion event.
@@ -307,7 +307,7 @@ namespace System.Threading.Tasks
 
         // This field will only be instantiated to some non-null value if any ContingentProperties need to be set.
         // This will be a ContingentProperties instance or a type derived from it
-        internal volatile ContingentProperties m_contingentProperties;
+        internal ContingentProperties m_contingentProperties;
 
         // Special internal constructor to create an already-completed task.
         // if canceled==true, create a Canceled task, or else create a RanToCompletion task.
@@ -318,26 +318,16 @@ namespace System.Threading.Tasks
             if (canceled)
             {
                 m_stateFlags = TASK_STATE_CANCELED | TASK_STATE_CANCELLATIONACKNOWLEDGED | optionFlags;
-                ContingentProperties props;
-                m_contingentProperties = props = new ContingentProperties(); // can't have children, so just instantiate directly
-                props.m_cancellationToken = ct;
-                props.m_internalCancellationRequested = CANCELLATION_REQUESTED;
+                m_contingentProperties = new ContingentProperties() // can't have children, so just instantiate directly
+                {
+                    m_cancellationToken = ct,
+                    m_internalCancellationRequested = CANCELLATION_REQUESTED,
+                };
             }
             else
                 m_stateFlags = TASK_STATE_RAN_TO_COMPLETION | optionFlags;
         }
 
-        // Uncomment if/when we want Task.FromException
-        //// Special internal constructor to create an already-Faulted task.
-        //internal Task(Exception exception)
-        //{
-        //    Contract.Assert(exception != null);
-        //    ContingentProperties props;
-        //    m_contingentProperties = props = new ContingentProperties(); // can't have children, so just instantiate directly
-        //    props.m_exceptionsHolder.Add(exception);
-        //    m_stateFlags = TASK_STATE_FAULTED;
-        //}
-
         /// <summary>Constructor for use with promise-style tasks that aren't configurable.</summary>
         internal Task()
         {
@@ -358,10 +348,15 @@ namespace System.Threading.Tasks
                 throw new ArgumentOutOfRangeException("creationOptions");
             }
 
-            // m_parent is readonly, and so must be set in the constructor.
             // Only set a parent if AttachedToParent is specified.
             if ((creationOptions & TaskCreationOptions.AttachedToParent) != 0)
-                m_parent = Task.InternalCurrent;
+            {
+                Task parent = Task.InternalCurrent;
+                if (parent != null)
+                {
+                    EnsureContingentPropertiesInitializedUnsafe().m_parent = parent;
+                }
+            }
 
             TaskConstructorCore(null, state, default(CancellationToken), creationOptions, InternalTaskOptions.PromiseTask, null);
         }
@@ -563,13 +558,12 @@ namespace System.Threading.Tasks
             }
             Contract.EndContractBlock();
 
-            // This is readonly, and so must be set in the constructor
             // Keep a link to your parent if: (A) You are attached, or (B) you are self-replicating.
-            if (((creationOptions & TaskCreationOptions.AttachedToParent) != 0) ||
-                ((internalOptions & InternalTaskOptions.SelfReplicating) != 0)
-                )
+            if (parent != null &&
+                ((creationOptions & TaskCreationOptions.AttachedToParent) != 0 ||
+                 (internalOptions & InternalTaskOptions.SelfReplicating) != 0))
             {
-                m_parent = parent;
+                EnsureContingentPropertiesInitializedUnsafe().m_parent = parent;
             }
 
             TaskConstructorCore(action, state, cancellationToken, creationOptions, internalOptions, scheduler);
@@ -642,12 +636,13 @@ namespace System.Threading.Tasks
             // We can safely call the creator task's AddNewChild() method to register it, 
             // because at this point we are already on its thread of execution.
 
-            if (m_parent != null
+            Task parent = m_contingentProperties?.m_parent;
+            if (parent != null
                 && ((creationOptions & TaskCreationOptions.AttachedToParent) != 0)
-                && ((m_parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
+                && ((parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
                 )
             {
-                m_parent.AddNewChild();
+                parent.AddNewChild();
             }
 
             // if we have a non-null cancellationToken, allocate the contingent properties to save it
@@ -670,7 +665,7 @@ namespace System.Threading.Tasks
         {
             // There is no need to worry about concurrency issues here because we are in the constructor path of the task --
             // there should not be any race conditions to set m_contingentProperties at this point.
-            ContingentProperties props = EnsureContingentPropertiesInitialized(needsProtection: false);
+            ContingentProperties props = EnsureContingentPropertiesInitializedUnsafe();
             props.m_cancellationToken = cancellationToken;
 
             try
@@ -718,11 +713,12 @@ namespace System.Threading.Tasks
             {
                 // If we have an exception related to our CancellationToken, then we need to subtract ourselves
                 // from our parent before throwing it.
-                if ((m_parent != null) &&
+                Task parent = m_contingentProperties?.m_parent;
+                if ((parent != null) &&
                     ((Options & TaskCreationOptions.AttachedToParent) != 0)
-                     && ((m_parent.Options & TaskCreationOptions.DenyChildAttach) == 0))
+                     && ((parent.Options & TaskCreationOptions.DenyChildAttach) == 0))
                 {
-                    m_parent.DisregardChild();
+                    parent.DisregardChild();
                 }
                 throw;
             }
@@ -975,7 +971,7 @@ namespace System.Threading.Tasks
                 m_stateFlags |= Task.TASK_STATE_TASKSCHEDULED_WAS_FIRED;
 
                 Task currentTask = Task.InternalCurrent;
-                Task parentTask = this.m_parent;
+                Task parentTask = m_contingentProperties?.m_parent;
                 etwLog.TaskScheduled(ts.Id, currentTask == null ? 0 : currentTask.Id,
                                      this.Id, parentTask == null ? 0 : parentTask.Id, (int)this.Options,
                                      System.Threading.Thread.GetDomainID());
@@ -997,7 +993,7 @@ namespace System.Threading.Tasks
         {
             Contract.Assert(Task.InternalCurrent == this || this.IsSelfReplicatingRoot, "Task.AddNewChild(): Called from an external context");
 
-            var props = EnsureContingentPropertiesInitialized(needsProtection: true);
+            var props = EnsureContingentPropertiesInitialized();
 
             if (props.m_completionCountdown == 1 && !IsSelfReplicatingRoot)
             {
@@ -1020,7 +1016,7 @@ namespace System.Threading.Tasks
         {
             Contract.Assert(Task.InternalCurrent == this, "Task.DisregardChild(): Called from an external context");
 
-            var props = EnsureContingentPropertiesInitialized(needsProtection: true);
+            var props = EnsureContingentPropertiesInitialized();
             Contract.Assert(props.m_completionCountdown >= 2, "Task.DisregardChild(): Expected parent count to be >= 2");
             Interlocked.Decrement(ref props.m_completionCountdown);
         }
@@ -1469,7 +1465,7 @@ namespace System.Threading.Tasks
             get
             {
                 // check both the internal cancellation request flag and the CancellationToken attached to this task
-                var props = m_contingentProperties;
+                var props = Volatile.Read(ref m_contingentProperties);
                 return props != null &&
                     (props.m_internalCancellationRequested == CANCELLATION_REQUESTED ||
                      props.m_cancellationToken.IsCancellationRequested);
@@ -1480,35 +1476,22 @@ namespace System.Threading.Tasks
         /// Ensures that the contingent properties field has been initialized.
         /// ASSUMES THAT m_stateFlags IS ALREADY SET!
         /// </summary>
-        /// <param name="needsProtection">true if this needs to be done in a thread-safe manner; otherwise, false.</param>
         /// <returns>The initialized contingent properties object.</returns>
-        internal ContingentProperties EnsureContingentPropertiesInitialized(bool needsProtection)
+        internal ContingentProperties EnsureContingentPropertiesInitialized()
         {
-            var props = m_contingentProperties;
-            return props != null ? props : EnsureContingentPropertiesInitializedCore(needsProtection);
+            return LazyInitializer.EnsureInitialized(ref m_contingentProperties, () => new ContingentProperties());
         }
 
         /// <summary>
-        /// Initializes the contingent properties object.  This assumes a check has already been done for nullness.
+        /// Without synchronization, ensures that the contingent properties field has been initialized.
+        /// ASSUMES THAT m_stateFlags IS ALREADY SET!
         /// </summary>
-        /// <param name="needsProtection">true if this needs to be done in a thread-safe manner; otherwise, false.</param>
         /// <returns>The initialized contingent properties object.</returns>
-        private ContingentProperties EnsureContingentPropertiesInitializedCore(bool needsProtection)
+        internal ContingentProperties EnsureContingentPropertiesInitializedUnsafe()
         {
-            if (needsProtection)
-            {
-                return LazyInitializer.EnsureInitialized<ContingentProperties>(ref m_contingentProperties, s_createContingentProperties);
-            }
-            else
-            {
-                Contract.Assert(m_contingentProperties == null, "Expected props to be null after checking and with needsProtection == false");
-                return m_contingentProperties = new ContingentProperties();
-            }
+            return m_contingentProperties ?? (m_contingentProperties = new ContingentProperties());
         }
 
-        // Cached functions for lazily initializing contingent properties
-        private static readonly Func<ContingentProperties> s_createContingentProperties = () => new ContingentProperties();
-
         /// <summary>
         /// This internal property provides access to the CancellationToken that was set on the task 
         /// when it was constructed.
@@ -1517,7 +1500,7 @@ namespace System.Threading.Tasks
         {
             get
             {
-                var props = m_contingentProperties;
+                var props = Volatile.Read(ref m_contingentProperties);
                 return (props == null) ? default(CancellationToken) : props.m_cancellationToken;
             }
         }
@@ -1661,7 +1644,7 @@ namespace System.Threading.Tasks
         {
             get
             {
-                var contingentProps = EnsureContingentPropertiesInitialized(needsProtection: true);
+                var contingentProps = EnsureContingentPropertiesInitialized();
                 if (contingentProps.m_completionEvent == null)
                 {
                     bool wasCompleted = IsCompleted;
@@ -1708,7 +1691,7 @@ namespace System.Threading.Tasks
         {
             get
             {
-                var props = m_contingentProperties;
+                var props = Volatile.Read(ref m_contingentProperties);
                 return props != null ? props.m_completionCountdown - 1 : 0;
             }
         }
@@ -1720,7 +1703,7 @@ namespace System.Threading.Tasks
         {
             get
             {
-                var props = m_contingentProperties;
+                var props = Volatile.Read(ref m_contingentProperties);
                 return (props != null) && (props.m_exceptionsHolder != null) && (props.m_exceptionsHolder.ContainsFaultList);
             }
         }
@@ -1757,9 +1740,7 @@ namespace System.Threading.Tasks
                 }
                 else
                 {
-                    var props = m_contingentProperties;
-                    if (props != null && props.m_capturedContext != null) return props.m_capturedContext;
-                    else return ExecutionContext.PreAllocatedDefault;
+                    return m_contingentProperties?.m_capturedContext ?? ExecutionContext.PreAllocatedDefault;
                 }
             }
             set
@@ -1771,7 +1752,7 @@ namespace System.Threading.Tasks
                 }
                 else if (!value.IsPreAllocatedDefault) // not the default context, then inflate the contingent properties and set it
                 {
-                    EnsureContingentPropertiesInitialized(needsProtection: false).m_capturedContext = value;
+                    EnsureContingentPropertiesInitializedUnsafe().m_capturedContext = value;
                 }
                 //else do nothing, this is the default context
             }
@@ -1858,7 +1839,7 @@ namespace System.Threading.Tasks
                 }
 
                 // Dispose of the underlying completion event if it exists
-                var cp = m_contingentProperties;
+                var cp = Volatile.Read(ref m_contingentProperties);
                 if (cp != null)
                 {
                     // Make a copy to protect against racing Disposes.
@@ -2020,7 +2001,7 @@ namespace System.Threading.Tasks
             //
 
             // Lazily initialize the holder, ensuring only one thread wins.
-            var props = EnsureContingentPropertiesInitialized(needsProtection: true);
+            var props = EnsureContingentPropertiesInitialized();
             if (props.m_exceptionsHolder == null)
             {
                 TaskExceptionHolder holder = new TaskExceptionHolder(this);
@@ -2127,11 +2108,7 @@ namespace System.Threading.Tasks
         internal ExceptionDispatchInfo GetCancellationExceptionDispatchInfo()
         {
             Contract.Assert(IsCanceled, "Must only be used when the task has canceled.");
-            var props = m_contingentProperties;
-            if (props == null) return null;
-            var holder = props.m_exceptionsHolder;
-            if (holder == null) return null;
-            return holder.GetCancellationExceptionDispatchInfo(); // may be null
+            return Volatile.Read(ref m_contingentProperties)?.m_exceptionsHolder?.GetCancellationExceptionDispatchInfo(); // may be null
         }
 
         /// <summary>
@@ -2162,10 +2139,11 @@ namespace System.Threading.Tasks
         /// </summary>
         internal void UpdateExceptionObservedStatus()
         {
-            if ((m_parent != null)
+            Task parent = m_contingentProperties?.m_parent;
+            if ((parent != null)
                 && ((Options & TaskCreationOptions.AttachedToParent) != 0)
-                && ((m_parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
-                && Task.InternalCurrent == m_parent)
+                && ((parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
+                && Task.InternalCurrent == parent)
             {
                 m_stateFlags |= TASK_STATE_EXCEPTIONOBSERVEDBYPARENT;
             }
@@ -2215,7 +2193,7 @@ namespace System.Threading.Tasks
             }
             else
             {
-                var props = m_contingentProperties;
+                var props = Volatile.Read(ref m_contingentProperties);
 
                 if (props == null || // no contingent properties means no children, so it's safe to complete ourselves
                     (props.m_completionCountdown == 1 && !IsSelfReplicatingRoot) ||
@@ -2319,7 +2297,7 @@ namespace System.Threading.Tasks
 
             // Set the completion event if it's been lazy allocated.
             // And if we made a cancellation registration, it's now unnecessary.
-            var cp = m_contingentProperties;
+            var cp = Volatile.Read(ref m_contingentProperties);
             if (cp != null)
             {
                 cp.SetCompleted();
@@ -2346,11 +2324,12 @@ namespace System.Threading.Tasks
             m_action = null;
 
             // Notify parent if this was an attached task
-            if (m_parent != null
-                 && ((m_parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
+            Task parent = m_contingentProperties?.m_parent;
+            if (parent != null
+                 && ((parent.CreationOptions & TaskCreationOptions.DenyChildAttach) == 0)
                  && (((TaskCreationOptions)(m_stateFlags & OptionsMask)) & TaskCreationOptions.AttachedToParent) != 0)
             {
-                m_parent.ProcessChildCompletion(this);
+                parent.ProcessChildCompletion(this);
             }
 
             // Activate continuations (if any).
@@ -2365,9 +2344,9 @@ namespace System.Threading.Tasks
             Contract.Requires(childTask != null);
             Contract.Requires(childTask.IsCompleted, "ProcessChildCompletion was called for an uncompleted task");
 
-            Contract.Assert(childTask.m_parent == this, "ProcessChildCompletion should only be called for a child of this task");
+            Contract.Assert(childTask.m_contingentProperties?.m_parent == this, "ProcessChildCompletion should only be called for a child of this task");
 
-            var props = m_contingentProperties;
+            var props = Volatile.Read(ref m_contingentProperties);
 
             // if the child threw and we haven't observed it we need to save it for future reference
             if (childTask.IsFaulted && !childTask.IsExceptionObservedByParent)
@@ -2412,23 +2391,23 @@ namespace System.Threading.Tasks
             // simultaneously on the same task from two different contexts.  This can result in m_exceptionalChildren
             // being nulled out while it is being processed, which could lead to a NullReferenceException.  To
             // protect ourselves, we'll cache m_exceptionalChildren in a local variable.
-            var props = m_contingentProperties;
-            List<Task> tmp = (props != null) ? props.m_exceptionalChildren : null;
+            var props = Volatile.Read(ref m_contingentProperties);
+            List<Task> exceptionalChildren = props?.m_exceptionalChildren;
 
-            if (tmp != null)
+            if (exceptionalChildren != null)
             {
                 // This lock is necessary because even though AddExceptionsFromChildren is last to execute, it may still 
                 // be racing with the code segment at the bottom of Finish() that prunes the exceptional child array. 
-                lock (tmp)
+                lock (exceptionalChildren)
                 {
-                    foreach (Task task in tmp)
+                    foreach (Task task in exceptionalChildren)
                     {
                         // Ensure any exceptions thrown by children are added to the parent.
                         // In doing this, we are implicitly marking children as being "handled".
                         Contract.Assert(task.IsCompleted, "Expected all tasks in list to be completed");
                         if (task.IsFaulted && !task.IsExceptionObservedByParent)
                         {
-                            TaskExceptionHolder exceptionHolder = task.m_contingentProperties.m_exceptionsHolder;
+                            TaskExceptionHolder exceptionHolder = Volatile.Read(ref task.m_contingentProperties).m_exceptionsHolder;
                             Contract.Assert(exceptionHolder != null);
 
                             // No locking necessary since child task is finished adding exceptions
@@ -2456,7 +2435,7 @@ namespace System.Threading.Tasks
         /// <param name="delegateRan">Whether the delegate was executed.</param>
         internal void FinishThreadAbortedTask(bool bTAEAddedToExceptionHolder, bool delegateRan)
         {
-            Contract.Assert(!bTAEAddedToExceptionHolder || (m_contingentProperties != null && m_contingentProperties.m_exceptionsHolder != null),
+            Contract.Assert(!bTAEAddedToExceptionHolder || m_contingentProperties?.m_exceptionsHolder != null,
                             "FinishThreadAbortedTask() called on a task whose exception holder wasn't initialized");
 
             // this will only be false for non-root self replicating task copies, because all of their exceptions go to the root task.
@@ -3477,9 +3456,7 @@ namespace System.Threading.Tasks
         internal void RecordInternalCancellationRequest()
         {
             // Record the cancellation request.
-            var props = EnsureContingentPropertiesInitialized(needsProtection: true);
-            props.m_internalCancellationRequested = CANCELLATION_REQUESTED;
-
+            EnsureContingentPropertiesInitialized().m_internalCancellationRequested = CANCELLATION_REQUESTED;
         }
 
         // Breaks out logic for recording a cancellation request
@@ -3539,7 +3516,7 @@ namespace System.Threading.Tasks
             Interlocked.Exchange(ref m_stateFlags, m_stateFlags | TASK_STATE_CANCELED);
 
             // Fire completion event if it has been lazily initialized
-            var cp = m_contingentProperties;
+            var cp = Volatile.Read(ref m_contingentProperties);
             if (cp != null)
             {
                 cp.SetCompleted();
index 1207828..9ce7ab6 100644 (file)
@@ -500,7 +500,7 @@ namespace System.Threading.Tasks
             Contract.Assert(!IsCompleted, "The promise must not yet be completed.");
 
             // If we have a parent, we need to notify it of the completion.  Take the slow path to handle that.
-            if (m_parent != null)
+            if (m_contingentProperties?.m_parent != null)
             {
                 bool success = TrySetResult(result);
 
@@ -593,7 +593,7 @@ namespace System.Threading.Tasks
             //
             // The lazy initialization may not be strictly necessary, but I'd like to keep it here
             // anyway.  Some downstream logic may depend upon an inflated m_contingentProperties.
-            EnsureContingentPropertiesInitialized(needsProtection: true);
+            EnsureContingentPropertiesInitialized();
             if (AtomicStateUpdate(TASK_STATE_COMPLETION_RESERVED,
                 TASK_STATE_COMPLETION_RESERVED | TASK_STATE_RAN_TO_COMPLETION | TASK_STATE_FAULTED | TASK_STATE_CANCELED))
             {
index fc24b2b..fc8ed53 100644 (file)
@@ -3,6 +3,11 @@
 // See the LICENSE file in the project root for more information.
 using System.Runtime.CompilerServices;
 
+#if FEATURE_CORECLR
+// We need this to be able to typeforward to internal types
+[assembly: InternalsVisibleTo("mscorlib, PublicKey=00240000048000009400000006020000002400005253413100040000010001008d56c76f9e8649383049f383c44be0ec204181822a6c31cf5eb7ef486944d032188ea1d3920763712ccb12d75fb77e9811149e6148e5d32fbaab37611c1878ddc19e20ef135d0cb2cff2bfec3d115810c3d9069638fe4be215dbf795861920e5ab6f7db2e2ceef136ac23d5dd2bf031700aec232f6c6b1c785b4305c123b37ab", AllInternalsVisible=false)]
+#endif
+
 // For now we are only moving to using this file over AssemblyAttributes.cspp in CoreSys, ideally we would move away from the centralized 
 // AssemblyAttributes.cspp model for the other build types at a future point in time.
 #if FEATURE_CORESYSTEM
index 0bbdfa0..baa11a4 100644 (file)
@@ -481,6 +481,7 @@ typedef long time_t;
 #define PAL_INITIALIZE_EXEC_ALLOCATOR               0x02
 #define PAL_INITIALIZE_STD_HANDLES                  0x04
 #define PAL_INITIALIZE_REGISTER_SIGTERM_HANDLER     0x08
+#define PAL_INITIALIZE_DEBUGGER_EXCEPTIONS          0x10
 
 // PAL_Initialize() flags
 #define PAL_INITIALIZE                 (PAL_INITIALIZE_SYNC_THREAD | PAL_INITIALIZE_STD_HANDLES)
@@ -489,7 +490,7 @@ typedef long time_t;
 #define PAL_INITIALIZE_DLL             PAL_INITIALIZE_NONE       
 
 // PAL_InitializeCoreCLR() flags
-#define PAL_INITIALIZE_CORECLR         (PAL_INITIALIZE | PAL_INITIALIZE_EXEC_ALLOCATOR | PAL_INITIALIZE_REGISTER_SIGTERM_HANDLER)
+#define PAL_INITIALIZE_CORECLR         (PAL_INITIALIZE | PAL_INITIALIZE_EXEC_ALLOCATOR | PAL_INITIALIZE_REGISTER_SIGTERM_HANDLER | PAL_INITIALIZE_DEBUGGER_EXCEPTIONS)
 
 typedef DWORD (PALAPI *PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);
 typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
@@ -582,12 +583,12 @@ BOOL
 PALAPI
 PAL_NotifyRuntimeStarted();
 
+static const int MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH = 64;
+
 PALIMPORT
-VOID
+void
 PALAPI
-PAL_CleanupTargetProcess(
-    IN int pid, 
-    IN UINT64 disambiguationKey);
+PAL_GetTransportPipeName(char *name, DWORD id, const char *suffix);
 
 PALIMPORT
 void
@@ -1689,13 +1690,6 @@ GetProcessTimes(
         OUT LPFILETIME lpKernelTime,
         OUT LPFILETIME lpUserTime);
 
-PALIMPORT
-BOOL
-PALAPI
-GetProcessIdDisambiguationKey(
-        IN DWORD processId,
-        OUT UINT64 *disambiguationKey);
-
 #define MAXIMUM_WAIT_OBJECTS  64
 #define WAIT_OBJECT_0 0
 #define WAIT_ABANDONED   0x00000080
@@ -2973,6 +2967,7 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
 
 typedef struct _IMAGE_ARM_RUNTIME_FUNCTION_ENTRY {
     DWORD BeginAddress;
+    DWORD EndAddress;
     union {
         DWORD UnwindData;
         struct {
@@ -5786,11 +5781,11 @@ CoCreateGuid(OUT GUID * pguid);
 #define ungetc        PAL_ungetc
 #define setvbuf       PAL_setvbuf
 #define atol          PAL_atol
+#define labs          PAL_labs
 #define acos          PAL_acos
 #define asin          PAL_asin
 #define atan2         PAL_atan2
 #define exp           PAL_exp
-#define labs          PAL_labs
 #define log           PAL_log
 #define log10         PAL_log10
 #define pow           PAL_pow
@@ -6012,40 +6007,39 @@ unsigned int __cdecl _rotr(unsigned int value, int shift)
 }
 
 PALIMPORT int __cdecl abs(int);
-PALIMPORT double __cdecl fabs(double); 
 #ifndef PAL_STDCPP_COMPAT
 PALIMPORT LONG __cdecl labs(LONG);
-PALIMPORT double __cdecl fabs(double);
 #endif // !PAL_STDCPP_COMPAT
 // clang complains if this is declared with __int64
 PALIMPORT long long __cdecl llabs(long long);
 
-PALIMPORT double __cdecl sqrt(double);
-PALIMPORT double __cdecl log(double);
-PALIMPORT double __cdecl log10(double);
-PALIMPORT double __cdecl exp(double);
-PALIMPORT double __cdecl pow(double, double);
+PALIMPORT int __cdecl _finite(double);
+PALIMPORT int __cdecl _isnan(double);
+PALIMPORT double __cdecl _copysign(double, double);
 PALIMPORT double __cdecl acos(double);
 PALIMPORT double __cdecl asin(double);
 PALIMPORT double __cdecl atan(double);
-PALIMPORT double __cdecl atan2(double,double);
+PALIMPORT double __cdecl atan2(double, double);
+PALIMPORT double __cdecl ceil(double);
 PALIMPORT double __cdecl cos(double);
-PALIMPORT double __cdecl sin(double);
-PALIMPORT double __cdecl tan(double);
 PALIMPORT double __cdecl cosh(double);
+PALIMPORT double __cdecl exp(double);
+PALIMPORT double __cdecl fabs(double);
+PALIMPORT double __cdecl floor(double);
+PALIMPORT double __cdecl fmod(double, double); 
+PALIMPORT double __cdecl log(double);
+PALIMPORT double __cdecl log10(double);
+PALIMPORT double __cdecl modf(double, double*);
+PALIMPORT double __cdecl pow(double, double);
+PALIMPORT double __cdecl sin(double);
 PALIMPORT double __cdecl sinh(double);
+PALIMPORT double __cdecl sqrt(double);
+PALIMPORT double __cdecl tan(double);
 PALIMPORT double __cdecl tanh(double);
-PALIMPORT double __cdecl fmod(double, double);
-PALIMPORT float __cdecl fmodf(float, float);
-PALIMPORT double __cdecl floor(double);
-PALIMPORT double __cdecl ceil(double);
-PALIMPORT float __cdecl fabsf(float);
-PALIMPORT double __cdecl modf(double, double *);
-PALIMPORT float __cdecl modff(float, float *);
 
-PALIMPORT int __cdecl _finite(double);
-PALIMPORT int __cdecl _isnan(double);
-PALIMPORT double __cdecl _copysign(double, double);
+PALIMPORT float __cdecl fabsf(float);
+PALIMPORT float __cdecl fmodf(float, float); 
+PALIMPORT float __cdecl modff(float, float*);
 
 #ifndef PAL_STDCPP_COMPAT
 
index d17c050..852d306 100644 (file)
@@ -259,6 +259,8 @@ C_FUNC(\Name\()_End):
 // extra locals + padding to qword align
 .macro PROLOG_WITH_TRANSITION_BLOCK extraLocals = 0, stackAllocOnEntry = 0, stackAllocSpill1, stackAllocSpill2, stackAllocSpill3
 
+        set_cfa_register rsp, 8
+        
         __PWTB_FloatArgumentRegisters = \extraLocals
 
         .if ((__PWTB_FloatArgumentRegisters % 16) != 0)
index ca8c193..cafcbad 100644 (file)
@@ -3,7 +3,7 @@
 // See the LICENSE file in the project root for more information.
 
 #ifndef VER_PRODUCTNAME_STR
-        #define VER_PRODUCTNAME_STR      L"Microsoft\256 .NET Framework"
+        #define VER_PRODUCTNAME_STR      L"Microsoft\256 .NET Core"
 #endif
 
 #ifndef VER_LEGALCOPYRIGHT_STR
index 976e609..b61c9cd 100644 (file)
@@ -98,9 +98,9 @@ endif(PAL_CMAKE_PLATFORM_ARCH_ARM)
 set(SOURCES
   cruntime/file.cpp
   cruntime/filecrt.cpp
-  cruntime/finite.cpp
   cruntime/lstr.cpp
   cruntime/malloc.cpp
+  cruntime/math.cpp
   cruntime/mbstring.cpp
   cruntime/misc.cpp
   cruntime/misctls.cpp
index b7140e8..d7f85e7 100644 (file)
@@ -22,12 +22,12 @@ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
     ldr        r10,    [r0, #(CONTEXT_R10)]
     ldr        r11,    [r0, #(CONTEXT_R11)]
     ldr        sp,     [r0, #(CONTEXT_Sp)]
-    ldr        lr,     [r0, #(CONTEXT_Lr)]
 
     ldr        r2,     [r0, #(CONTEXT_Pc)]
 
     // Store return address to the stack
-    push    {r2}
+    // Added r7 as a dummy to keep the stack aligned by 8 bytes.
+    push    {r2, r7}
 
     // The PAL_SEHException pointer
     mov        r0,     r1
index b2c6959..75970da 100644 (file)
 #cmakedefine01 PTHREAD_CREATE_MODIFIES_ERRNO
 #cmakedefine01 SEM_INIT_MODIFIES_ERRNO
 #cmakedefine01 HAVE_PROCFS_CTL
+#cmakedefine01 HAVE_PROCFS_MAPS
+#cmakedefine01 HAVE_PROCFS_STAT
+#cmakedefine01 HAVE_PROCFS_STATUS
 #cmakedefine01 HAVE_COMPATIBLE_ACOS
 #cmakedefine01 HAVE_COMPATIBLE_ASIN
 #cmakedefine01 HAVE_COMPATIBLE_POW
 #cmakedefine01 HAVE_SCHED_OTHER_ASSIGNABLE
 
 #define CHECK_TRACE_SPECIFIERS 0
-#define PROCFS_MEM_NAME ""
 #define HAVE_GETHRTIME 0
 #define HAVE_LOWERCASE_ISO_NAME 0
 #define HAVE_READ_REAL_TIME 0
index 2d630ed..24ed60e 100644 (file)
@@ -665,13 +665,85 @@ int main(void) {
   char path[1024];
 #endif
 
-  sprintf(path, \"/proc/%u/$1\", getpid());
-  fd = open(path, $2);
+  sprintf(path, \"/proc/%u/ctl\", getpid());
+  fd = open(path, O_WRONLY);
   if (fd == -1) {
     exit(1);
   }
   exit(0);
 }" HAVE_PROCFS_CTL)
+set(CMAKE_REQUIRED_LIBRARIES)
+check_cxx_source_runs("
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int main(void) {
+  int fd;
+#ifdef PATH_MAX
+  char path[PATH_MAX];
+#elif defined(MAXPATHLEN)
+  char path[MAXPATHLEN];
+#else
+  char path[1024];
+#endif
+
+  sprintf(path, \"/proc/%u/maps\", getpid());
+  fd = open(path, O_RDONLY);
+  if (fd == -1) {
+    exit(1);
+  }
+  exit(0);
+}" HAVE_PROCFS_MAPS)
+set(CMAKE_REQUIRED_LIBRARIES)
+check_cxx_source_runs("
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int main(void) {
+  int fd;
+#ifdef PATH_MAX
+  char path[PATH_MAX];
+#elif defined(MAXPATHLEN)
+  char path[MAXPATHLEN];
+#else
+  char path[1024];
+#endif
+
+  sprintf(path, \"/proc/%u/stat\", getpid());
+  fd = open(path, O_RDONLY);
+  if (fd == -1) {
+    exit(1);
+  }
+  exit(0);
+}" HAVE_PROCFS_STAT)
+set(CMAKE_REQUIRED_LIBRARIES)
+check_cxx_source_runs("
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int main(void) {
+  int fd;
+#ifdef PATH_MAX
+  char path[PATH_MAX];
+#elif defined(MAXPATHLEN)
+  char path[MAXPATHLEN];
+#else
+  char path[1024];
+#endif
+
+  sprintf(path, \"/proc/%u/status\", getpid());
+  fd = open(path, O_RDONLY);
+  if (fd == -1) {
+    exit(1);
+  }
+  exit(0);
+}" HAVE_PROCFS_STATUS)
 set(CMAKE_REQUIRED_LIBRARIES m)
 check_cxx_source_runs("
 #include <math.h>
@@ -703,7 +775,25 @@ check_cxx_source_runs("
 
 int main(void) {
   double infinity = 1.0 / 0.0;
-  if (!isnan(pow(1.0, infinity))) {
+  if (pow(1.0, infinity) != 1.0 || pow(1.0, -infinity) != 1.0) {
+    exit(1)
+  }
+  if (!isnan(pow(-1.0, infinity)) || !isnan(pow(-1.0, -infinity))) {
+    exit(1);
+  }
+  if (pow(0.0, infinity) != 0.0) {
+    exit(1);
+  }
+  if (pow(0.0, -infinity) != infinity) {
+    exit(1);
+  }
+  if (pow(-1.1, infinity) != infinity || pow(1.1, infinity) != infinity) {
+    exit(1);
+  }
+  if (pow(-1.1, -infinity) != 0.0 || pow(1.1, infinity) != 0.0) {
+    exit(1);
+  }
+  if (pow(-0.0, -1) != -infinity) {
     exit(1);
   }
   if (pow(0.0, -1) != infinity) {
similarity index 70%
rename from src/pal/src/cruntime/finite.cpp
rename to src/pal/src/cruntime/math.cpp
index 1777f7d..7075fd6 100644 (file)
@@ -8,11 +8,11 @@
 
 Module Name:
 
-    finite.cpp
+    math.cpp
 
 Abstract:
 
-    Implementation of _finite function (Windows specific runtime function).
+    Implementation of math family functions.
 
 
 
@@ -20,19 +20,22 @@ Abstract:
 
 #include "pal/palinternal.h"
 #include "pal/dbgmsg.h"
+
 #include <math.h>
 
 #if HAVE_IEEEFP_H
 #include <ieeefp.h>
 #endif  // HAVE_IEEEFP_H
+
 #include <errno.h>
 
-#define PAL_NAN sqrt(-1.0)
-#define PAL_POSINF -log(0.0)
-#define PAL_NEGINF log(0.0)
+#define PAL_NAN_DBL     sqrt(-1.0)
+#define PAL_POSINF_DBL -log(0.0)
+#define PAL_NEGINF_DBL  log(0.0)
 
-SET_DEFAULT_DEBUG_CHANNEL(CRT);
+#define IS_DBL_NEGZERO(x)         (((*((INT64*)((void*)&x))) & I64(0xFFFFFFFFFFFFFFFF)) == I64(0x8000000000000000))
 
+SET_DEFAULT_DEBUG_CHANNEL(CRT);
 
 /*++
 Function:
@@ -51,41 +54,37 @@ Parameter
 x  Double-precision floating-point value
 
 --*/
-int
-__cdecl
-_finite(
-        double x)
+int __cdecl _finite(double x)
 {
     int ret;
     PERF_ENTRY(_finite);
     ENTRY("_finite (x=%f)\n", x);
+
 #if defined(_IA64_) && defined (_HPUX_)
-    ret = !isnan(x) && x != PAL_POSINF && x != PAL_NEGINF;
+    ret = !isnan(x) && (x != PAL_POSINF_DBL) && (x != PAL_NEGINF_DBL);
 #else
     ret = isfinite(x);
 #endif
+
     LOGEXIT("_finite returns int %d\n", ret);
     PERF_EXIT(_finite);
     return ret;
 }
 
-
 /*++
 Function:
   _isnan
 
 See MSDN doc
 --*/
-int
-__cdecl
-_isnan(
-       double x)
+int __cdecl _isnan(double x)
 {
     int ret;
-
     PERF_ENTRY(_isnan);
     ENTRY("_isnan (x=%f)\n", x);
+
     ret = isnan(x);
+
     LOGEXIT("_isnan returns int %d\n", ret);
     PERF_EXIT(_isnan);
     return ret;
@@ -97,17 +96,14 @@ Function:
 
 See MSDN doc
 --*/
-double 
-__cdecl 
-_copysign(
-          double x,
-          double y)
+double __cdecl _copysign(double x, double y)
 {
     double ret;
-
     PERF_ENTRY(_copysign);
-    ENTRY("_copysign (x=%f,y=%f)\n", x, y);
+    ENTRY("_copysign (x=%f, y=%f)\n", x, y);
+
     ret = copysign(x, y);
+
     LOGEXIT("_copysign returns double %f\n", ret);
     PERF_EXIT(_copysign);
     return ret;
@@ -122,19 +118,22 @@ See MSDN.
 PALIMPORT double __cdecl PAL_acos(double x)
 {
     double ret;
-
     PERF_ENTRY(acos);
     ENTRY("acos (x=%f)\n", x);
+
 #if !HAVE_COMPATIBLE_ACOS
     errno = 0;
 #endif  // HAVE_COMPATIBLE_ACOS
+
     ret = acos(x);
+    
 #if !HAVE_COMPATIBLE_ACOS
     if (errno == EDOM)
     {
-        ret = PAL_NAN;  // NaN
+        ret = PAL_NAN_DBL;  // NaN
     }
 #endif  // HAVE_COMPATIBLE_ACOS
+
     LOGEXIT("acos returns double %f\n", ret);
     PERF_EXIT(acos);
     return ret;
@@ -149,19 +148,22 @@ See MSDN.
 PALIMPORT double __cdecl PAL_asin(double x)
 {
     double ret;
-
     PERF_ENTRY(asin);
     ENTRY("asin (x=%f)\n", x);
+
 #if !HAVE_COMPATIBLE_ASIN
     errno = 0;
 #endif  // HAVE_COMPATIBLE_ASIN
+
     ret = asin(x);
+
 #if !HAVE_COMPATIBLE_ASIN
     if (errno == EDOM)
     {
-        ret = PAL_NAN;  // NaN
+        ret = PAL_NAN_DBL;  // NaN
     }
 #endif  // HAVE_COMPATIBLE_ASIN
+
     LOGEXIT("asin returns double %f\n", ret);
     PERF_EXIT(asin);
     return ret;
@@ -176,35 +178,32 @@ See MSDN.
 PALIMPORT double __cdecl PAL_atan2(double y, double x)
 {
     double ret;
-
     PERF_ENTRY(atan2);
     ENTRY("atan2 (y=%f, x=%f)\n", y, x);
+
 #if !HAVE_COMPATIBLE_ATAN2
     errno = 0;
 #endif  // !HAVE_COMPATIBLE_ATAN2
+
     ret = atan2(y, x);
+
 #if !HAVE_COMPATIBLE_ATAN2
-    if (errno == EDOM)
+    if ((errno == EDOM) && (x == 0.0) && (y == 0.0))
     {
-#if HAVE_COPYSIGN
-        if (x == 0.0 && y == 0.0)
+        const double sign_x = copysign(1.0, x);
+        const double sign_y = copysign(1.0, y);
+
+        if (sign_x > 0)
+        {
+            ret = copysign(0.0, sign_y);
+        }
+        else
         {
-            const double sign_x = copysign (1.0, x);
-            const double sign_y = copysign (1.0, y);
-            if (sign_x > 0)
-            {
-                ret = copysign (0.0, sign_y);
-            }
-            else
-            {
-                ret = copysign (atan2 (0.0, -1.0), sign_y);
-            }
+            ret = copysign(atan2(0.0, -1.0), sign_y);
         }
-#else   // HAVE_COPYSIGN
-#error  Missing copysign or equivalent on this platform!
-#endif  // HAVE_COPYSIGN
     }
 #endif  // !HAVE_COMPATIBLE_ATAN2
+
     LOGEXIT("atan2 returns double %f\n", ret);
     PERF_EXIT(atan2);
     return ret;
@@ -219,9 +218,9 @@ See MSDN.
 PALIMPORT double __cdecl PAL_exp(double x)
 {
     double ret;
-
     PERF_ENTRY(exp);
     ENTRY("exp (x=%f)\n", x);
+
 #if !HAVE_COMPATIBLE_EXP
     if (x == 1.0) 
     {
@@ -229,11 +228,14 @@ PALIMPORT double __cdecl PAL_exp(double x)
     }
     else
     {
-        ret = exp(x);
-    }
-#else // !HAVE_COMPATIBLE_EXP
+#endif  // HAVE_COMPATIBLE_EXP
+
     ret = exp(x);
-#endif // !HAVE_COMPATIBLE_EXP
+    
+#if !HAVE_COMPATIBLE_EXP
+    }
+#endif // HAVE_COMPATIBLE_EXP
+
     LOGEXIT("exp returns double %f\n", ret);
     PERF_EXIT(exp);
     return ret;
@@ -248,7 +250,6 @@ See MSDN.
 PALIMPORT LONG __cdecl PAL_labs(LONG l)
 {
     long lRet;
-
     PERF_ENTRY(labs);
     ENTRY("labs (l=%ld)\n", l);
     
@@ -256,9 +257,7 @@ PALIMPORT LONG __cdecl PAL_labs(LONG l)
 
     LOGEXIT("labs returns long %ld\n", lRet);
     PERF_EXIT(labs);
-      /* This explicit cast to LONG is used to silence any potential warnings
-         due to implicitly casting the native long lRet to LONG when returning. */
-    return (LONG)lRet;
+    return (LONG)lRet; // This explicit cast to LONG is used to silence any potential warnings due to implicitly casting the native long lRet to LONG when returning.
 }
 
 /*++
@@ -270,22 +269,22 @@ See MSDN.
 PALIMPORT double __cdecl PAL_log(double x)
 {
     double ret;
-
     PERF_ENTRY(log);
     ENTRY("log (x=%f)\n", x);
+
 #if !HAVE_COMPATIBLE_LOG
     errno = 0;
 #endif  // !HAVE_COMPATIBLE_LOG
+
     ret = log(x);
+
 #if !HAVE_COMPATIBLE_LOG
-    if (errno == EDOM)
+    if ((errno == EDOM) && (x < 0))
     {
-        if (x < 0)
-        {
-           ret = PAL_NAN;    // NaN
-        }
+        ret = PAL_NAN_DBL;    // NaN
     }
 #endif  // !HAVE_COMPATIBLE_LOG
+
     LOGEXIT("log returns double %f\n", ret);
     PERF_EXIT(log);
     return ret;
@@ -300,22 +299,22 @@ See MSDN.
 PALIMPORT double __cdecl PAL_log10(double x)
 {
     double ret;
-
     PERF_ENTRY(log10);
     ENTRY("log10 (x=%f)\n", x);
+
 #if !HAVE_COMPATIBLE_LOG10
     errno = 0;
 #endif  // !HAVE_COMPATIBLE_LOG10
+
     ret = log10(x);
+    
 #if !HAVE_COMPATIBLE_LOG10
-    if (errno == EDOM)
+    if ((errno == EDOM) && (x < 0))
     {
-        if (x < 0)
-        {
-           ret = PAL_NAN;    // NaN
-        }
+        ret = PAL_NAN_DBL;    // NaN
     }
 #endif  // !HAVE_COMPATIBLE_LOG10
+
     LOGEXIT("log10 returns double %f\n", ret);
     PERF_EXIT(log10);
     return ret;
@@ -330,63 +329,78 @@ See MSDN.
 PALIMPORT double __cdecl PAL_pow(double x, double y)
 {
     double ret;
-
     PERF_ENTRY(pow);
     ENTRY("pow (x=%f, y=%f)\n", x, y);
+
 #if !HAVE_COMPATIBLE_POW
-    if (y == PAL_POSINF && !isnan(x))    // +Inf
+    if ((y == PAL_POSINF_DBL) && !isnan(x))    // +Inf
     {
-        if (x == 1.0 || x == -1.0)
+        if (x == 1.0)
+        {
+            ret = x;
+        }
+        else if (x == -1.0)
         {
-           ret = PAL_NAN;    // NaN
+            ret = PAL_NAN_DBL;    // NaN
         }
-        else if (x > -1.0 && x < 1.0)
+        else if ((x > -1.0) && (x < 1.0))
         {
-           ret = 0.0;
+            ret = 0.0;
         }
         else
         {
-           ret = PAL_POSINF;    // +Inf
+            ret = PAL_POSINF_DBL;    // +Inf
         }
     }
-    else if (y == PAL_NEGINF && !isnan(x))   // -Inf
+    else if ((y == PAL_NEGINF_DBL) && !isnan(x))   // -Inf
     {
-        if (x == 1.0 || x == -1.0)
+        if (x == 1.0)
         {
-           ret = PAL_NAN;    // NaN
+            ret = x;
         }
-        else if (x > -1.0 && x < 1.0)
+        else if (x == -1.0)
         {
-           ret = PAL_POSINF;    // +Inf
+            ret = PAL_NAN_DBL;    // NaN
+        }
+        else if ((x > -1.0) && (x < 1.0))
+        {
+            ret = PAL_POSINF_DBL;    // +Inf
         }
         else
         {
-           ret = 0.0;
+            ret = 0.0;
         }
     }
-    else if (x == 0.0 && y < 0.0)
+    else if (IS_DBL_NEGZERO(x) && (y == -1.0))
+    {
+        ret = PAL_NEGINF_DBL;    // -Inf
+    }
+    else if ((x == 0.0) && (y < 0.0))
     {
-        ret = PAL_POSINF;    // +Inf
+        ret = PAL_POSINF_DBL;    // +Inf
     }
     else
 #endif  // !HAVE_COMPATIBLE_POW
-    if (y == 0.0 && isnan(x))
+
+    if ((y == 0.0) && isnan(x))
     {
         // Windows returns NaN for pow(NaN, 0), but POSIX specifies
         // a return value of 1 for that case.  We need to return
         // the same result as Windows.
-        ret = PAL_NAN;
+        ret = PAL_NAN_DBL;
     }
     else
     {
-      ret = pow(x, y);
+        ret = pow(x, y);
     }
+
 #if !HAVE_VALID_NEGATIVE_INF_POW
-    if (ret == PAL_POSINF && x < 0 && finite(x) && ceil(y/2) != floor(y/2))
+    if ((ret == PAL_POSINF_DBL) && (x < 0) && isfinite(x) && (ceil(y / 2) != floor(y / 2)))
     {
-        ret = PAL_NEGINF;   // -Inf
+        ret = PAL_NEGINF_DBL;   // -Inf
     }
 #endif  // !HAVE_VALID_NEGATIVE_INF_POW
+
 #if !HAVE_VALID_POSITIVE_INF_POW
     /*
     * The even/odd test in the if (this one and the one above) used to be ((long long) y % 2 == 0)
@@ -398,11 +412,12 @@ PALIMPORT double __cdecl PAL_pow(double x, double y)
     * 
     * The (ceil(y/2) == floor(y/2)) test is slower, but more robust.
     */
-    if (ret == PAL_NEGINF && x < 0 && finite(x) && ceil(y/2) == floor(y/2))
+    if ((ret == PAL_NEGINF_DBL) && (x < 0) && isfinite(x) && (ceil(y / 2) == floor(y / 2)))
     {
-        ret = PAL_POSINF;   // +Inf
+        ret = PAL_POSINF_DBL;   // +Inf
     }
 #endif  // !HAVE_VALID_POSITIVE_INF_POW
+
     LOGEXIT("pow returns double %f\n", ret);
     PERF_EXIT(pow);
     return ret;
index 18eb8c4..508a967 100644 (file)
@@ -49,6 +49,8 @@ mach_port_t s_ExceptionPort;
 
 static BOOL s_DebugInitialized = FALSE;
 
+static DWORD s_PalInitializeFlags = 0;
+
 static const char * PAL_MACH_EXCEPTION_MODE = "PAL_MachExceptionMode";
 
 // This struct is used to track the threads that need to have an exception forwarded
@@ -191,7 +193,7 @@ GetExceptionMask()
     {
         machExceptionMask |= PAL_EXC_ILLEGAL_MASK;
     }
-    if (!(exMode & MachException_SuppressDebugging))
+    if (!(exMode & MachException_SuppressDebugging) && (s_PalInitializeFlags & PAL_INITIALIZE_DEBUGGER_EXCEPTIONS))
     {
 #ifdef FEATURE_PAL_SXS
         // Always hook exception ports for breakpoint exceptions.
@@ -1325,24 +1327,27 @@ MachSetThreadContext(CONTEXT *lpContext)
     }
 }
 
+
 /*++
 Function :
     SEHInitializeMachExceptions 
 
     Initialize all SEH-related stuff related to mach exceptions
 
-    (no parameters)
+    flags - PAL_INITIALIZE flags
 
 Return value :
     TRUE  if SEH support initialization succeeded
     FALSE otherwise
 --*/
 BOOL 
-SEHInitializeMachExceptions(void)
+SEHInitializeMachExceptions(DWORD flags)
 {
     pthread_t exception_thread;
     kern_return_t machret;
 
+    s_PalInitializeFlags = flags;
+
     // Allocate a mach port that will listen in on exceptions
     machret = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &s_ExceptionPort);
     if (machret != KERN_SUCCESS)
index c9f0276..18e3150 100644 (file)
@@ -35,7 +35,7 @@ extern "C"
 #define PAL_EXC_ALL_MASK       (PAL_EXC_ILLEGAL_MASK | PAL_EXC_DEBUGGING_MASK | PAL_EXC_MANAGED_MASK)
 
 // Process and thread initialization/cleanup/context routines
-BOOL SEHInitializeMachExceptions(void);
+BOOL SEHInitializeMachExceptions(DWORD flags);
 void SEHCleanupExceptionPort (void);
 void MachExceptionInitializeDebug(void);
 PAL_NORETURN void MachSetThreadContext(CONTEXT *lpContext);
index f6dd1d9..763306b 100644 (file)
@@ -141,7 +141,6 @@ static void UnwindContextToWinContext(unw_cursor_t *cursor, CONTEXT *winContext)
 #elif defined(_ARM_)
     unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp);
     unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc);
-    winContext->Pc &= ~0x1;
     unw_get_reg(cursor, UNW_ARM_R14, (unw_word_t *) &winContext->Lr);
     unw_get_reg(cursor, UNW_ARM_R4, (unw_word_t *) &winContext->R4);
     unw_get_reg(cursor, UNW_ARM_R5, (unw_word_t *) &winContext->R5);
index 4c01be8..7348192 100644 (file)
@@ -205,21 +205,20 @@ function_name() to call the system's implementation
 #define va_list DUMMY_va_list
 #define abs DUMMY_abs
 #define llabs DUMMY_llabs
-#define atan DUMMY_atan
-#define tan DUMMY_tan
+#define ceil DUMMY_ceil
 #define cos DUMMY_cos
-#define sin DUMMY_sin
 #define cosh DUMMY_cosh
-#define sinh DUMMY_sinh
-#define tanh DUMMY_tanh
-#define modf DUMMY_modf
+#define fabs DUMMY_fabs
+#define floor DUMMY_floor
 #define fmod DUMMY_fmod
-#define fmodf DUMMY_fmodf
+#define modf DUMMY_modf
+#define sin DUMMY_sin
+#define sinh DUMMY_sinh
 #define sqrt DUMMY_sqrt
-#define ceil DUMMY_ceil
-#define fabs DUMMY_fabs
+#define tan DUMMY_tan
+#define tanh DUMMY_tanh
 #define fabsf DUMMY_fabsf
-#define floor DUMMY_floor
+#define fmodf DUMMY_fmodf
 #define modff DUMMY_modff
 
 /* RAND_MAX needed to be renamed to avoid duplicate definition when including 
@@ -443,11 +442,27 @@ function_name() to call the system's implementation
 #undef llabs
 #undef acos
 #undef asin
+#undef atan
 #undef atan2
+#undef ceil
+#undef cos
+#undef cosh
 #undef exp
+#undef fabs
+#undef floor
+#undef fmod
 #undef log
 #undef log10
+#undef modf
 #undef pow
+#undef sin
+#undef sinh
+#undef sqrt
+#undef tan
+#undef tanh
+#undef fabsf
+#undef fmodf
+#undef modff
 #undef rand
 #undef srand
 #undef errno
@@ -455,22 +470,6 @@ function_name() to call the system's implementation
 #undef wcsspn
 #undef open
 #undef glob
-#undef atan
-#undef tan
-#undef cos
-#undef sin
-#undef cosh
-#undef sinh
-#undef tanh
-#undef modf
-#undef fmod
-#undef fmodf
-#undef sqrt
-#undef ceil
-#undef fabs
-#undef fabsf
-#undef floor
-#undef modff
 
 #undef wchar_t
 #undef ptrdiff_t
@@ -567,6 +566,10 @@ function_name() to call the system's implementation
 #endif
 #include <ctype.h>
 
+// Don't use C++ wrappers for stdlib.h
+// https://gcc.gnu.org/ml/libstdc++/2016-01/msg00025.html 
+#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS 1
+
 #define _WITH_GETLINE
 #include <stdio.h>
 #include <stdlib.h>
index 046eb63..475cd70 100644 (file)
@@ -38,6 +38,8 @@ static_assert_no_msg(_countof(SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH) >= _count
 #define SHARED_MEMORY_SESSION_DIRECTORY_NAME_PREFIX "session"
 static_assert_no_msg(_countof(SHARED_MEMORY_SESSION_DIRECTORY_NAME_PREFIX) >= _countof(SHARED_MEMORY_GLOBAL_DIRECTORY_NAME));
 
+#define SHARED_MEMORY_UNIQUE_TEMP_NAME_TEMPLATE "/tmp/.coreclr.XXXXXX"
+
 #define SHARED_MEMORY_MAX_SESSION_ID_CHAR_COUNT (10)
 
 #define SHARED_MEMORY_MAX_FILE_PATH_CHAR_COUNT \
@@ -103,8 +105,9 @@ public:
 
     template<SIZE_T DestinationByteCount, SIZE_T SourceByteCount> static SIZE_T CopyString(char (&destination)[DestinationByteCount], SIZE_T destinationStartOffset, const char (&source)[SourceByteCount]);
     template<SIZE_T DestinationByteCount> static SIZE_T CopyString(char (&destination)[DestinationByteCount], SIZE_T destinationStartOffset, LPCSTR source, SIZE_T sourceCharCount);
+    template<SIZE_T DestinationByteCount> static SIZE_T AppendUInt32String(char (&destination)[DestinationByteCount], SIZE_T destinationStartOffset, UINT32 value);
 
-    static bool EnsureDirectoryExists(const char *path, bool createIfNotExist = true);
+    static bool EnsureDirectoryExists(const char *path, bool isGlobalLockAcquired, bool createIfNotExist = true);
 private:
     static int Open(LPCSTR path, int flags, mode_t mode = static_cast<mode_t>(0));
 public:
index 240da95..69b8704 100644 (file)
@@ -9,9 +9,11 @@
 
 #include "dbgmsg.h"
 
+#include <string.h>
+
 template<SIZE_T DestinationByteCount, SIZE_T SourceByteCount>
 SIZE_T SharedMemoryHelpers::CopyString(
-    char(&destination)[DestinationByteCount],
+    char (&destination)[DestinationByteCount],
     SIZE_T destinationStartOffset,
     const char(&source)[SourceByteCount])
 {
@@ -20,16 +22,32 @@ SIZE_T SharedMemoryHelpers::CopyString(
 
 template<SIZE_T DestinationByteCount>
 SIZE_T SharedMemoryHelpers::CopyString(
-    char(&destination)[DestinationByteCount],
+    char (&destination)[DestinationByteCount],
     SIZE_T destinationStartOffset,
     LPCSTR source,
     SIZE_T sourceCharCount)
 {
-    _ASSERTE(destinationStartOffset <= DestinationByteCount);
+    _ASSERTE(destinationStartOffset < DestinationByteCount);
     _ASSERTE(sourceCharCount < DestinationByteCount - destinationStartOffset);
+    _ASSERTE(strlen(source) == sourceCharCount);
 
     memcpy_s(&destination[destinationStartOffset], DestinationByteCount - destinationStartOffset, source, sourceCharCount + 1);
     return destinationStartOffset + sourceCharCount;
 }
 
+template<SIZE_T DestinationByteCount>
+SIZE_T SharedMemoryHelpers::AppendUInt32String(
+    char (&destination)[DestinationByteCount],
+    SIZE_T destinationStartOffset,
+    UINT32 value)
+{
+    _ASSERTE(destination != nullptr);
+    _ASSERTE(destinationStartOffset < DestinationByteCount);
+
+    int valueCharCount =
+        sprintf_s(&destination[destinationStartOffset], DestinationByteCount - destinationStartOffset, "%u", value);
+    _ASSERTE(valueCharCount > 0);
+    return destinationStartOffset + valueCharCount;
+}
+
 #endif // !_PAL_SHARED_MEMORY_INL_
index 416916b..ccd2298 100644 (file)
@@ -305,7 +305,7 @@ Initialize(
 #if HAVE_MACH_EXCEPTIONS
         // Mach exception port needs to be set up before the thread
         // data or threads are set up.
-        if (!SEHInitializeMachExceptions())
+        if (!SEHInitializeMachExceptions(flags))
         {
             ERROR("SEHInitializeMachExceptions failed!\n");
             palError = ERROR_GEN_FAILURE;
index 2c5ef9b..6e740ba 100644 (file)
@@ -16,6 +16,8 @@
 #include <sys/types.h>
 
 #include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
@@ -90,8 +92,11 @@ SIZE_T SharedMemoryHelpers::AlignUp(SIZE_T value, SIZE_T alignment)
     return AlignDown(value + (alignment - 1), alignment);
 }
 
-bool SharedMemoryHelpers::EnsureDirectoryExists(const char *path, bool createIfNotExist)
+bool SharedMemoryHelpers::EnsureDirectoryExists(const char *path, bool isGlobalLockAcquired, bool createIfNotExist)
 {
+    _ASSERTE(path != nullptr);
+    _ASSERTE(SharedMemoryManager::IsCreationDeletionProcessLockAcquired());
+
     // Check if the path already exists
     struct stat statInfo;
     int statResult = stat(path, &statInfo);
@@ -102,27 +107,49 @@ bool SharedMemoryHelpers::EnsureDirectoryExists(const char *path, bool createIfN
             return false;
         }
 
-        // The path does not exist, create the directory
-        if (mkdir(path, PermissionsMask_AllUsers_ReadWriteExecute) == 0)
+        // The path does not exist, create the directory. The permissions mask passed to mkdir() is filtered by the process'
+        // permissions umask, so mkdir() may not set all of the requested permissions. We need to use chmod() to set the proper
+        // permissions. That creates a race when there is no global lock acquired when creating the directory. Another user's
+        // process may create the directory and this user's process may try to use it before the other process sets the full
+        // permissions. In that case, create a temporary directory first, set the permissions, and rename it to the actual
+        // directory name.
+
+        if (isGlobalLockAcquired)
         {
-            // The permissions mask passed to mkdir() is filtered by the process' permissions umask, so mkdir() may not set all
-            // of the requested permissions. Use chmod() to set the proper permissions.
-            if (chmod(path, PermissionsMask_AllUsers_ReadWriteExecute) == 0)
+            if (mkdir(path, PermissionsMask_AllUsers_ReadWriteExecute) != 0)
             {
-                return true;
+                throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
             }
-            rmdir(path);
+            if (chmod(path, PermissionsMask_AllUsers_ReadWriteExecute) != 0)
+            {
+                rmdir(path);
+                throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
+            }
+            return true;
+        }
+
+        char tempPath[] = SHARED_MEMORY_UNIQUE_TEMP_NAME_TEMPLATE;
+        if (mkdtemp(tempPath) == nullptr)
+        {
             throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
         }
-        if (errno != EEXIST)
+        if (chmod(tempPath, PermissionsMask_AllUsers_ReadWriteExecute) != 0)
         {
+            rmdir(tempPath);
             throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
         }
+        if (rename(tempPath, path) == 0)
+        {
+            return true;
+        }
 
+        // Another process may have beaten us to it. Delete the temp directory and continue to check the requested directory to
+        // see if it meets our needs.
+        rmdir(tempPath);
         statResult = stat(path, &statInfo);
     }
 
-    // The path exists, check that it's a directory
+    // If the path exists, check that it's a directory
     if (statResult != 0 || !(statInfo.st_mode & S_IFDIR))
     {
         throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
@@ -425,14 +452,7 @@ SIZE_T SharedMemoryId::AppendSessionDirectoryName(
     if (IsSessionScope())
     {
         pathCharCount = SharedMemoryHelpers::CopyString(path, pathCharCount, SHARED_MEMORY_SESSION_DIRECTORY_NAME_PREFIX);
-        int sessionIdCharCount =
-            sprintf_s(
-                &path[pathCharCount],
-                _countof(path) - pathCharCount,
-                "%u",
-                GetCurrentSessionId());
-        _ASSERTE(sessionIdCharCount > 0);
-        pathCharCount += sessionIdCharCount;
+        pathCharCount = SharedMemoryHelpers::AppendUInt32String(path, pathCharCount, GetCurrentSessionId());
     }
     else
     {
@@ -581,7 +601,7 @@ SharedMemoryProcessDataHeader *SharedMemoryProcessDataHeader::CreateOrOpen(
     SIZE_T filePathCharCount = SharedMemoryHelpers::CopyString(filePath, 0, SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH);
     filePath[filePathCharCount++] = '/';
     filePathCharCount = id.AppendSessionDirectoryName(filePath, filePathCharCount);
-    if (!SharedMemoryHelpers::EnsureDirectoryExists(filePath, createIfNotExist))
+    if (!SharedMemoryHelpers::EnsureDirectoryExists(filePath, true /* isGlobalLockAcquired */, createIfNotExist))
     {
         _ASSERTE(!createIfNotExist);
         return nullptr;
@@ -1009,12 +1029,19 @@ void SharedMemoryManager::AcquireCreationDeletionFileLock()
 
     if (s_creationDeletionLockFileDescriptor == -1)
     {
-        if (!SharedMemoryHelpers::EnsureDirectoryExists(SHARED_MEMORY_TEMP_DIRECTORY_PATH, false /* createIfNotExist */))
+        if (!SharedMemoryHelpers::EnsureDirectoryExists(
+                SHARED_MEMORY_TEMP_DIRECTORY_PATH,
+                false /* isGlobalLockAcquired */,
+                false /* createIfNotExist */))
         {
             throw SharedMemoryException(static_cast<DWORD>(SharedMemoryError::IO));
         }
-        SharedMemoryHelpers::EnsureDirectoryExists(SHARED_MEMORY_RUNTIME_TEMP_DIRECTORY_PATH);
-        SharedMemoryHelpers::EnsureDirectoryExists(SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH);
+        SharedMemoryHelpers::EnsureDirectoryExists(
+            SHARED_MEMORY_RUNTIME_TEMP_DIRECTORY_PATH,
+            false /* isGlobalLockAcquired */);
+        SharedMemoryHelpers::EnsureDirectoryExists(
+            SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH,
+            false /* isGlobalLockAcquired */);
         s_creationDeletionLockFileDescriptor = SharedMemoryHelpers::OpenDirectory(SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH);
         if (s_creationDeletionLockFileDescriptor == -1)
         {
index 1977bbf..1db4303 100644 (file)
@@ -317,13 +317,21 @@ CorUnix::InternalCreateMutex(
         &pobjRegisteredMutex
         );
 
-    _ASSERTE(pobjRegisteredMutex == nullptr || pobjRegisteredMutex == pobjMutex);
     if (palError != NO_ERROR)
     {
         _ASSERTE(palError != ERROR_ALREADY_EXISTS); // PAL's naming infrastructure is not used for named mutexes
+        _ASSERTE(pobjRegisteredMutex == nullptr);
+        _ASSERTE(hMutex == nullptr);
         goto InternalCreateMutexExit;
     }
 
+    // Now that the object has been registered successfully, it would have a reference associated with the handle, so release
+    // the initial reference. Any errors from now on need to revoke the handle.
+    _ASSERTE(pobjRegisteredMutex == pobjMutex);
+    _ASSERTE(hMutex != nullptr);
+    pobjMutex->ReleaseReference(pthr);
+    pobjRegisteredMutex = nullptr;
+
     if (lpName != nullptr)
     {
         SharedMemoryProcessDataHeader *processDataHeader;
@@ -347,25 +355,20 @@ CorUnix::InternalCreateMutex(
         }
     }
 
-    //
-    // pobjMutex is invalidated by the call to RegisterObject, so NULL it
-    // out here to ensure that we don't try to release a reference on
-    // it down the line.
-    //
-    
-    pobjMutex = NULL;
     *phMutex = hMutex;
+    hMutex = nullptr;
+    pobjMutex = nullptr;
 
 InternalCreateMutexExit:
 
-    if (NULL != pobjMutex)
+    _ASSERTE(pobjRegisteredMutex == nullptr);
+    if (hMutex != nullptr)
     {
-        pobjMutex->ReleaseReference(pthr);
+        g_pObjectManager->RevokeHandle(pthr, hMutex);
     }
-
-    if (NULL != pobjRegisteredMutex)
+    else if (NULL != pobjMutex)
     {
-        pobjRegisteredMutex->ReleaseReference(pthr);
+        pobjMutex->ReleaseReference(pthr);
     }
 
     LOGEXIT("InternalCreateMutex returns %i\n", palError);
@@ -686,13 +689,21 @@ CorUnix::InternalOpenMutex(
         &pobjRegisteredMutex
         );
 
-    _ASSERTE(pobjRegisteredMutex == nullptr || pobjRegisteredMutex == pobjMutex);
     if (palError != NO_ERROR)
     {
         _ASSERTE(palError != ERROR_ALREADY_EXISTS); // PAL's naming infrastructure is not used for named mutexes
+        _ASSERTE(pobjRegisteredMutex == nullptr);
+        _ASSERTE(hMutex == nullptr);
         goto InternalOpenMutexExit;
     }
 
+    // Now that the object has been registered successfully, it would have a reference associated with the handle, so release
+    // the initial reference. Any errors from now on need to revoke the handle.
+    _ASSERTE(pobjRegisteredMutex == pobjMutex);
+    _ASSERTE(hMutex != nullptr);
+    pobjMutex->ReleaseReference(pthr);
+    pobjRegisteredMutex = nullptr;
+
     {
         SharedMemoryProcessDataHeader *processDataHeader;
         try
@@ -712,25 +723,20 @@ CorUnix::InternalOpenMutex(
         SharedMemoryProcessDataHeader::PalObject_SetProcessDataHeader(pobjMutex, processDataHeader);
     }
 
-    //
-    // pobjMutex is invalidated by the call to RegisterObject, so NULL it
-    // out here to ensure that we don't try to release a reference on
-    // it down the line.
-    //
-
-    pobjMutex = NULL;
     *phMutex = hMutex;
+    hMutex = nullptr;
+    pobjMutex = nullptr;
 
 InternalOpenMutexExit:
 
-    if (NULL != pobjMutex)
+    _ASSERTE(pobjRegisteredMutex == nullptr);
+    if (hMutex != nullptr)
     {
-        pobjMutex->ReleaseReference(pthr);
+        g_pObjectManager->RevokeHandle(pthr, hMutex);
     }
-
-    if (NULL != pobjRegisteredMutex)
+    else if (NULL != pobjMutex)
     {
-        pobjRegisteredMutex->ReleaseReference(pthr);
+        pobjMutex->ReleaseReference(pthr);
     }
 
     LOGEXIT("InternalCreateMutex returns %i\n", palError);
@@ -1146,7 +1152,7 @@ SharedMemoryProcessDataHeader *NamedMutexProcessData::CreateOrOpen(
             SharedMemoryHelpers::CopyString(lockFilePath, 0, SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH);
         if (created)
         {
-            SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath);
+            SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath, true /* isGlobalLockAcquired */);
         }
 
         // Create the session directory
@@ -1155,7 +1161,7 @@ SharedMemoryProcessDataHeader *NamedMutexProcessData::CreateOrOpen(
         lockFilePathCharCount = id->AppendSessionDirectoryName(lockFilePath, lockFilePathCharCount);
         if (created)
         {
-            SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath);
+            SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath, true /* isGlobalLockAcquired */);
             autoCleanup.m_lockFilePath = lockFilePath;
             autoCleanup.m_sessionDirectoryPathCharCount = lockFilePathCharCount;
         }
index 384c7c8..d644e0d 100644 (file)
@@ -488,6 +488,12 @@ void CONTEXTFromNativeContext(const native_context_t *native, LPCONTEXT lpContex
     if ((contextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
     {
         ASSIGN_CONTROL_REGS
+#ifdef _ARM_
+        // WinContext assumes that the least bit of Pc is always 1 (denoting thumb)
+        // although the pc value retrived from native context might not have set the least bit.
+        // This becomes especially problematic if the context is on the JIT_WRITEBARRIER.
+        lpContext->Pc |= 0x1;
+#endif
     }
 
     if ((contextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER)
index 4cb5597..f0d9b2c 100644 (file)
@@ -28,6 +28,7 @@ Abstract:
 #include "pal/process.h"
 #include "pal/init.h"
 #include "pal/critsect.h"
+#include "pal/debug.h"
 #include "pal/dbgmsg.h"
 #include "pal/utils.h"
 #include "pal/environ.h"
@@ -41,8 +42,10 @@ Abstract:
 #include "pal/fakepoll.h"
 #endif  // HAVE_POLL
 
+#include <unistd.h>
 #include <sys/mman.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <signal.h>
 #include <sys/wait.h>
 #include <sys/time.h>
@@ -90,6 +93,12 @@ PALAPI
 StartupHelperThread(
     LPVOID p);
 
+static 
+BOOL 
+GetProcessIdDisambiguationKey(
+    IN DWORD processId, 
+    OUT UINT64 *disambiguationKey);
+
 //
 // Helper memory page used by the FlushProcessWriteBuffers
 //
@@ -141,10 +150,6 @@ DWORD gSID = (DWORD) -1;
 #define CLR_SEM_MAX_NAMELEN (NAME_MAX - 4)
 #endif
 
-// The runtime waits on this semaphore if the dbgshim startup semaphore exists
-Volatile<sem_t *> g_continueSem = SEM_FAILED;
-char g_continueSemName[CLR_SEM_MAX_NAMELEN];
-
 // Function to call during PAL/process shutdown/abort
 Volatile<PSHUTDOWN_CALLBACK> g_shutdownCallback = nullptr;
 
@@ -1433,23 +1438,23 @@ static bool IsCoreClrModule(const char* pModulePath)
 // Keep 31 length for Core 1.0 RC2 compatibility
 #if defined(__NetBSD__)
 static const char* RuntimeStartupSemaphoreName = "/clrst%08llx";
-static const char* RuntimeOldContinueSemaphoreName = "/clrco%08llx";
 static const char* RuntimeContinueSemaphoreName = "/clrct%08llx";
 #else
 static const char* RuntimeStartupSemaphoreName = "/clrst%08x%016llx";
-static const char* RuntimeOldContinueSemaphoreName = "/clrco%08x%016llx";
 static const char* RuntimeContinueSemaphoreName = "/clrct%08x%016llx";
 #endif
 
 #if defined(__NetBSD__)
 static uint64_t HashSemaphoreName(uint64_t a, uint64_t b)
 {
-       return (a ^ b) & 0xffffffff;
+    return (a ^ b) & 0xffffffff;
 }
 #else
 #define HashSemaphoreName(a,b) a,b
 #endif
 
+static const char* PipeNameFormat = "/tmp/clr-debug-pipe-%d-%llu-%s";
+
 class PAL_RuntimeStartupHelper
 {
     LONG m_ref;
@@ -1458,7 +1463,6 @@ class PAL_RuntimeStartupHelper
     PVOID m_parameter;
     DWORD m_threadId;
     HANDLE m_threadHandle;
-
     DWORD m_processId;
 
     // A value that, used in conjunction with the process ID, uniquely identifies a process.
@@ -1468,6 +1472,10 @@ class PAL_RuntimeStartupHelper
     // Debugger waits on this semaphore and the runtime signals it on startup.
     sem_t *m_startupSem;
 
+    // Debuggee waits on this semaphore and the debugger signals it after the startup callback 
+    // registered (m_callback) returns.
+    sem_t *m_continueSem;
+
 public:
     PAL_RuntimeStartupHelper(DWORD dwProcessId, PPAL_STARTUP_CALLBACK pfnCallback, PVOID parameter) :
         m_ref(1),
@@ -1477,7 +1485,8 @@ public:
         m_threadId(0),
         m_threadHandle(NULL),
         m_processId(dwProcessId),
-        m_startupSem(SEM_FAILED)
+        m_startupSem(SEM_FAILED),
+        m_continueSem(SEM_FAILED)
     {
     }
 
@@ -1496,6 +1505,19 @@ public:
             sem_unlink(startupSemName);
         }
 
+        if (m_continueSem != SEM_FAILED)
+        {
+            char continueSemName[CLR_SEM_MAX_NAMELEN];
+            sprintf_s(continueSemName,
+                      sizeof(continueSemName),
+                      RuntimeContinueSemaphoreName,
+                      HashSemaphoreName(m_processId,
+                                        m_processIdDisambiguationKey));
+
+            sem_close(m_continueSem);
+            sem_unlink(continueSemName);
+        }
+
         if (m_threadHandle != NULL)
         {
             CloseHandle(m_threadHandle);
@@ -1553,6 +1575,7 @@ public:
     {
         CPalThread *pThread = InternalGetCurrentThread();
         char startupSemName[CLR_SEM_MAX_NAMELEN];
+        char continueSemName[CLR_SEM_MAX_NAMELEN];
         PAL_ERROR pe = NO_ERROR;
 
         // See semaphore name format for details about this value. We store it so that
@@ -1567,7 +1590,23 @@ public:
                   HashSemaphoreName(m_processId,
                                     m_processIdDisambiguationKey));
 
-        TRACE("PAL_RuntimeStartupHelper.Register startup sem '%s'\n", startupSemName);
+        sprintf_s(continueSemName,
+                  sizeof(continueSemName),
+                  RuntimeContinueSemaphoreName,
+                  HashSemaphoreName(m_processId,
+                                    m_processIdDisambiguationKey));
+
+        TRACE("PAL_RuntimeStartupHelper.Register creating startup '%s' continue '%s'\n", startupSemName, continueSemName);
+
+        // Create the continue semaphore first so we don't race with PAL_NotifyRuntimeStarted. This open will fail if another 
+        // debugger is trying to attach to this process because the name will already exist.
+        m_continueSem = sem_open(continueSemName, O_CREAT | O_EXCL, S_IRWXU, 0);
+        if (m_continueSem == SEM_FAILED)
+        {
+            TRACE("sem_open(continue) failed: errno is %d (%s)\n", errno, strerror(errno));
+            pe = GetSemError();
+            goto exit;
+        }
 
         // Create the debuggee startup semaphore so the runtime (debuggee) knows to wait for a debugger connection.
         m_startupSem = sem_open(startupSemName, O_CREAT | O_EXCL, S_IRWXU, 0);
@@ -1607,6 +1646,12 @@ public:
     {
         m_canceled = true;
 
+        // Tell the runtime to continue
+        if (sem_post(m_continueSem) != 0)
+        {
+            ASSERT("sem_post(continueSem) failed: errno is %d (%s)\n", errno, strerror(errno));
+        }
+
         // Tell the worker thread to continue
         if (sem_post(m_startupSem) != 0)
         {
@@ -1624,113 +1669,109 @@ public:
         }
     }
 
+    //
+    // There are a couple race conditions that need to be considered here:
+    //
+    // * On launch, between the fork and execv in the PAL's CreateProcess where the target process 
+    //   may contain a coreclr module image if the debugger process is running managed code. This 
+    //   makes just checking if the coreclr module exists not enough.
+    //
+    // * On launch (after the execv) or attach when the coreclr is loaded but before the DAC globals 
+    //   table is initialized where it is too soon to use/initialize the DAC on the debugger side.
+    //
+    // They are both fixed by check if the one of transport pipe files has been created.
+    //
+    bool IsCoreClrProcessReady()
+    {
+        char pipeName[MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH];  
+
+        PAL_GetTransportPipeName(pipeName, m_processId, "in");
+
+        struct stat buf;
+        if (stat(pipeName, &buf) == 0) 
+        {
+            TRACE("IsCoreClrProcessReady: stat(%s) SUCCEEDED\n", pipeName);
+            return true;
+        }
+        TRACE("IsCoreClrProcessReady: stat(%s) FAILED: errno is %d (%s)\n", pipeName, errno, strerror(errno));
+        return false;
+    }
+
     PAL_ERROR InvokeStartupCallback()
     {
+        ProcessModules *listHead = NULL;
         PAL_ERROR pe = NO_ERROR;
+        DWORD count;
 
-        if (!m_canceled)
+        if (m_canceled)
         {
-            // Enumerate all the modules in the process and invoke the callback 
-            // for the coreclr module if found.
-            DWORD count;
-            ProcessModules *listHead = CreateProcessModules(m_processId, &count);
-            if (listHead == NULL)
-            {
-                TRACE("CreateProcessModules failed for pid %d\n", m_processId);
-                pe = ERROR_INVALID_PARAMETER;
-                goto exit;
-            }
+            goto exit;
+        }
 
-            for (ProcessModules *entry = listHead; entry != NULL; entry = entry->Next)
+        // Enumerate all the modules in the process and invoke the callback 
+        // for the coreclr module if found.
+        listHead = CreateProcessModules(m_processId, &count);
+        if (listHead == NULL)
+        {
+            TRACE("CreateProcessModules failed for pid %d\n", m_processId);
+            pe = ERROR_INVALID_PARAMETER;
+            goto exit;
+        }
+
+        for (ProcessModules *entry = listHead; entry != NULL; entry = entry->Next)
+        {
+            if (IsCoreClrModule(entry->Name))
             {
-                if (IsCoreClrModule(entry->Name))
+                PAL_CPP_TRY
                 {
-                    PAL_CPP_TRY
-                    {
-                        TRACE("InvokeStartupCallback executing callback %p %s\n", entry->BaseAddress, entry->Name);
-                        m_callback(entry->Name, entry->BaseAddress, m_parameter);
-                    }
-                        PAL_CPP_CATCH_ALL
-                    {
-                    }
-                    PAL_CPP_ENDTRY
-
-                        // Currently only the first coreclr module in a process is supported
-                        break;
+                    TRACE("InvokeStartupCallback executing callback %p %s\n", entry->BaseAddress, entry->Name);
+                    m_callback(entry->Name, entry->BaseAddress, m_parameter);
                 }
-            }
+                PAL_CPP_CATCH_ALL
+                {
+                }
+                PAL_CPP_ENDTRY
 
-        exit:
-            if (listHead != NULL)
-            {
-                DestroyProcessModules(listHead);
+                // Currently only the first coreclr module in a process is supported
+                break;
             }
         }
 
+    exit:
+        // Wake up the runtime 
+        if (sem_post(m_continueSem) != 0)
+        {
+            ASSERT("sem_post(continueSem) failed: errno is %d (%s)\n", errno, strerror(errno));
+        }
+        if (listHead != NULL)
+        {
+            DestroyProcessModules(listHead);
+        }
         return pe;
     }
 
     void StartupHelperThread()
     {
-        char continueSemName[CLR_SEM_MAX_NAMELEN];
-        sem_t *continueSem = SEM_FAILED;
         PAL_ERROR pe = NO_ERROR;
 
-        sprintf_s(continueSemName,
-                  sizeof(continueSemName),
-                  RuntimeContinueSemaphoreName,
-                  HashSemaphoreName(m_processId,
-                                    m_processIdDisambiguationKey));
-
-        TRACE("StartupHelperThread continue sem '%s'\n", continueSemName);
-
-        // Does the continue semaphore exists? If it does, the runtime is ready to be debugged.
-        continueSem = sem_open(continueSemName, 0);
-        if (continueSem != SEM_FAILED)
+        if (IsCoreClrProcessReady())
         {
-            TRACE("StartupHelperThread continue sem exists - invoking callback\n");
             pe = InvokeStartupCallback();
         }
-        else if (errno == ENOENT)
-        {
+        else {
+            TRACE("sem_wait(startup)\n");
+
             // Wait until the coreclr runtime (debuggee) starts up
             if (sem_wait(m_startupSem) == 0)
             {
-                // The continue semaphore should exists now and is needed to wake up the runtimes below
-                continueSem = sem_open(continueSemName, 0);
-                if (continueSem != SEM_FAILED) 
-                {
-                    TRACE("StartupHelperThread continue sem exists after wait - invoking callback\n");
-                    pe = InvokeStartupCallback();
-                }
-                else
-                {
-                    TRACE("sem_open(continue) failed: errno is %d (%s)\n", errno, strerror(errno));
-                    pe = GetSemError();
-                }
+                pe = InvokeStartupCallback();
             }
-            else 
+            else
             {
                 TRACE("sem_wait(startup) failed: errno is %d (%s)\n", errno, strerror(errno));
                 pe = GetSemError();
             }
         }
-        else
-        {
-            pe = GetSemError();
-        }
-
-        // Wake up the runtime even on error and cancelation
-        if (continueSem != SEM_FAILED)
-        {
-            if (sem_post(continueSem) != 0)
-            {
-                TRACE("sem_post(continueSem) failed: errno is %d (%s)\n", errno, strerror(errno));
-                pe = GetSemError();
-            }
-
-            sem_close(continueSem);
-        }
 
         // Invoke the callback on errors
         if (pe != NO_ERROR && !m_canceled)
@@ -1845,35 +1886,19 @@ PALAPI
 PAL_NotifyRuntimeStarted()
 {
     char startupSemName[CLR_SEM_MAX_NAMELEN];
+    char continueSemName[CLR_SEM_MAX_NAMELEN];
     sem_t *startupSem = SEM_FAILED;
+    sem_t *continueSem = SEM_FAILED;
     BOOL result = TRUE;
 
     UINT64 processIdDisambiguationKey = 0;
     GetProcessIdDisambiguationKey(gPID, &processIdDisambiguationKey);
 
     sprintf_s(startupSemName, sizeof(startupSemName), RuntimeStartupSemaphoreName, HashSemaphoreName(gPID, processIdDisambiguationKey));
-    sprintf_s(g_continueSemName, sizeof(g_continueSemName), RuntimeOldContinueSemaphoreName, HashSemaphoreName(gPID, processIdDisambiguationKey));
+    sprintf_s(continueSemName, sizeof(continueSemName), RuntimeContinueSemaphoreName, HashSemaphoreName(gPID, processIdDisambiguationKey));
 
-    TRACE("PAL_NotifyRuntimeStarted opening continue (old) '%s' startup '%s'\n", g_continueSemName, startupSemName);
+    TRACE("PAL_NotifyRuntimeStarted opening continue '%s' startup '%s'\n", continueSemName, startupSemName);
 
-    // For backwards compatibility with RC2 (see issue #4410) first OPEN the continue semaphore with the old name "clrcoXXXX".
-    g_continueSem = sem_open(g_continueSemName, 0);
-    if (g_continueSem == SEM_FAILED)
-    {
-        // Create the new continue semaphore name "clrctXXXX"
-        sprintf_s(g_continueSemName, sizeof(g_continueSemName), RuntimeContinueSemaphoreName, HashSemaphoreName(gPID, processIdDisambiguationKey));
-
-        TRACE("PAL_NotifyRuntimeStarted creating continue '%s'\n", g_continueSemName);
-
-        // Create the continue semaphore. This tells dbgshim that coreclr is initialized and ready.
-        g_continueSem = sem_open(g_continueSemName, O_CREAT | O_EXCL, S_IRWXU, 0);
-        if (g_continueSem == SEM_FAILED)
-        {
-            ASSERT("sem_open(%s) failed: %d (%s)\n", g_continueSemName, errno, strerror(errno));
-            result = FALSE;
-            goto exit;
-        }
-    }
 
     // Open the debugger startup semaphore. If it doesn't exists, then we do nothing and
     // the function is successful.
@@ -1884,6 +1909,14 @@ PAL_NotifyRuntimeStarted()
         goto exit;
     }
 
+    continueSem = sem_open(continueSemName, 0);
+    if (continueSem == SEM_FAILED)
+    {
+        ASSERT("sem_open(%s) failed: %d (%s)\n", continueSemName, errno, strerror(errno));
+        result = FALSE;
+        goto exit;
+    }
+
     // Wake up the debugger waiting for startup
     if (sem_post(startupSem) != 0)
     {
@@ -1893,7 +1926,7 @@ PAL_NotifyRuntimeStarted()
     }
 
     // Now wait until the debugger's runtime startup notification is finished
-    if (sem_wait(g_continueSem) != 0)
+    if (sem_wait(continueSem) != 0)
     {
         ASSERT("sem_wait(continueSem) failed: errno is %d (%s)\n", errno, strerror(errno));
         result = FALSE;
@@ -1905,41 +1938,14 @@ exit:
     {
         sem_close(startupSem);
     }
+    if (continueSem != SEM_FAILED)
+    {
+        sem_close(continueSem);
+    }
     return result;
 }
 
 /*++
-    PAL_CleanupTargetProcess
-
-    Cleanup the target process's name continue semaphore
-    on the debugger side when the debugger detects the
-    process termination.
-
-Parameters:
-    pid - process id
-    disambiguationKey - key to make process id unique
-
-Return value:
-    None
---*/
-VOID
-PALAPI
-PAL_CleanupTargetProcess(
-    IN int pid,
-    IN UINT64 disambiguationKey)
-{
-    char continueSemName[NAME_MAX - 4];
-
-    sprintf_s(continueSemName,
-              sizeof(continueSemName),
-              RuntimeContinueSemaphoreName,
-              pid,
-              disambiguationKey);
-
-    sem_unlink(continueSemName);
-}
-
-/*++
  Function:
   GetProcessIdDisambiguationKey
 
@@ -2012,7 +2018,7 @@ GetProcessIdDisambiguationKey(DWORD processId, UINT64 *disambiguationKey)
 
     return TRUE;
 
-#elif defined(HAVE_PROCFS_CTL)
+#elif HAVE_PROCFS_STAT
 
     // Here we read /proc/<pid>/stat file to get the start time for the process.
     // We return this value (which is expressed in jiffies since boot time).
@@ -2066,12 +2072,34 @@ GetProcessIdDisambiguationKey(DWORD processId, UINT64 *disambiguationKey)
 
 #else
     // If this is not OS X and we don't have /proc, we just return FALSE.
-    WARN(!"GetProcessIdDisambiguationKey was called but is not implemented on this platform!");
+    WARN("GetProcessIdDisambiguationKey was called but is not implemented on this platform!");
     return FALSE;
 #endif
 }
 
 /*++
+ Function:
+  PAL_GetTransportPipeName 
+
+  Builds the transport pipe names from the process id.
+--*/
+void 
+PALAPI
+PAL_GetTransportPipeName(char *name, DWORD id, const char *suffix)
+{
+    UINT64 disambiguationKey = 0;
+    BOOL ret = GetProcessIdDisambiguationKey(id, &disambiguationKey);
+
+    // If GetProcessIdDisambiguationKey failed for some reason, it should set the value 
+    // to 0. We expect that anyone else making the pipe name will also fail and thus will
+    // also try to use 0 as the value.
+    _ASSERTE(ret == TRUE || disambiguationKey == 0);
+
+    int chars = _snprintf(name, MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH, PipeNameFormat, id, disambiguationKey, suffix);
+    _ASSERTE(chars > 0 && chars < MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH);
+}
+
+/*++
 Function:
   GetProcessTimes
 
@@ -2698,8 +2726,9 @@ CreateProcessModules(
 
     free(line); // We didn't allocate line, but as per contract of getline we should free it
     pclose(vmmapFile);
+exit:
 
-#elif defined(HAVE_PROCFS_CTL)
+#elif HAVE_PROCFS_MAPS 
 
     // Here we read /proc/<pid>/maps file in order to parse it and figure out what it says 
     // about a library we are looking for. This file looks something like this:
@@ -2778,10 +2807,11 @@ CreateProcessModules(
 
     free(line); // We didn't allocate line, but as per contract of getline we should free it
     fclose(mapsFile);
+exit:
+
 #else
     _ASSERTE(!"Not implemented on this platform");
 #endif
-exit:
     return listHead;
 }
 
@@ -2825,14 +2855,6 @@ void PROCNotifyProcessShutdown()
     {
         callback();
     }
-
-    // Cleanup the name continue semaphore on exit and abormal terminatation
-    sem_t *continueSem = InterlockedExchangePointer(&g_continueSem, SEM_FAILED);
-    if (continueSem != SEM_FAILED)
-    {
-        sem_close(continueSem);
-        sem_unlink(g_continueSemName);
-    }
 }
 
 /*++
index 242d910..b3ca370 100644 (file)
@@ -117,3 +117,7 @@ file_io/deletefilew/test3
 =======================================
 No code in Rotor depends on DeleteFile[A/W] failing on readonly files so we 
 don't need to exactly emulate this feature of the Win32 filesystems on FreeBSD.
+
+filemapping_memmgt\MapViewOfFile\test1
+=======================================
+Refer this github issue https://github.com/dotnet/coreclr/issues/5176
\ No newline at end of file
index 5bc2e1e..533454c 100644 (file)
@@ -20,6 +20,7 @@ add_subdirectory(errno)
 add_subdirectory(exit)
 add_subdirectory(exp)
 add_subdirectory(fabs)
+add_subdirectory(fabsf)
 add_subdirectory(fclose)
 add_subdirectory(feof)
 add_subdirectory(ferror)
@@ -27,6 +28,7 @@ add_subdirectory(fflush)
 add_subdirectory(fgets)
 add_subdirectory(floor)
 add_subdirectory(fmod)
+add_subdirectory(fmodf)
 add_subdirectory(fopen)
 add_subdirectory(fprintf)
 add_subdirectory(fputs)
@@ -62,6 +64,7 @@ add_subdirectory(memcpy)
 add_subdirectory(memmove)
 add_subdirectory(memset)
 add_subdirectory(modf)
+add_subdirectory(modff)
 add_subdirectory(pow)
 add_subdirectory(printf)
 add_subdirectory(qsort)
@@ -157,4 +160,3 @@ add_subdirectory(_wmakepath)
 add_subdirectory(_wsplitpath)
 add_subdirectory(_wtoi)
 add_subdirectory(__iscsym)
-
index d832a91..c815055 100644 (file)
 **          of floating point numbers (NaN, -Infinity, Infinity,
 **          finite nonzero, unnormalized, 0, and -0)
 **
-**
 **==========================================================================*/
 
-
 #include <palsuite.h>
 
 /*
@@ -37,86 +35,85 @@ If E=0 and F is zero and S is 0, then V=0
 
 */
 
+#define TO_DOUBLE(x)    (*((double*)((void*)&x)))
+
 int __cdecl main(int argc, char **argv)
 {
     /*non-finite numbers*/
-    __int64 lnan =              0x7fffffffffffffff;
-    __int64 lnan2 =             0xffffffffffffffff;
-    __int64 lneginf =           0xfff0000000000000;
-    __int64 linf =              0x7ff0000000000000;
+    UINT64 lsnan =              UI64(0xffffffffffffffff);
+    UINT64 lqnan =              UI64(0x7fffffffffffffff);
+    UINT64 lneginf =            UI64(0xfff0000000000000);
+    UINT64 lposinf =            UI64(0x7ff0000000000000);
+
+    double snan =               TO_DOUBLE(lsnan);
+    double qnan =               TO_DOUBLE(lqnan);
+    double neginf =             TO_DOUBLE(lneginf);
+    double posinf =             TO_DOUBLE(lposinf);
 
     /*finite numbers*/
-    __int64 lUnnormalized =     0x000fffffffffffff;
-    __int64 lNegUnnormalized =  0x800fffffffffffff;
-    __int64 lNegZero =          0x8000000000000000;
-
-    double nan = *(double *)&lnan;
-    double nan2 = *(double *)&lnan2;
-    double neginf = *(double *)&lneginf;
-    double inf = *(double *)&linf;
-    double unnormalized = *(double *)&lUnnormalized;
-    double negUnnormalized = *(double *)&lNegUnnormalized;
-    double negZero = *(double *)&lNegZero;
-    double pos = 123.456;
-    double neg = -123.456;
+    UINT64 lnegunnormalized =   UI64(0x800fffffffffffff);
+    UINT64 lposunnormalized =   UI64(0x000fffffffffffff);
+    UINT64 lnegzero =           UI64(0x8000000000000000);
+
+    double negunnormalized =    TO_DOUBLE(lnegunnormalized);
+    double posunnormalized =    TO_DOUBLE(lposunnormalized);
+    double negzero =            TO_DOUBLE(lnegzero);
 
     /*
      * Initialize the PAL and return FAIL if this fails
      */
-    if (0 != (PAL_Initialize(argc, argv)))
+    if (PAL_Initialize(argc, argv) != 0)
     {
         return FAIL;
     }
 
     /*non-finite numbers*/
-    if (_finite(nan) || _finite(nan2))
+    if (_finite(snan) || _finite(qnan))
     {
-        Fail ("_finite() found NAN to be finite.\n");
+        Fail("_finite() found NAN to be finite.\n");
     }
+
     if (_finite(neginf))
     {
-        Fail ("_finite() found negative infinity to be finite.\n");
+        Fail("_finite() found negative infinity to be finite.\n");
     }
-    if (_finite(inf))
+
+    if (_finite(posinf))
     {
-        Fail ("_finite() found infinity to be finite.\n");
+        Fail("_finite() found infinity to be finite.\n");
     }
 
-
     /*finite numbers*/
-    if (!_finite(unnormalized))
+    if (!_finite(negunnormalized))
     {
-        Fail ("_finite() found an unnormalized value to be infinite.\n");
+        Fail("_finite() found a negative unnormalized value to be infinite.\n");
     }
-    if (!_finite(negUnnormalized))
+
+    if (!_finite(posunnormalized))
     {
-        Fail ("_finite() found a negative unnormalized value to be infinite.\n");
+        Fail("_finite() found an unnormalized value to be infinite.\n");
     }
-    if (!_finite((double)0))
+
+    if (!_finite(negzero))
     {
-        Fail ("_finite found zero to be infinite.\n");
+        Fail("_finite() found negative zero to be infinite.\n");
     }
-    if (!_finite(negZero))
+
+    if (!_finite(+0.0))
     {
-        Fail ("_finite() found negative zero to be infinite.\n");
+        Fail("_finite() found zero to be infinite.\n");
     }
-    if (!_finite(pos))
+
+    if (!_finite(-123.456))
     {
-        Fail ("_finite() found %f to be infinite.\n", pos);
+        Fail("_finite() found %f to be infinite.\n", -123.456);
     }
-    if (!_finite(neg))
+
+    if (!_finite(+123.456))
     {
-        Fail ("_finite() found %f to be infinite.\n", neg);
+        Fail("_finite() found %f to be infinite.\n", +123.456);
     }
+
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
index cb2c6c3..cec0f8a 100644 (file)
@@ -9,6 +9,5 @@ Name = Positive Test for _finite
 TYPE = DEFAULT
 EXE1 = test1
 Description
-=Checks that _finite correctly classifies all types of floating 
-=point numbers
-=(NaN, -Infinity, Infinity, finite nonzero, unnormalized, 0, and -0).
+= Checks that _finite correctly classifies all types of floating point
+= numbers (NaN, -Infinity, Infinity, finite nonzero, unnormalized, 0, and -0).
index 08664d7..d793c9b 100644 (file)
 ** the fraction to positive and negative, at which point it should return
 ** the true value. 
 **
-**
 **==========================================================================*/
 
 #include <palsuite.h>
 
-#define TO_DOUBLE(a) (*(double*)&a)
-#define TO_I64(a) (*(INT64*) &a)
+#define TO_DOUBLE(x)    (*((double*)((void*)&x)))
+#define TO_I64(x)       (*((INT64*)((void*)&x)))
 
 /*
  * NaN: any double with maximum exponent (0x7ff) and non-zero fraction
  */
 int __cdecl main(int argc, char *argv[])
 {
-    UINT64 PosInf=0;
-    UINT64 NegInf=0;
-    UINT64 val=0;
-
     /*
      * Initialize the PAL and return FAIL if this fails
      */
-    if (0 != (PAL_Initialize(argc, argv)))
+    if (PAL_Initialize(argc, argv) != 0)
     {
         return FAIL;
     }
+
     /*
      * Try some trivial values
      */
-    if (_isnan(0))
+    if (_isnan(0.0))
     {
-        Fail ("_isnan() incorrectly identified %f as NaN!\n", 0);
+        Fail("_isnan() incorrectly identified %f as NaN!\n", 0.0);
     }
-    if (_isnan(1.2423456))
+
+    if (_isnan(1.23456))
     {
-        Fail ("_isnan() incorrectly identified %f as NaN!\n", 0);
+        Fail("_isnan() incorrectly identified %f as NaN!\n", 1.234567);
     }
-    if (_isnan(42))
+
+    if (_isnan(42.0))
     {
-        Fail ("_isnan() incorrectly identified %f as NaN!\n", 0);
+        Fail("_isnan() incorrectly identified %f as NaN!\n", 42.0);
     }
 
-
-    PosInf = 0x7ff00000;
-    PosInf <<=32;
-
-    NegInf = 0xfff00000;
-    NegInf <<=32;
+    UINT64 lneginf =            UI64(0xfff0000000000000);
+    UINT64 lposinf =            UI64(0x7ff0000000000000);
+    
+    double neginf =             TO_DOUBLE(lneginf);
+    double posinf =             TO_DOUBLE(lposinf);
 
     /*
      * Try positive and negative infinity
      */
-    if (_isnan(TO_DOUBLE(PosInf)))
+    if (_isnan(neginf))
     {
-        Fail ("_isnan() incorrectly identified %I64x as NaN!\n", PosInf);
+        Fail("_isnan() incorrectly identified negative infinity as NaN!\n");
     }
 
-    if (_isnan(TO_DOUBLE(NegInf)))
+    if (_isnan(posinf))
     {
-        Fail ("_isnan() incorrectly identified %I64x as NaN!\n", NegInf);
+        Fail("_isnan() incorrectly identified infinity as NaN!\n");
     }
 
     /*
      * Try setting the least significant bit of the fraction,
      * positive and negative
      */
-    val = PosInf + 1;
-    if (!_isnan(TO_DOUBLE(val)))
+    UINT64 lsnan =              UI64(0xfff0000000000001);
+    double snan =               TO_DOUBLE(lsnan);
+    
+    if (!_isnan(snan))
     {
-        Fail ("_isnan() failed to identify %I64x as NaN!\n", val);
+        Fail("_isnan() failed to identify %I64x as NaN!\n", lsnan);
     }
 
-    val = NegInf + 1;
-    if (!_isnan(TO_DOUBLE(val)))
+    UINT64 lqnan =              UI64(0x7ff0000000000001);
+    double qnan =               TO_DOUBLE(lqnan);
+    
+    if (!_isnan(qnan))
     {
-        Fail ("_isnan() failed to identify %I64x as NaN!\n", val);
+        Fail("_isnan() failed to identify %I64x as NaN!\n", lqnan);
     }
 
-
     /*
      * Try setting the most significant bit of the fraction,
      * positive and negative
      */
-    val = 0x7ff80000;
-    val <<=32;
-    if (!_isnan(TO_DOUBLE(val)))
+    lsnan =                     UI64(0xfff8000000000000);
+    snan =                      TO_DOUBLE(lsnan);
+
+    if (!_isnan(snan))
     {
-        Fail ("_isnan() failed to identify %I64x as NaN!\n", val);
+        Fail ("_isnan() failed to identify %I64x as NaN!\n", lsnan);
     }
 
-    val = 0xfff80000;
-    val <<=32;
-    if (!_isnan(TO_DOUBLE(val)))
+    lqnan =                     UI64(0x7ff8000000000000);
+    qnan =                      TO_DOUBLE(lqnan);
+
+    if (!_isnan(qnan))
     {
-        Fail ("_isnan() failed to identify %I64x as NaN!\n", val);
+        Fail ("_isnan() failed to identify %I64x as NaN!\n", lqnan);
     }
 
     PAL_Terminate();
-
     return PASS;
 }
-
index 6c38859..c6ed069 100644 (file)
 **
 ** Source: test1.c
 **
-** Purpose: Test to ensure that acos returns correct values.
+** Purpose: Test to ensure that acos return the correct values
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-**               _finite
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-/* Error acceptance level to the 7th decimal */
-#define DELTA 0.0000001 
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
- * main
- * 
- * executable entry point
+ * validate
+ *
+ * test validation function
  */
-INT __cdecl main(INT argc, CHAR **argv)
+void __cdecl validate(double value, double expected, double variance)
 {
-    double pi = 3.1415926535;
-    int i;
+    double result = acos(value);
 
-    struct test tests[] = 
-    {
-        /* Value        test result */
-        { 1,                0 },
-        { 0.9,              0.451026811796 },
-        { 0.8,              0.643501108793 },
-        { 0.7,              0.795398830184 },
-        { 0.6,              0.927295218002 },
-        { 0.5,              1.047197551197 },
-        { 0.4,              1.159279480727 },
-        { 0.3,              1.266103672779 },
-        { 0.2,              1.369438406005 },
-        { 0.1,              1.470628905633 },
-        { 0,                pi/2.0 },
-        { -0.1,             1.670963747956 },
-        { -0.2,             1.772154247585 },
-        { -0.3,             1.875488980810 },
-        { -0.4,             1.982313172862 },
-        { -0.5,             2.094395102393 },
-        { -0.6,             2.214297435588 },
-        { -0.7,             2.346193823406 },
-        { -0.8,             2.498091544797 },
-        { -0.9,             2.690565841794 },
-        { -1,              pi }
-    };
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-    double outofrange[] =
+    if (delta > variance)
     {
-        -864278.51, -1000.2, -2, 2, 10, 100, 1234567.8, 1.7e308
-    };
+        Fail("acos(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
 
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = acos(value);
 
-    /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (!_isnan(result))
     {
-           return (FAIL);
+        Fail("acos(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
     }
+}
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
+    struct test tests[] = 
     {
-        double result;
-        double testDelta;
-
-        result = acos( tests[i].value );
+        /* value                   expected                variance */
+        { -1,                      3.1415926535897932,     PAL_EPSILON * 10 },      // expected:  pi
+        { -0.91173391478696510,    2.7182818284590452,     PAL_EPSILON * 10 },      // expected:  e
+        { -0.66820151019031295,    2.3025850929940457,     PAL_EPSILON * 10 },      // expected:  ln(10)
+        {  0,                      1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
+        {  0.12775121753523991,    1.4426950408889634,     PAL_EPSILON * 10 },      // expected:  log2(e)
+        {  0.15594369476537447,    1.4142135623730950,     PAL_EPSILON * 10 },      // expected:  sqrt(2)
+        {  0.42812514788535792,    1.1283791670955126,     PAL_EPSILON * 10 },      // expected:  2 / sqrt(pi)
+        {  0.54030230586813972,    1,                      PAL_EPSILON * 10 },
+        {  0.70710678118654752,    0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4,         value:  1 / sqrt(2)
+        {  0.76024459707563015,    0.70710678118654752,    PAL_EPSILON },           // expected:  1 / sqrt(2)
+        {  0.76923890136397213,    0.69314718055994531,    PAL_EPSILON },           // expected:  ln(2)
+        {  0.80410982822879171,    0.63661977236758134,    PAL_EPSILON },           // expected:  2 / pi
+        {  0.90716712923909839,    0.43429448190325183,    PAL_EPSILON },           // expected:  log10(e)
+        {  0.94976571538163866,    0.31830988618379067,    PAL_EPSILON },           // expected:  1 / pi
+        {  1,                      0,                      PAL_EPSILON },
+    };
 
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "acos(%g) returned %20.10f"
-                  " when it should have returned %20.10f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(outofrange) / sizeof(double); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-
-        result = acos( outofrange[i] );
-
-        /* The test is valid when the function returns an infinite result */
-        if( _finite( result ) )
-        {
-            Fail( "acos(%g) returned %20.10f"
-                  " when it should have returned -1.#IND00000000",
-                  outofrange[i],
-                  result );
-        }
+        validate(tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
+    validate_isnan(PAL_POSINF);
 
     PAL_Terminate();
     return PASS;
index cfa70e7..4b43982 100644 (file)
@@ -12,6 +12,3 @@ Description
 = Passes a series of values to the acos() function,
 = checking each for the expected result. Also checks
 = for proper handling of out-of-range values.
-
-
-
index b772cc7..0a63356 100644 (file)
 **
 ** Source: test1.c
 **
-** Purpose: Test to ensure that asin returns correct values.
+** Purpose: Test to ensure that asin return the correct values
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-**               _finite
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = asin(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("asin(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = asin(value);
+
+    if (!_isnan(result))
+    {
+        Fail("asin(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning +INF
+ */
+void __cdecl validate_isinf_positive(double value)
+{
+    double result = asin(value);
+
+    if (result != PAL_POSINF)
+    {
+        Fail("asin(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_POSINF);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 1,                pi/2.0 },
-        { 0.9,              1.119769514999 },
-        { 0.8,              0.927295218002 },
-        { 0.7,              0.775397496611 },
-        { 0.6,              0.643501108793 },
-        { 0.5,              0.523598775598 },
-        { 0.4,              0.411516846067 },
-        { 0.3,              0.304692654015 },
-        { 0.2,              0.201357920790 },
-        { 0.1,              0.100167421162 },
-        { 0,                0 },
-        { -0.1,             -0.100167421162 },
-        { -0.2,             -0.201357920790 },
-        { -0.3,             -0.304692654015 },
-        { -0.4,             -0.411516846067 },
-        { -0.5,             -0.523598775598 },
-        { -0.6,             -0.643501108793 },
-        { -0.7,             -0.775397496611 },
-        { -0.8,             -0.927295218002 },
-        { -0.9,             -1.119769514999 },
-        { -1,              -(pi/2.0) }
-    };
-    
-    double outofrange[] =
-    {
-        -864278.51, -1000.2, -2, 2, 10, 100, 1234567.8, 1.7e308
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.31296179620778659,    0.31830988618379067,    PAL_EPSILON },           // expected:  1 / pi
+        {  0.41078129050290870,    0.42331082513074800,    PAL_EPSILON },           // expected:  pi - e
+        {  0.42077048331375735,    0.43429448190325183,    PAL_EPSILON },           // expected:  log10(e)
+        {  0.59448076852482208,    0.63661977236758134,    PAL_EPSILON },           // expected:  2 / pi
+        {  0.63896127631363480,    0.69314718055994531,    PAL_EPSILON },           // expected:  ln(2)
+        {  0.64963693908006244,    0.70710678118654752,    PAL_EPSILON },           // expected:  1 / sqrt(2)
+        {  0.70710678118654752,    0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4,         value: 1 / sqrt(2)
+        {  0.74398033695749319,    0.83900756059574755,    PAL_EPSILON },           // expected:  pi - ln(10)
+        {  0.84147098480789651,    1,                      PAL_EPSILON * 10 },
+        {  0.90371945743584630,    1.1283791670955126,     PAL_EPSILON * 10 },      // expected:  2 / sqrt(pi)
+        {  0.98776594599273553,    1.4142135623730950,     PAL_EPSILON * 10 },      // expected:  sqrt(2)
+        {  0.99180624439366372,    1.4426950408889634,     PAL_EPSILON * 10 },      // expected:  log2(e)
+        {  1,                      1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
     };
-    
 
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
-    {
-           return (FAIL);
-    }
-
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    if (PAL_Initialize(argc, argv) != 0)
     {
-        double result;
-        double testDelta;
-
-        result = asin( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "asin(%g) returned %20.10f"
-                  " when it should have returned %20.10f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(outofrange) / sizeof(double); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-
-        result = asin( outofrange[i] );
-
-        /* The test is valid when the function returns an infinite result */
-        if( _finite( result ) )
-        {
-            Fail( "asin(%g) returned %20.10f"
-                  " when it should have returned -1.#IND00000000",
-                  outofrange[i],
-                  result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
     
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
+    validate_isnan(PAL_POSINF);
+
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index da3e0c2..fba9f95 100644 (file)
@@ -12,6 +12,3 @@ Description
 = Passes a series of values to the asin() function,
 = checking each for the expected result. Also checks
 = for proper handling of out-of-range values.
-
-
-
index 1f7d89c..6840d46 100644 (file)
 **
 ** Source: test1.c
 **
-** Purpose: Test to ensure that atan returns correct values.
+** Purpose: Test to ensure that atan return the correct values
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = atan(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("atan(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = atan(value);
+
+    if (!_isnan(result))
+    {
+        Fail("atan(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value                       test result */
-        { -1.7976931348623158e+307,         -(pi/2) },
-        { -25928.789941099276,     -1.570757759627 },
-        { -10162.054261909849,     -1.570697921495 },
-        { -7742.279976805932,      -1.570667165876 },
-        { -4027.241187780389,      -1.570548017858 },
-        { -2020.329477828303,      -1.570301358064 },
-        { -928.811975463118,       -1.569719683039 },
-        { -0.993835261086,         -0.782306273415 },
-        { -0.936490981780,         -0.752613986257 },
-        { -0.884395886105,         -0.724126849580 },
-        { -0.728537858211,         -0.629623252584 },
-        { -0.571733756523,         -0.519376146611 },
-        { -0.370342112491,         -0.354680802574 },
-        { -0.264778588214,         -0.258838835750 },
-        { -0.199255348369,         -0.196679446239 },
-        { -0.077700125126,         -0.077544322548 },
-        { -0.036713766900,         -0.036697284724 },
-        { 0,                        0},
-        { 0.284035767693,           0.276747134475 },
-        { 0.329264198737,           0.318083873607 },
-        { 0.332560197760,           0.321054571066 },
-        { 0.338206122013,           0.326129634676 },
-        { 0.421887874996,           0.399231699263 },
-        { 0.645222327342,           0.573009239835 },
-        { 0.648396252327,           0.575246979388 },
-        { 0.721427045503,           0.624962252188 },
-        { 0.723685415204,           0.626445984185 },
-        { 0.747856074709,           0.642127583998 },
-        { 401.853083895383,         1.568307860298 },
-        { 1579.672322763756,        1.570163284200 },
-        { 2540.318308053835,        1.570402675359 },
-        { 6105.661946470535,        1.570632544391 },
-        { 10221.297708059939,       1.570698491860 },
-        { 17155.000305185094,       1.570738034753 },
-        { 20600.197424237798,       1.570747783571 },
-        { 1.7976931348623158e+308,            pi/2 }
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.32951473309607836,    0.31830988618379067,    PAL_EPSILON },           // expected:  1 / pi
+        {  0.45054953406980750,    0.42331082513074800,    PAL_EPSILON },           // expected:  pi - e
+        {  0.46382906716062964,    0.43429448190325183,    PAL_EPSILON },           // expected:  log10(e)
+        {  0.73930295048660405,    0.63661977236758134,    PAL_EPSILON },           // expected:  2 / pi
+        {  0.83064087786078395,    0.69314718055994531,    PAL_EPSILON },           // expected:  ln(2)
+        {  0.85451043200960189,    0.70710678118654752,    PAL_EPSILON },           // expected:  1 / sqrt(2)
+        {  1,                      0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4
+        {  1.1134071468135374,     0.83900756059574755,    PAL_EPSILON },           // expected:  pi - ln(10)
+        {  1.5574077246549022,     1,                      PAL_EPSILON * 10 },
+        {  2.1108768356626451,     1.1283791670955126,     PAL_EPSILON * 10 },      // expected:  2 / sqrt(pi)
+        {  6.3341191670421916,     1.4142135623730950,     PAL_EPSILON * 10 },      // expected:  sqrt(2)
+        {  7.7635756709721848,     1.4426950408889634,     PAL_EPSILON * 10 },      // expected:  log2(e)
+        {  PAL_POSINF,             1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-        result = atan( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "atan(%g) returned %20.10f"
-                  " when it should have returned %20.10f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
 
+    validate_isnan(PAL_NAN);
+
     PAL_Terminate();
     return PASS;
 }
index 8f18fd5..8a181b8 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes a series of values to the atan() function,
 = checking each for the expected result.
-
-
-
index d28bbb9..15aa8f5 100644 (file)
 **          Tests with positive and negative values of x and y to ensure
 **          atan2 is returning results from the correct quadrant.
 **
-**
 **===================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 //Error acceptance level to the 7th decimal
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
 
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 struct test
 {
-    double x;
-    double y;
-    double result;  // expected result
+    double y;         /* second component of the value to test the function with */
+    double x;         /* first component of the value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
-
-void DoTest(double x, double y, double expected)
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double y, double x, double expected, double variance)
 {
-    double result;
-    double testDelta;
+    double result = atan2(y, x);
 
-    result = atan2(x, y);
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-    // The test is valid when the difference between the
-    // result and the expectation is less than DELTA
-    testDelta = fabs(result - expected);
-    if( testDelta >= DELTA )
+    if (delta > variance)
     {
-        Fail( "atan2(%g, %g) returned %g when it should have returned %g",
-                x, y, result, expected);
+        Fail("atan2(%g, %g) returned %20.17g when it should have returned %20.17g",
+             y, x, result, expected);
     }
 }
 
-int __cdecl main(int argc, char **argv)
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double y, double x)
 {
-    double pi = 3.1415926535;
-    int i;
+    double result = atan2(y, x);
 
+    if (!_isnan(result))
+    {
+        Fail("atan2(%g, %g) returned %20.17g when it should have returned %20.17g",
+             y, x, result, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
     struct test tests[] = 
     {
-        {0, 0, 0},
-        {0, 1, 0},
-        {0.104528463, 0.994521895, 0.104719755},
-        {0.207911691, 0.978147601, 0.20943951},
-        {0.309016994, 0.951056516, 0.314159265},
-        {0.406736643, 0.913545458, 0.41887902},
-        {0.5, 0.866025404, 0.523598776},
-        {0.587785252, 0.809016994, 0.628318531},
-        {0.669130606, 0.743144825, 0.733038286},
-        {0.743144825, 0.669130606, 0.837758041},
-        {0.809016994, 0.587785252, 0.942477796},
-        {0.866025404, 0.5, 1.04719755},
-        {0.913545458, 0.406736643, 1.15191731},
-        {0.951056516, 0.309016994, 1.25663706},
-        {0.978147601, 0.207911691, 1.36135682},
-        {0.994521895, 0.104528463, 1.46607657},
-        {1, 4.48965922e-011, 1.57079633},    
+        /* y                       x                       expected                variance */
+        {  0,                      PAL_POSINF,             0,                      PAL_EPSILON },
+        {  0,                      0,                      0,                      PAL_EPSILON },
+        {  0.31296179620778659,    0.94976571538163866,    0.31830988618379067,    PAL_EPSILON },           // expected:  1 / pi
+        {  0.42077048331375735,    0.90716712923909839,    0.43429448190325183,    PAL_EPSILON },           // expected:  log10(e)
+        {  0.59448076852482208,    0.80410982822879171,    0.63661977236758134,    PAL_EPSILON },           // expected:  2 / pi
+        {  0.63896127631363480,    0.76923890136397213,    0.69314718055994531,    PAL_EPSILON },           // expected:  ln(2)
+        {  0.64963693908006244,    0.76024459707563015,    0.70710678118654752,    PAL_EPSILON },           // expected:  1 / sqrt(2)
+        {  0.70710678118654752,    0.70710678118654752,    0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4,         value:  1 / sqrt(2)
+        {  1,                      1,                      0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4
+        {  PAL_POSINF,             PAL_POSINF,             0.78539816339744831,    PAL_EPSILON },           // expected:  pi / 4
+        {  0.84147098480789651,    0.54030230586813972,    1,                      PAL_EPSILON * 10 },
+        {  0.90371945743584630,    0.42812514788535792,    1.1283791670955126,     PAL_EPSILON * 10 },      // expected:  2 / sqrt(pi)
+        {  0.98776594599273553,    0.15594369476537447,    1.4142135623730950,     PAL_EPSILON * 10 },      // expected:  sqrt(2)
+        {  0.99180624439366372,    0.12775121753523991,    1.4426950408889634,     PAL_EPSILON * 10 },      // expected:  log2(e)
+        {  1,                      0,                      1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
+        {  PAL_POSINF,             0,                      1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
+        {  PAL_POSINF,             1,                      1.5707963267948966,     PAL_EPSILON * 10 },      // expected:  pi / 2
+        {  0.74398033695749319,   -0.66820151019031295,    2.3025850929940457,     PAL_EPSILON * 10 },      // expected:  ln(10)
+        {  0.41078129050290870,   -0.91173391478696510,    2.7182818284590452,     PAL_EPSILON * 10 },      // expected:  e
+        {  0,                     -1,                      3.1415926535897932,     PAL_EPSILON * 10 },      // expected:  pi
+        {  1,                      PAL_POSINF,             0,                      PAL_EPSILON },
     };
 
-
     if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        DoTest(tests[i].x, tests[i].y, tests[i].result);
-        DoTest(-tests[i].x, tests[i].y, -tests[i].result);
-        DoTest(tests[i].x, -tests[i].y, pi - tests[i].result);
-        DoTest(-tests[i].x, -tests[i].y, tests[i].result - pi);
+        const double pi = 3.1415926535897932;
+        
+        validate( tests[i].y,  tests[i].x,  tests[i].expected,      tests[i].variance);
+        validate(-tests[i].y,  tests[i].x, -tests[i].expected,      tests[i].variance);
+        validate( tests[i].y, -tests[i].x,  pi - tests[i].expected, tests[i].variance);
+        validate(-tests[i].y, -tests[i].x,  tests[i].expected - pi, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF, PAL_NAN);
+    validate_isnan(PAL_NAN,    PAL_NEGINF);
+    validate_isnan(PAL_NAN,    PAL_POSINF);
+    validate_isnan(PAL_POSINF, PAL_NAN);
+    
+    validate_isnan(PAL_NAN, -1);
+    validate_isnan(PAL_NAN, -0.0);
+    validate_isnan(PAL_NAN,  0);
+    validate_isnan(PAL_NAN,  1);
+    
+    validate_isnan(-1,   PAL_NAN);
+    validate_isnan(-0.0, PAL_NAN);
+    validate_isnan( 0,   PAL_NAN);
+    validate_isnan( 1,   PAL_NAN);
+    
+    validate_isnan(PAL_NAN, PAL_NAN);
 
     PAL_Terminate();
     return PASS;
index f554acf..e6e36e6 100644 (file)
 **          negative infinity.  Makes sure that calling ceil on NaN returns 
 **          NaN
 **
-**
 **==========================================================================*/
 
 #include <palsuite.h>
 
-typedef struct
-{
-    double value;
-    double ceilVal;
-} testCase;
-
-typedef struct
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
 {
-    INT64 value;
-    INT64 ceilVal;
-} extremeCase;
-
-#define INT64_TO_DOUBLE(a) (*(double*)&a)
-
-int __cdecl main(int argc, char *argv[])
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
+};
+
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
 {
-    INT64 NaN = I64(0x7ff8000000000000);
-    double value;
-    double ceilVal;
-    double ret;
-    int i;
-
-    testCase testCases[] =
-    {
-        {2.8, 3},
-        {-2.8, -2},
-        {5.5, 6},
-        {-5.5, -5},
-        {3, 3},
-        {-3, -3},
-        {0, 0},
-    };
-    extremeCase extremeCases[] =
-    {
-        /* Positive Infinity */
-        {I64(0x7ff0000000000000), I64(0x7ff0000000000000)},
-        /* Negative Infinitey */
-        {I64(0xfff0000000000000), I64(0xfff0000000000000)},   
-        /* Smallest possible +value */
-        {I64(0x0000000000000001), I64(0x3FF0000000000000)},   
-        /* Smallest possible -value */
-        {I64(0x8000000000000001), I64(0x8000000000000000)},   
-    };
-
+    double result = ceil(value);
 
     /*
-     * Initialize the PAL and return FAIL if this fails
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
      */
-    if (0 != (PAL_Initialize(argc, argv)))
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
     {
-        return FAIL;
+        Fail("ceil(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
     }
+}
 
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = ceil(value);
 
-    for (i=0; i<sizeof(testCases) / sizeof(testCase); i++)
+    if (!_isnan(result))
     {
-        ret = ceil(testCases[i].value);
-
-        if (ret != testCases[i].ceilVal)
-        {
-            Fail("Expected ceil(%g) to return %g, got %g\n", 
-                testCases[i].value, testCases[i].ceilVal, ret);
-        }
+        Fail("ceil(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
     }
-    
-    for (i=0; i<sizeof(extremeCases) / sizeof(extremeCase); i++)
-    {
-        value = INT64_TO_DOUBLE(extremeCases[i].value);
-        ceilVal = INT64_TO_DOUBLE(extremeCases[i].ceilVal);
+}
 
-        ret = ceil(value);
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char *argv[])
+{
+    struct test tests[] = 
+    {
+        /* value                   expected           variance */
+        {  0.31830988618379067,    1,                 PAL_EPSILON * 10 },     // value:  1 / pi
+        {  0.43429448190325183,    1,                 PAL_EPSILON * 10 },     // value:  log10(e)
+        {  0.63661977236758134,    1,                 PAL_EPSILON * 10 },     // value:  2 / pi
+        {  0.69314718055994531,    1,                 PAL_EPSILON * 10 },     // value:  ln(2)
+        {  0.70710678118654752,    1,                 PAL_EPSILON * 10 },     // value:  1 / sqrt(2)
+        {  0.78539816339744831,    1,                 PAL_EPSILON * 10 },     // value:  pi / 4
+        {  1.1283791670955126,     2,                 PAL_EPSILON * 10 },     // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     2,                 PAL_EPSILON * 10 },     // value:  sqrt(2)
+        {  1.4426950408889634,     2,                 PAL_EPSILON * 10 },     // value:  log2(e)
+        {  1.5707963267948966,     2,                 PAL_EPSILON * 10 },     // value:  pi / 2
+        {  2.3025850929940457,     3,                 PAL_EPSILON * 10 },     // value:  ln(10)
+        {  2.7182818284590452,     3,                 PAL_EPSILON * 10 },     // value:  e
+        {  3.1415926535897932,     4,                 PAL_EPSILON * 10 },     // value:  pi
+        {  PAL_POSINF,             PAL_POSINF,        0 }
+    };
 
-        if (ret != ceilVal)
-        {
-            Fail("Expected ceil(%g) to return %g, got %I64X\n", 
-                value, ceilVal, ret);
-        }
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
     }
-
-    /* Test how ceil handles NaN */
-    if (!_isnan(ceil(INT64_TO_DOUBLE(NaN))))
+    
+    validate( 0,    0, PAL_EPSILON);
+    validate(-0.0,  0, PAL_EPSILON);
+    
+    validate( 1,    1, PAL_EPSILON * 10);
+    validate(-1.0, -1, PAL_EPSILON * 10);
+    
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        Fail("Passing NaN to ceil did not return NaN!\n");
+        validate( tests[i].value, tests[i].expected,     tests[i].variance);
+        validate(-tests[i].value, 1 - tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
index 9dbc8c6..8c1c730 100644 (file)
 **               PAL_Terminate
 **               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = cos(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("cos(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = cos(value);
+
+    if (!_isnan(result))
+    {
+        Fail("cos(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0,                1 },
-        { pi/2.0,           0 },
-        { pi,              -1 },
-        { (3.0*pi) / 2.0,   0 },
-        { 2.0 * pi,         1 },
-        { 5.0*pi/2.0,       0 },
-        { 3.0*pi,          -1 },
-        { (7.0*pi) / 2.0,   0 },
-        { 4.0 * pi,         1 },
-        { 1.7e-12,          1 },
-        { 1.7e+12,          0.1745850 }
+        /* value                   expected                variance */
+        {  0,                      1,                      PAL_EPSILON * 10 },
+        {  0.31830988618379067,    0.94976571538163866,    PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.90716712923909839,    PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.80410982822879171,    PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.76923890136397213,    PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.76024459707563015,    PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.70710678118654752,    PAL_EPSILON },       // value:  pi / 4,         expected:  1 / sqrt(2)
+        {  1,                      0.54030230586813972,    PAL_EPSILON },
+        {  1.1283791670955126,     0.42812514788535792,    PAL_EPSILON },       // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     0.15594369476537447,    PAL_EPSILON },       // value:  sqrt(2)
+        {  1.4426950408889634,     0.12775121753523991,    PAL_EPSILON },       // value:  log2(e)
+        {  1.5707963267948966,     0,                      PAL_EPSILON },       // value:  pi / 2
+        {  2.3025850929940457,    -0.66820151019031295,    PAL_EPSILON },       // value:  ln(10)
+        {  2.7182818284590452,    -0.91173391478696510,    PAL_EPSILON },       // value:  e
+        {  3.1415926535897932,    -1,                      PAL_EPSILON * 10 },  // value:  pi
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-        result = cos( tests[i].value );
-
-        /* The test is valid when the difference between the */
-        /* result and the expectation is less than DELTA */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "cos(%g) returned %20.10g"
-                  " when it should have returned %20.10g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value, tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
+    validate_isnan(PAL_POSINF);
 
     PAL_Terminate();
     return PASS;
 }
-
-
index ed5fee3..9e57b7f 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to cos() a series of angle value, checking that
 = each one return the correct value.
-
-
-
index a0fb67b..40c2fca 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;      /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = cosh(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("cosh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning PAL_NAN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = cosh(value);
+
+    if (!_isnan(result))
+    {
+        Fail("cosh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0,                1 },
-        { pi/2.0,           2.5091785 },
-        { pi,               11.5919533 },
-        { (3.0*pi) / 2.0,   55.6633809 },
-        { 2.0 * pi,         267.7467614 },
-        { 5.0*pi/2.0,       1287.9854421 },
-        { 3.0*pi,           6195.8239426 },
-        { (7.0*pi) / 2.0,   29804.8707455 },
-        { 4.0 * pi,         143375.6565186 }
+        /* value                   expected               variance */
+        {  0,                      1,                     PAL_EPSILON * 10 },
+        {  0.31830988618379067,    1.0510897883672876,    PAL_EPSILON * 10 },   // value:  1 / pi
+        {  0.43429448190325183,    1.0957974645564909,    PAL_EPSILON * 10 },   // value:  log10(e)
+        {  0.63661977236758134,    1.2095794864199787,    PAL_EPSILON * 10 },   // value:  2 / pi
+        {  0.69314718055994531,    1.25,                  PAL_EPSILON * 10 },   // value:  ln(2)
+        {  0.70710678118654752,    1.2605918365213561,    PAL_EPSILON * 10 },   // value:  1 / sqrt(2)
+        {  0.78539816339744831,    1.3246090892520058,    PAL_EPSILON * 10 },   // value:  pi / 4
+        {  1,                      1.5430806348152438,    PAL_EPSILON * 10 },
+        {  1.1283791670955126,     1.7071001431069344,    PAL_EPSILON * 10 },   // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     2.1781835566085709,    PAL_EPSILON * 10 },   // value:  sqrt(2)
+        {  1.4426950408889634,     2.2341880974508023,    PAL_EPSILON * 10 },   // value:  log2(e)
+        {  1.5707963267948966,     2.5091784786580568,    PAL_EPSILON * 10 },   // value:  pi / 2
+        {  2.3025850929940457,     5.05,                  PAL_EPSILON * 10 },   // value:  ln(10)
+        {  2.7182818284590452,     7.6101251386622884,    PAL_EPSILON * 10 },   // value:  e
+        {  3.1415926535897932,     11.591953275521521,    PAL_EPSILON * 100 },  // value:  pi
+        {  PAL_POSINF,             PAL_POSINF,            0 },
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-
-        result = cosh( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "cosh(%g) returned %g"
-                  " when it should have returned %g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value, tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 39f932a..1315122 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to cosh() a series of angle value, checking that
 = each one return to correct value.
-
-
-
index 1962ade..5e1ef7f 100644 (file)
@@ -1,6 +1,3 @@
 cmake_minimum_required(VERSION 2.8.12.2)
 
 add_subdirectory(test1)
-add_subdirectory(test2)
-add_subdirectory(test3)
-
index 67de564..20e071a 100644 (file)
 **
 ** Purpose: Tests exp with a normal set of values.
 **
-**
 **===================================================================*/
 
 #include <palsuite.h>
 
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
 struct test
 {
-    double value;
-    double result;
-    double delta;
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = exp(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-int __cdecl main(int argc, char **argv)
-{    
-    double value;
-    double testDelta;
-    int i;
+    if (delta > variance)
+    {
+        Fail("exp(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
 
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = exp(value);
+
+    if (!_isnan(result))
+    {
+        Fail("exp(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
     struct test tests[] = 
     {
-        {0, 1, 1e-7},
-        {0.5, 1.64872127, 1e-7},
-        {-0.5, 0.60653066, 1e-7},
-        {1, 2.71828183, 1e-7},
-        {-1, 0.367879441, 1e-7},
-        {10, 2.202646579481e+004, 1e-4},
-        {-10, 4.53999298e-005, 1e-13},
-
-        {600, 3.7730203009299397e+260, 1e+252},
-        {-600, 2.6503965530043108e-261, 1e-269}
+        /* value                   expected                 variance */
+        { PAL_NEGINF,              0,                       PAL_EPSILON },
+        { -3.1415926535897932,     0.043213918263772250,    PAL_EPSILON / 10 },   // value: -(pi)
+        { -2.7182818284590452,     0.065988035845312537,    PAL_EPSILON / 10 },   // value: -(e)
+        { -2.3025850929940457,     0.1,                     PAL_EPSILON },        // value: -(ln(10))
+        { -1.5707963267948966,     0.20787957635076191,     PAL_EPSILON },        // value: -(pi / 2)
+        { -1.4426950408889634,     0.23629008834452270,     PAL_EPSILON },        // value: -(log2(e))
+        { -1.4142135623730950,     0.24311673443421421,     PAL_EPSILON },        // value: -(sqrt(2))
+        { -1.1283791670955126,     0.32355726390307110,     PAL_EPSILON },        // value: -(2 / sqrt(pi))
+        { -1,                      0.36787944117144232,     PAL_EPSILON },        // value: -(1)
+        { -0.78539816339744831,    0.45593812776599624,     PAL_EPSILON },        // value: -(pi / 4)
+        { -0.70710678118654752,    0.49306869139523979,     PAL_EPSILON },        // value: -(1 / sqrt(2))
+        { -0.69314718055994531,    0.5,                     PAL_EPSILON },        // value: -(ln(2))
+        { -0.63661977236758134,    0.52907780826773535,     PAL_EPSILON },        // value: -(2 / pi)
+        { -0.43429448190325183,    0.64772148514180065,     PAL_EPSILON },        // value: -(log10(e))
+        { -0.31830988618379067,    0.72737734929521647,     PAL_EPSILON },        // value: -(1 / pi)
+        {  0,                      1,                       PAL_EPSILON * 10 },
+        {  0.31830988618379067,    1.3748022274393586,      PAL_EPSILON * 10 },   // value:  1 / pi
+        {  0.43429448190325183,    1.5438734439711811,      PAL_EPSILON * 10 },   // value:  log10(e)
+        {  0.63661977236758134,    1.8900811645722220,      PAL_EPSILON * 10 },   // value:  2 / pi
+        {  0.69314718055994531,    2,                       PAL_EPSILON * 10 },   // value:  ln(2)
+        {  0.70710678118654752,    2.0281149816474725,      PAL_EPSILON * 10 },   // value:  1 / sqrt(2)
+        {  0.78539816339744831,    2.1932800507380155,      PAL_EPSILON * 10 },   // value:  pi / 4
+        {  1,                      2.7182818284590452,      PAL_EPSILON * 10 },   //                           expected: e
+        {  1.1283791670955126,     3.0906430223107976,      PAL_EPSILON * 10 },   // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     4.1132503787829275,      PAL_EPSILON * 10 },   // value:  sqrt(2)
+        {  1.4426950408889634,     4.2320861065570819,      PAL_EPSILON * 10 },   // value:  log2(e)
+        {  1.5707963267948966,     4.8104773809653517,      PAL_EPSILON * 10 },   // value:  pi / 2
+        {  2.3025850929940457,     10,                      PAL_EPSILON * 100 },  // value:  ln(10)
+        {  2.7182818284590452,     15.154262241479264,      PAL_EPSILON * 100 },  // value:  e
+        {  3.1415926535897932,     23.140692632779269,      PAL_EPSILON * 100 },  // value:  pi
+        {  PAL_POSINF,             PAL_POSINF,              0 },
     };
 
-
     if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        value = exp(tests[i].value);
-
-        testDelta = fabs(value - tests[i].result);
-        if( testDelta >= tests[i].delta )
-        {
-            Fail("exp(%g) returned %g when it should have returned %g\n",
-                    tests[i].value, value, tests[i].result);
-        }    
+        validate(tests[i].value, tests[i].expected, tests[i].variance);
     }
 
+    validate_isnan(PAL_NAN);
+
     PAL_Terminate();
     return PASS;
 }
diff --git a/src/pal/tests/palsuite/c_runtime/exp/test2/test2.c b/src/pal/tests/palsuite/c_runtime/exp/test2/test2.c
deleted file mode 100644 (file)
index 5cfaa78..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*=====================================================================
-**
-** Source:  test1.c
-**
-** Purpose: Tests that exp handles underflows, overflows, and NaNs
-**          corectly.
-**
-**
-**===================================================================*/
-
-#include <palsuite.h>
-
-int __cdecl main(int argc, char **argv)
-{
-    double zero = 0.0;
-    double PosInf = 1.0 / zero;
-    double NaN = 0.0 / zero;
-    // Force 'value' to be converted to a double to avoid
-    // using the internal precision of the FPU for comparisons.
-    volatile double value;
-
-    if (PAL_Initialize(argc, argv) != 0)
-    {
-           return FAIL;
-    }
-
-    /* Test overflows give PosInf */
-    value = exp(800.0);
-    if (value != PosInf)
-    {
-        Fail( "exp(%g) returned %g when it should have returned %g\n",
-                    800.0, value, PosInf);
-    }
-
-    value = exp(PosInf);
-    if (value != PosInf)
-    {
-        Fail( "exp(%g) returned %g when it should have returned %g\n",
-            PosInf, value, PosInf);
-    }
-
-    /* Test underflows give 0 */
-    value = exp(-800);
-    if (value != 0)
-    {
-        Fail( "exp(%g) returned %g when it should have returned %g\n",
-                    -800.0, value, 0.0);
-    }    
-
-    /* Test that a NaN as input gives a NaN */
-    value = exp(NaN);
-    if (_isnan(value) == 0)
-    {
-        Fail( "exp( NaN ) returned %g when it should have returned NaN\n", 
-            value);
-    }
-
-    PAL_Terminate();
-    return PASS;
-}
diff --git a/src/pal/tests/palsuite/c_runtime/exp/test3/test3.c b/src/pal/tests/palsuite/c_runtime/exp/test3/test3.c
deleted file mode 100644 (file)
index 0efd15e..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*=============================================================================
-**
-** Source: test3.c
-**
-** Purpose: Test to ensure that exp returns correct values.
-** 
-** Dependencies: PAL_Initialize
-**               PAL_Terminate
-**                              Fail
-**               fabs
-**               _finite
-**               _isnan
-** 
-
-**
-**===========================================================================*/
-
-#include <palsuite.h>
-
-#define DELTA 0.0000001  /* Error acceptance level to the 7th decimal */
-
-/**
- * Helper test structure
- */
-struct test
-{
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
-};
-
-/**
- * main
- * 
- * executable entry point
- */
-INT __cdecl main(INT argc, CHAR **argv)
-{
-    int i;
-    double result;
-
-    struct test tests[] = 
-    {
-        /* Value        test result  */
-        { 0.100000000000, 1.105170918076 },
-        { 1.000000000000, 2.718281828459 },
-        { 2.400000000000, 11.023176380642 },
-        { 3.750000000000, 42.521082000063 },
-        { 7.630000000000, 2059.050019837344 },
-        { 10.000000000000, 22026.465794806718 },
-        { 13.260000000000, 573779.238840227250 },
-        { 18.100000000000, 72565488.372322351000 },
-        { 25.000000000000, 72004899337.385880000000 },
-        { 29.310000000000, 5360079912775.353500000000 }
-    };
-
-    double infinite[] =
-    {
-        2215.8, 20554.1
-    };
-
-
-    /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
-    {
-           return (FAIL);
-    }
-
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
-    {
-        double testDelta;
-        double allowedDelta;
-
-        result = exp( tests[i].value );
-
-        /* The test is valid when the difference between the */
-        /* result and the expectation is less than DELTA */
-        allowedDelta = (tests[i].value > 1) ? 1 : DELTA;
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= allowedDelta )
-        {
-            Fail( "exp(%g) returned %20.10g"
-                  " when it should have returned %20.10g\n",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
-    }
-
-    for( i = 0; i < sizeof(infinite) / sizeof(double); i++)
-    {
-        result = exp( infinite[i] );
-
-        /* The test is valid when the function returns an infinite result */
-        if( _finite( result ) )
-        {
-            Fail( "exp(%g) returned %20.10g"
-                  " when it should have returned 1.#INF00000000",
-                  infinite[i],
-                  result );
-        }
-    }
-
-    PAL_Terminate();
-    return PASS;
-}
index cd8c0be..0a74d5c 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
-** 
-
+**               Fail
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;  // param 1
-    double result; // expected result
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = fabs(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("fabs(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = fabs(value);
+
+    if (!_isnan(result))
+    {
+        Fail("fabs(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
 INT __cdecl main(INT argc, CHAR **argv)
 {
-    int i;
-
     struct test tests[] = 
     {
-      // param 1       result
-        { 3,           3 },
-        { -10,         10 },
-        { 0,           0 },
-        { 1.7e308,     1.7e308 },
-        { -1.7e308,    1.7e308 },
-        { 4.94e-324,   4.94e-324 },
-        { -4.94e-324,  4.94e-324 }
+        /* value                   expected                variance */
+        { PAL_NEGINF,              PAL_POSINF,             0 },
+        { -3.1415926535897932,     3.1415926535897932,     PAL_EPSILON * 10 },  // value: -(pi)              expected:  pi
+        { -2.7182818284590452,     2.7182818284590452,     PAL_EPSILON * 10 },  // value: -(e)               expected:  e
+        { -2.3025850929940457,     2.3025850929940457,     PAL_EPSILON * 10 },  // value: -(ln(10))          expected:  ln(10)
+        { -1.5707963267948966,     1.5707963267948966,     PAL_EPSILON * 10 },  // value: -(pi / 2)          expected:  pi / 2
+        { -1.4426950408889634,     1.4426950408889634,     PAL_EPSILON * 10 },  // value: -(log2(e))         expected:  log2(e)
+        { -1.4142135623730950,     1.4142135623730950,     PAL_EPSILON * 10 },  // value: -(sqrt(2))         expected:  sqrt(2)
+        { -1.1283791670955126,     1.1283791670955126,     PAL_EPSILON * 10 },  // value: -(2 / sqrt(pi))    expected:  2 / sqrt(pi)
+        { -1,                      1,                      PAL_EPSILON * 10 },
+        { -0.78539816339744831,    0.78539816339744831,    PAL_EPSILON },       // value: -(pi / 4)          expected:  pi / 4
+        { -0.70710678118654752,    0.70710678118654752,    PAL_EPSILON },       // value: -(1 / sqrt(2))     expected:  1 / sqrt(2)
+        { -0.69314718055994531,    0.69314718055994531,    PAL_EPSILON },       // value: -(ln(2))           expected:  ln(2)
+        { -0.63661977236758134,    0.63661977236758134,    PAL_EPSILON },       // value: -(2 / pi)          expected:  2 / pi
+        { -0.43429448190325183,    0.43429448190325183,    PAL_EPSILON },       // value: -(log10(e))        expected:  log10(e)
+        { -0.31830988618379067,    0.31830988618379067,    PAL_EPSILON },       // value: -(1 / pi)          expected:  1 / pi
+        { -0.0,                    0,                      PAL_EPSILON },
     };
 
 
     // PAL initialization
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++ )
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-
-        result = fabs( tests[i].value );
-
-        if( result != tests[i].result )
-        {
-            Fail( "fabs(%f) returned %f"
-                  " when it should have returned %f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value, tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index a15d54e..d5b2321 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to fabs() a series of values, checking that
 = each one return to correct value.
-
-
-
diff --git a/src/pal/tests/palsuite/c_runtime/fabsf/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/fabsf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5e1ef7f
--- /dev/null
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
@@ -3,16 +3,16 @@ cmake_minimum_required(VERSION 2.8.12.2)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(SOURCES
-  test2.c
+  test1.c
 )
 
-add_executable(paltest_exp_test2
+add_executable(paltest_fabsf_test1
   ${SOURCES}
 )
 
-add_dependencies(paltest_exp_test2 coreclrpal)
+add_dependencies(paltest_fabsf_test1 coreclrpal)
 
-target_link_libraries(paltest_exp_test2
+target_link_libraries(paltest_fabsf_test1
   pthread
   m
   coreclrpal
diff --git a/src/pal/tests/palsuite/c_runtime/fabsf/test1/test1.c b/src/pal/tests/palsuite/c_runtime/fabsf/test1/test1.c
new file mode 100644 (file)
index 0000000..0b02072
--- /dev/null
@@ -0,0 +1,130 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=============================================================================
+**
+** Source: test1.c
+**
+** Purpose: Test to ensure that fabsf return the correct values
+** 
+** Dependencies: PAL_Initialize
+**               PAL_Terminate
+**               Fail
+**
+**===========================================================================*/
+
+#include <palsuite.h>
+
+// binary32 (float) has a machine epsilon of 2^-23 (approx. 1.19e-07). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-21 (approx. 4.76e-07) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (6-9 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxx will use PAL_EPSILON
+// for the variance, while an expected result in the format of 0.0xxxxxxxxx will use
+// PAL_EPSILON / 10 and and expected result in the format of x.xxxxxx will use PAL_EPSILON * 10.
+#define PAL_EPSILON 4.76837158e-07
+                    
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
+{
+    float value;     /* value to test the function with */
+    float expected;  /* expected result */
+    float variance;  /* maximum delta between the expected and actual result */
+};
+
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(float value, float expected, float variance)
+{
+    float result = fabsf(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    float delta = fabsf(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("fabsf(%g) returned %10.9g when it should have returned %10.9g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(float value)
+{
+    float result = fabsf(value);
+
+    if (!_isnan(result))
+    {
+        Fail("fabsf(%g) returned %10.9g when it should have returned %10.9g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
+INT __cdecl main(INT argc, CHAR **argv)
+{
+    struct test tests[] = 
+    {
+        /* value            expected           variance */
+        { PAL_NEGINF,       PAL_POSINF,        0 },
+        { -3.14159265f,     3.14159265f,       PAL_EPSILON * 10 },    // value: -(pi)              expected:  pi
+        { -2.71828183f,     2.71828183f,       PAL_EPSILON * 10 },    // value: -(e)               expected:  e
+        { -2.30258509f,     2.30258509f,       PAL_EPSILON * 10 },    // value: -(ln(10))          expected:  ln(10)
+        { -1.57079633f,     1.57079633f,       PAL_EPSILON * 10 },    // value: -(pi / 2)          expected:  pi / 2
+        { -1.44269504f,     1.44269504f,       PAL_EPSILON * 10 },    // value: -(log2(e))         expected:  log2(e)
+        { -1.41421356f,     1.41421356f,       PAL_EPSILON * 10 },    // value: -(sqrt(2))         expected:  sqrt(2)
+        { -1.12837917f,     1.12837917f,       PAL_EPSILON * 10 },    // value: -(2 / sqrt(pi))    expected:  2 / sqrt(pi)
+        { -1,               1,                 PAL_EPSILON * 10 },
+        { -0.785398163f,    0.785398163f,      PAL_EPSILON },         // value: -(pi / 4)          expected:  pi / 4
+        { -0.707106781f,    0.707106781f,      PAL_EPSILON },         // value: -(1 / sqrt(2))     expected:  1 / sqrt(2)
+        { -0.693147181f,    0.693147181f,      PAL_EPSILON },         // value: -(ln(2))           expected:  ln(2)
+        { -0.636619772f,    0.636619772f,      PAL_EPSILON },         // value: -(2 / pi)          expected:  2 / pi
+        { -0.434294482f,    0.434294482f,      PAL_EPSILON },         // value: -(log10(e))        expected:  log10(e)
+        { -0.318309886f,    0.318309886f,      PAL_EPSILON },         // value: -(1 / pi)          expected:  1 / pi
+        { -0.0f,            0,                 PAL_EPSILON },
+    };
+
+
+    // PAL initialization
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
+    }
+
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
+    {
+        validate( tests[i].value, tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, tests[i].expected, tests[i].variance);
+    }
+    
+    validate_isnan(PAL_NAN);
+
+    PAL_Terminate();
+    return PASS;
+}
@@ -4,9 +4,10 @@
 
 Version = 1.0
 Section = C Runtime
-Function = exp
-Name = Test #2 for exp
-Type = DEFAULT
-EXE1 = test2
+Function = fabsf
+Name = Positive Test for fabsf
+TYPE = DEFAULT
+EXE1 = test1
 Description
-=Tests that exp handles underflows, overflows, and NaNs correctly.
+= Passes to fabsf() a series of values, checking that
+= each one return to correct value.
index b576334..dba3209 100644 (file)
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-/*=============================================================================
+/*============================================================================
 **
-** Source: test1.c
+** Source:  test1.c
 **
-** Purpose: Test to ensure that floor return the correct values
-** 
-** Dependencies: PAL_Initialize
-**               PAL_Terminate
-**                              Fail
-** 
-
+** Purpose: Tests floor with simple positive and negative values.  Also tests 
+**          extreme cases like extremely small values and positive and 
+**          negative infinity.  Makes sure that calling floor on NaN returns 
+**          NaN
 **
-**===========================================================================*/
+**==========================================================================*/
 
 #include <palsuite.h>
 
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
 /**
  * Helper test structure
  */
 struct test
 {
-    double value; // floor param 1
-    double result; // expected result
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = floor(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("floor(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = floor(value);
+
+    if (!_isnan(result))
+    {
+        Fail("floor(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char *argv[])
 {
-    int i;
-
     struct test tests[] = 
     {
-      // param 1         result
-        { 3,                3 },
-        { -10,            -10 },
-        { 0,                0 },
-        { 1.7e308,          1.7e308 },
-        { -1.7e308,        -1.7e308 },
-        { 4.94e-324,        0 },
-        { -4.94e-324,      -1 },
-        { 1234.1234,     1234 },
-        { -1234.1234,   -1235 },
-        {-0,                0 }
+        /* value                   expected           variance */
+        {  0.31830988618379067,    0,                 PAL_EPSILON },        // value:  1 / pi
+        {  0.43429448190325183,    0,                 PAL_EPSILON },        // value:  log10(e)
+        {  0.63661977236758134,    0,                 PAL_EPSILON },        // value:  2 / pi
+        {  0.69314718055994531,    0,                 PAL_EPSILON },        // value:  ln(2)
+        {  0.70710678118654752,    0,                 PAL_EPSILON },        // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0,                 PAL_EPSILON },        // value:  pi / 4
+        {  1.1283791670955126,     1,                 PAL_EPSILON * 10 },   // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     1,                 PAL_EPSILON * 10 },   // value:  sqrt(2)
+        {  1.4426950408889634,     1,                 PAL_EPSILON * 10 },   // value:  log2(e)
+        {  1.5707963267948966,     1,                 PAL_EPSILON * 10 },   // value:  pi / 2
+        {  2.3025850929940457,     2,                 PAL_EPSILON * 10 },   // value:  ln(10)
+        {  2.7182818284590452,     2,                 PAL_EPSILON * 10 },   // value:  e
+        {  3.1415926535897932,     3,                 PAL_EPSILON * 10 },   // value:  pi
+        {  PAL_POSINF,             PAL_POSINF,        0 }
     };
 
-
-    // PAL initialization
-    if( PAL_Initialize(argc, argv) != 0 )
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
-
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    
+    validate( 0,    0, PAL_EPSILON);
+    validate(-0.0,  0, PAL_EPSILON);
+    
+    validate( 1,    1, PAL_EPSILON * 10);
+    validate(-1.0, -1, PAL_EPSILON * 10);
+
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-
-        result = floor( tests[i].value );
-
-        if( result != tests[i].result )
-        {
-            Fail( "floor(%f) returned %f"
-                  " when it should have returned %f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected,       tests[i].variance);
+        validate(-tests[i].value, -(tests[i].expected + 1), tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 8aa8437..90543ea 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to floor() a series of value, checking that
 = each one return to correct value.
-
-
-
index d415371..fd69ca5 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 //Error acceptance level to the 7th decimal
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double valueX; // fmod param 1
-    double valueY; // fmod param 2
-    double result; // expected result
+    double numerator;    /* second component of the value to test the function with */
+    double denominator;  /* first component of the value to test the function with */
+    double expected;     /* expected result */
+    double variance;     /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double numerator, double denominator, double expected, double variance)
+{
+    double result = fmod(numerator, denominator);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("fmod(%g, %g) returned %20.17g when it should have returned %20.17g",
+             numerator, denominator, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double numerator, double denominator)
+{
+    double result = fmod(numerator, denominator);
+
+    if (!_isnan(result))
+    {
+        Fail("fmod(%g, %g) returned %20.17g when it should have returned %20.17g",
+             numerator, denominator, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
 INT __cdecl main(INT argc, CHAR **argv)
 {
-    int i;
-
     struct test tests[] = 
     {
-      // param 1    param 2     result
-        { 3,        2,          1 },
-        { -10,      3,         -1 },
-        { 1,        0.0,        0 },
-        { 1.7e308,  -1.7e308,   0 },
-        { 100,      -1.1234,    0.017400 },
-        { -100,     -1.1234,    -0.017400},
-        { 0,        0,          0 },
-        {-0,        1,          0 },
-        {-0,        -0,         0 }
+        /* numerator               denominator             expected                 variance */
+        {  0,                      PAL_POSINF,             0,                       PAL_EPSILON },
+        {  0.31296179620778659,    0.94976571538163866,    0.31296179620778658,     PAL_EPSILON },
+        {  0.42077048331375735,    0.90716712923909839,    0.42077048331375733,     PAL_EPSILON },
+        {  0.59448076852482208,    0.80410982822879171,    0.59448076852482212,     PAL_EPSILON },
+        {  0.63896127631363480,    0.76923890136397213,    0.63896127631363475,     PAL_EPSILON },
+        {  0.64963693908006244,    0.76024459707563015,    0.64963693908006248,     PAL_EPSILON },
+        {  0.70710678118654752,    0.70710678118654752,    0,                       PAL_EPSILON },
+        {  1,                      1,                      0,                       PAL_EPSILON },
+        {  0.84147098480789651,    0.54030230586813972,    0.30116867893975674,     PAL_EPSILON },
+        {  0.90371945743584630,    0.42812514788535792,    0.047469161665130377,    PAL_EPSILON / 10 },
+        {  0.98776594599273553,    0.15594369476537447,    0.052103777400488605,    PAL_EPSILON / 10 },
+        {  0.99180624439366372,    0.12775121753523991,    0.097547721646984359,    PAL_EPSILON / 10 },
+        {  0.74398033695749319,   -0.66820151019031295,    0.075778826767180285,    PAL_EPSILON / 10 },
+        {  0.41078129050290870,   -0.91173391478696510,    0.41078129050290868,     PAL_EPSILON },
+        {  0,                     -1,                      0,                       PAL_EPSILON },
+        {  1,                      PAL_POSINF,             1,                       PAL_EPSILON * 10 },
     };
 
 
     // PAL initialization
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++ )
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-        result = fmod( tests[i].valueX, tests[i].valueY );
-
-        // The test is valid when the difference between the
-        // result and the expectation is less than DELTA
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "fmod(%f, %f) returned %f"
-                  " when it should have returned %f",
-                  tests[i].valueX,
-                  tests[i].valueY,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].numerator,  tests[i].denominator,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].numerator,  tests[i].denominator, -tests[i].expected, tests[i].variance);
+        validate( tests[i].numerator, -tests[i].denominator,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].numerator, -tests[i].denominator, -tests[i].expected, tests[i].variance);
     }
 
+    validate_isnan( 0,    0);
+    validate_isnan(-0.0,  0);
+    validate_isnan( 0,   -0.0);
+    validate_isnan(-0.0, -0.0);
+    
+    validate_isnan( 1,    0);
+    validate_isnan(-1.0,  0);
+    validate_isnan( 1,   -0.0);
+    validate_isnan(-1.0, -0.0);
+    
+    validate_isnan(PAL_POSINF,  PAL_POSINF);
+    validate_isnan(PAL_NEGINF,  PAL_POSINF);
+    validate_isnan(PAL_POSINF, PAL_NEGINF);
+    validate_isnan(PAL_NEGINF, PAL_NEGINF);
+    
+    validate_isnan(PAL_POSINF,  0);
+    validate_isnan(PAL_NEGINF,  0);
+    validate_isnan(PAL_POSINF, -0.0);
+    validate_isnan(PAL_NEGINF, -0.0);
+    
+    validate_isnan(PAL_POSINF,  1);
+    validate_isnan(PAL_NEGINF,  1);
+    validate_isnan(PAL_POSINF, -1.0);
+    validate_isnan(PAL_NEGINF, -1.0);
+    
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 850daf0..0a81fd8 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to fmod() a series of values, checking that
 = each one return to correct value.
-
-
-
diff --git a/src/pal/tests/palsuite/c_runtime/fmodf/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/fmodf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5e1ef7f
--- /dev/null
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
@@ -3,16 +3,16 @@ cmake_minimum_required(VERSION 2.8.12.2)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(SOURCES
-  test2.c
+  test1.c
 )
 
-add_executable(paltest_pow_test2
+add_executable(paltest_fmodf_test1
   ${SOURCES}
 )
 
-add_dependencies(paltest_pow_test2 coreclrpal)
+add_dependencies(paltest_fmodf_test1 coreclrpal)
 
-target_link_libraries(paltest_pow_test2
+target_link_libraries(paltest_fmodf_test1
   pthread
   m
   coreclrpal
diff --git a/src/pal/tests/palsuite/c_runtime/fmodf/test1/test1.c b/src/pal/tests/palsuite/c_runtime/fmodf/test1/test1.c
new file mode 100644 (file)
index 0000000..31b45d3
--- /dev/null
@@ -0,0 +1,156 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=============================================================================
+**
+** Source: test1.c
+**
+** Purpose: Test to ensure that fmodf return the correct values
+** 
+** Dependencies: PAL_Initialize
+**               PAL_Terminate
+**               Fail
+**               fabsf
+**
+**===========================================================================*/
+
+#include <palsuite.h>
+
+// binary32 (float) has a machine epsilon of 2^-23 (approx. 1.19e-07). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-21 (approx. 4.76e-07) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (6-9 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxx will use PAL_EPSILON
+// for the variance, while an expected result in the format of 0.0xxxxxxxxx will use
+// PAL_EPSILON / 10 and and expected result in the format of x.xxxxxx will use PAL_EPSILON * 10.
+#define PAL_EPSILON 4.76837158e-07
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
+{
+    float numerator;    /* second component of the value to test the function with */
+    float denominator;  /* first component of the value to test the function with */
+    float expected;     /* expected result */
+    float variance;     /* maximum delta between the expected and actual result */
+};
+
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(float numerator, float denominator, float expected, float variance)
+{
+    float result = fmodf(numerator, denominator);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    float delta = fabsf(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("fmodf(%g, %g) returned %10.9g when it should have returned %10.9g",
+             numerator, denominator, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(float numerator, float denominator)
+{
+    float result = fmodf(numerator, denominator);
+
+    if (!_isnan(result))
+    {
+        Fail("fmodf(%g, %g) returned %10.9g when it should have returned %10.9g",
+             numerator, denominator, result, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
+INT __cdecl main(INT argc, CHAR **argv)
+{
+    struct test tests[] = 
+    {
+        /* numerator        denominator        expected          variance */
+        {  0,               PAL_POSINF,        0,                PAL_EPSILON },
+        {  0.312961796f,    0.949765715f,      0.312961796f,     PAL_EPSILON },
+        {  0.420770483f,    0.907167129f,      0.420770483f,     PAL_EPSILON },
+        {  0.594480769f,    0.804109828f,      0.594480769f,     PAL_EPSILON },
+        {  0.638961276f,    0.769238901f,      0.638961276f,     PAL_EPSILON },
+        {  0.649636939f,    0.760244597f,      0.649636939f,     PAL_EPSILON },
+        {  0.707106781f,    0.707106781f,      0,                PAL_EPSILON },
+        {  1,               1,                 0,                PAL_EPSILON },
+        {  0.841470985f,    0.540302306f,      0.301168679f,     PAL_EPSILON },
+        {  0.903719457f,    0.428125148f,      0.0474691617f,    PAL_EPSILON / 10 },
+        {  0.987765946f,    0.155943695f,      0.0521037774f,    PAL_EPSILON / 10 },
+        {  0.991806244f,    0.127751218f,      0.0975477216f,    PAL_EPSILON / 10 },
+        {  0.743980337f,   -0.668201510f,      0.0757788268f,    PAL_EPSILON / 10 },
+        {  0.410781291f,   -0.911733915f,      0.410781291f,     PAL_EPSILON },
+        {  0,              -1,                 0,                PAL_EPSILON },
+        {  1,               PAL_POSINF,        1,                PAL_EPSILON * 10 },
+    };
+
+
+    // PAL initialization
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
+    }
+
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
+    {
+        validate( tests[i].numerator,  tests[i].denominator,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].numerator,  tests[i].denominator, -tests[i].expected, tests[i].variance);
+        validate( tests[i].numerator, -tests[i].denominator,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].numerator, -tests[i].denominator, -tests[i].expected, tests[i].variance);
+    }
+
+    validate_isnan( 0,     0);
+    validate_isnan(-0.0f,  0);
+    validate_isnan( 0,    -0.0f);
+    validate_isnan(-0.0f, -0.0f);
+    
+    validate_isnan( 1,     0);
+    validate_isnan(-1,     0);
+    validate_isnan( 1,    -0.0f);
+    validate_isnan(-1,    -0.0f);
+    
+    validate_isnan(PAL_POSINF, PAL_POSINF);
+    validate_isnan(PAL_NEGINF, PAL_POSINF);
+    validate_isnan(PAL_POSINF, PAL_NEGINF);
+    validate_isnan(PAL_NEGINF, PAL_NEGINF);
+    
+    validate_isnan(PAL_POSINF,  0);
+    validate_isnan(PAL_NEGINF,  0);
+    validate_isnan(PAL_POSINF, -0.0f);
+    validate_isnan(PAL_NEGINF, -0.0f);
+    
+    validate_isnan(PAL_POSINF,  1);
+    validate_isnan(PAL_NEGINF,  1);
+    validate_isnan(PAL_POSINF, -1);
+    validate_isnan(PAL_NEGINF, -1);
+    
+    PAL_Terminate();
+    return PASS;
+}
@@ -4,11 +4,10 @@
 
 Version = 1.0
 Section = C Runtime
-Function = pow
-Name = Positive Test for pow
+Function = fmodf
+Name = Positive Test for fmodf
 TYPE = DEFAULT
-EXE1 = test3
+EXE1 = test1
 Description
-= Passes a series of values to the pow() function,
-= checking each for the expected result. Also checks
-= for proper handling of out-of-range values.
+= Passes to fmodf() a series of values, checking that
+= each one return to correct value.
index 0328bda..eea592d 100644 (file)
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-/*=============================================================================
+/*=====================================================================
 **
-** Source: test1.c
+** Source:  test1.c
 **
-** Purpose: Test to ensure that log returns correct values.
-** 
-** Dependencies: PAL_Initialize
-**               PAL_Terminate
-**                              Fail
-**               fabs
-**               _finite
-**               _isnan
-** 
-
+** Purpose: Tests log with a normal set of values.
 **
-**===========================================================================*/
+**===================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
- * main
- * 
- * executable entry point
+ * validate
+ *
+ * test validation function
  */
-INT __cdecl main(INT argc, CHAR **argv)
+void __cdecl validate(double value, double expected, double variance)
 {
-    int i;
-    double result;
+    double result = log(value);
 
-    struct test tests[] = 
-    {
-        /* Value               test result */
-        { 4.812768944365,     1.571272582596 },
-        { 25.873592333750,    3.253222847545 },
-        { 30.301828058718,    3.411208042666 },
-        { 53.752250740074,    3.984385540365 },
-        { 65.282143620106,    4.178718547435 },
-        { 74.843592638936,    4.315400504515 },
-        { 92.446668904691,    4.526631925866 },
-        { 99.832148197882,    4.603490257677 },
-        { 1830.360576189459,  7.512268262595 },
-        { 6524.430494094669,  8.783308947783 },
-        { 12456.186254463331, 9.429972666394 },
-        { 14183.841639454329, 9.559858682961 },
-        { 18221.999603259377, 9.810384912501 },
-        { 20792.917264320811, 9.942367691562 },
-        { 26488.001312295906, 10.184447128770 },
-        { 29724.154423657950, 10.299715274515 },
-        { 27899211.434430983, 17.144108982393 },
-        { 55048606.214117862, 17.823727102268 },
-        { 66659312.564470351, 18.015105318226 },
-        { 113314373.84325695, 18.545676583294 },
-        { 201366015.49641407, 19.120634782682 },
-        { 311568417.23368025, 19.557129510064 },
-        { 486835298.54176462, 20.003436427833 },
-    };
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-    double indefinite[] =
+    if (delta > variance)
     {
-        -864278.51, -1000.2, -2
-    };
+        Fail("log(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
 
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = log(value);
 
-    /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (!_isnan(result))
     {
-           return (FAIL);
+        Fail("log(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
     }
+}
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
+    struct test tests[] = 
     {
-        double testDelta;
-
-        result = log( tests[i].value );
-
-        /* 
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "log(%g) returned %20.10f"
-                  " when it should have returned %20.10f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
-    }
+        /* value                       expected               variance */
+        {  0,                          PAL_NEGINF,            0 },
+        {  0.043213918263772250,      -3.1415926535897932,    PAL_EPSILON * 10 },   // expected: -(pi)
+        {  0.065988035845312537,      -2.7182818284590452,    PAL_EPSILON * 10 },   // expected: -(e)
+        {  0.1,                       -2.3025850929940457,    PAL_EPSILON * 10 },   // expected: -(ln(10))
+        {  0.20787957635076191,       -1.5707963267948966,    PAL_EPSILON * 10 },   // expected: -(pi / 2)
+        {  0.23629008834452270,       -1.4426950408889634,    PAL_EPSILON * 10 },   // expected: -(log2(e))
+        {  0.24311673443421421,       -1.4142135623730950,    PAL_EPSILON * 10 },   // expected: -(sqrt(2))
+        {  0.32355726390307110,       -1.1283791670955126,    PAL_EPSILON * 10 },   // expected: -(2 / sqrt(pi))
+        {  0.36787944117144232,       -1,                     PAL_EPSILON * 10 },   // expected: -(1)
+        {  0.45593812776599624,       -0.78539816339744831,   PAL_EPSILON },        // expected: -(pi / 4)
+        {  0.49306869139523979,       -0.70710678118654752,   PAL_EPSILON },        // expected: -(1 / sqrt(2))
+        {  0.5,                       -0.69314718055994531,   PAL_EPSILON },        // expected: -(ln(2))
+        {  0.52907780826773535,       -0.63661977236758134,   PAL_EPSILON },        // expected: -(2 / pi)
+        {  0.64772148514180065,       -0.43429448190325183,   PAL_EPSILON },        // expected: -(log10(e))
+        {  0.72737734929521647,       -0.31830988618379067,   PAL_EPSILON },        // expected: -(1 / pi)
+        {  1,                          0,                     PAL_EPSILON },
+        {  1.3748022274393586,         0.31830988618379067,   PAL_EPSILON },        // expected:  1 / pi
+        {  1.5438734439711811,         0.43429448190325183,   PAL_EPSILON },        // expected:  log10(e)
+        {  1.8900811645722220,         0.63661977236758134,   PAL_EPSILON },        // expected:  2 / pi
+        {  2,                          0.69314718055994531,   PAL_EPSILON },        // expected:  ln(2)
+        {  2.0281149816474725,         0.70710678118654752,   PAL_EPSILON },        // expected:  1 / sqrt(2)
+        {  2.1932800507380155,         0.78539816339744831,   PAL_EPSILON },        // expected:  pi / 4
+        {  2.7182818284590452,         1,                     PAL_EPSILON * 10 },   //                               value: e
+        {  3.0906430223107976,         1.1283791670955126,    PAL_EPSILON * 10 },   // expected:  2 / sqrt(pi)
+        {  4.1132503787829275,         1.4142135623730950,    PAL_EPSILON * 10 },   // expected:  sqrt(2)
+        {  4.2320861065570819,         1.4426950408889634,    PAL_EPSILON * 10 },   // expected:  log2(e)
+        {  4.8104773809653517,         1.5707963267948966,    PAL_EPSILON * 10 },   // expected:  pi / 2
+        {  10,                         2.3025850929940457,    PAL_EPSILON * 10 },   // expected:  ln(10)
+        {  15.154262241479264,         2.7182818284590452,    PAL_EPSILON * 10 },   // expected:  e
+        {  23.140692632779269,         3.1415926535897932,    PAL_EPSILON * 10 },   // expected:  pi
+        {  PAL_POSINF,                 PAL_POSINF,            0 },
+    };
+
 
-    for( i = 0; i < sizeof(indefinite) / sizeof(double); i++)
+    if (PAL_Initialize(argc, argv) != 0)
     {
-        result = log( indefinite[i] );
-
-        /* The test is valid when the function returns a defined result */
-        if( ! _isnan( result ) )
-        {
-            Fail( "log(%g) returned %20.10f"
-                  " when it should have returned -1.#IND00000000",
-                  indefinite[i],
-                  result );
-        }
+        return FAIL;
     }
 
-    /* log(0) is a special case */
-    result = log( 0.0 );
-    if( _finite( result ) )
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-            Fail( "log(%g) returned %20.10f"
-                  " when it should have returned -1.#INF00000000",
-                  0.0,
-                  result );
+        validate(tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
index b27ea23..6b984f6 100644 (file)
@@ -12,6 +12,3 @@ Description
 = Passes a series of values to the log() function,
 = checking each for the expected result. Also checks
 = for proper handling of out-of-range values.
-
-
-
index 519db31..13711a7 100644 (file)
 **
 ** Source: test1.c
 **
-** Purpose: Test to ensure that log returns correct values.
+** Purpose: Test to ensure that log10 returns correct values.
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-**               _finite
 **               _isnan
 ** 
-
-**
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /*Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
- * main
- * 
- * executable entry point
+ * validate
+ *
+ * test validation function
  */
-INT __cdecl main(INT argc, CHAR **argv)
+void __cdecl validate(double value, double expected, double variance)
 {
-    int i;
-    double result;
+    double result = log10(value);
 
-    struct test tests[] = 
-    {
-        /* Value        test result */
-        { 6.704916531877, 0.826393375779 },
-        { 15.823847163305, 1.199312079583 },
-        { 21.658986175115, 1.335638124087 },
-        { 34.134952848903, 1.533199307291 },
-        { 42.857142857143, 1.632023214705 },
-        { 57.573168126469, 1.760220128395 },
-        { 67.363505966369, 1.828424682147 },
-        { 75.649281289102, 1.878804806336 },
-        { 99.877925962096, 1.999469515332 },
-        { 1706.203161717582, 3.232030742400 },
-        { 3016.598101748711, 3.479517453423 },
-        { 4017.596636860256, 3.603966331820 },
-        { 5462.646626178777, 3.737403107294 },
-        { 7199.790368358409, 3.857319851544 },
-        { 13577.991882076480, 4.132835544685 },
-        { 19235.535721915341, 4.284104286189 },
-        { 24904.989593188267, 4.396286364594 },
-        { 10690368.906277657000, 7.028992692224 },
-        { 40653667.728385270000, 7.609099733260 },
-        { 71100035.987914667000, 7.851869820552 },
-        { 111208971.628284560000, 8.046139824759 },
-        { 172499991.153172400000, 8.236789077136 },
-        { 244361677.392925830000, 8.388033097635 },
-        { 292552744.803003010000, 8.466204177125 },
-        { 317831243.774193530000, 8.502196587433 },
-        { 501815331.063020770000, 8.700543925401 },
-    };
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-    double indefinite[] =
+    if (delta > variance)
     {
-        -864278.51, -1000.2, -2
-    };
+        Fail("log10(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
 
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = log10(value);
 
-    /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (!_isnan(result))
     {
-           return (FAIL);
+        Fail("log10(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
     }
+}
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
+    struct test tests[] = 
     {
-        double testDelta;
-
-        result = log10( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "log10(%g) returned %20.10f"
-                  " when it should have returned %20.10f",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
-    }
+        /* value                       expected               variance */
+        {  0,                          PAL_NEGINF,            0 },
+        {  0.00072178415907472774,    -3.1415926535897932,    PAL_EPSILON * 10 },   // expected: -(pi)
+        {  0.0019130141022243176,     -2.7182818284590452,    PAL_EPSILON * 10 },   // expected: -(e)
+        {  0.0049821282964407206,     -2.3025850929940457,    PAL_EPSILON * 10 },   // expected: -(ln(10))
+        {  0.026866041001136132,      -1.5707963267948966,    PAL_EPSILON * 10 },   // expected: -(pi / 2)
+        {  0.036083192820787210,      -1.4426950408889634,    PAL_EPSILON * 10 },   // expected: -(log2(e))
+        {  0.038528884700322026,      -1.4142135623730950,    PAL_EPSILON * 10 },   // expected: -(sqrt(2))
+        {  0.074408205860642723,      -1.1283791670955126,    PAL_EPSILON * 10 },   // expected: -(2 / sqrt(pi))
+        {  0.1,                       -1,                     PAL_EPSILON * 10 },   // expected: -(1)
+        {  0.16390863613957665,       -0.78539816339744831,   PAL_EPSILON },        // expected: -(pi / 4)
+        {  0.19628775993505562,       -0.70710678118654752,   PAL_EPSILON },        // expected: -(1 / sqrt(2))
+        {  0.20269956628651730,       -0.69314718055994531,   PAL_EPSILON },        // expected: -(ln(2))
+        {  0.23087676451600055,       -0.63661977236758134,   PAL_EPSILON },        // expected: -(2 / pi)
+        {  0.36787944117144232,       -0.43429448190325183,   PAL_EPSILON },        // expected: -(log10(e))
+        {  0.48049637305186868,       -0.31830988618379067,   PAL_EPSILON },        // expected: -(1 / pi)
+        {  1,                          0,                     PAL_EPSILON },
+        {  2.0811811619898573,         0.31830988618379067,   PAL_EPSILON },        // expected:  1 / pi
+        {  2.7182818284590452,         0.43429448190325183,   PAL_EPSILON },        // expected:  log10(e)           value: e
+        {  4.3313150290214525,         0.63661977236758134,   PAL_EPSILON },        // expected:  2 / pi
+        {  4.9334096679145963,         0.69314718055994531,   PAL_EPSILON },        // expected:  ln(2)
+        {  5.0945611704512962,         0.70710678118654752,   PAL_EPSILON },        // expected:  1 / sqrt(2)
+        {  6.1009598002416937,         0.78539816339744831,   PAL_EPSILON },        // expected:  pi / 4
+        {  10,                         1,                     PAL_EPSILON * 10 },
+        {  13.439377934644400,         1.1283791670955126,    PAL_EPSILON * 10 },   // expected:  2 / sqrt(pi)
+        {  25.954553519470081,         1.4142135623730950,    PAL_EPSILON * 10 },   // expected:  sqrt(2)
+        {  27.713733786437790,         1.4426950408889634,    PAL_EPSILON * 10 },   // expected:  log2(e)
+        {  37.221710484165167,         1.5707963267948966,    PAL_EPSILON * 10 },   // expected:  pi / 2
+        {  200.71743249053009,         2.3025850929940457,    PAL_EPSILON * 10 },   // expected:  ln(10)
+        {  522.73529967043665,         2.7182818284590452,    PAL_EPSILON * 10 },   // expected:  e
+        {  1385.4557313670111,         3.1415926535897932,    PAL_EPSILON * 10 },   // expected:  pi
+        {  PAL_POSINF,                 PAL_POSINF,            0 },
+    };
+
 
-    for( i = 0; i < sizeof(indefinite) / sizeof(double); i++)
+    if (PAL_Initialize(argc, argv) != 0)
     {
-        result = log10( indefinite[i] );
-
-        /* The test is valid when the function returns a defined result */
-        if( ! _isnan( result ) )
-        {
-            Fail( "log10(%g) returned %20.10f"
-                  " when it should have returned -1.#IND00000000",
-                  indefinite[i],
-                  result );
-        }
+        return FAIL;
     }
 
-    /* log(0) is a special case */
-    result = log10( 0.0 );
-    if( _finite( result ) )
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-            Fail( "log10(%g) returned %20.10f"
-                  " when it should have returned -1.#INF00000000",
-                  0.0,
-                  result );
+        validate(tests[i].value, tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
index 59ab43d..389d079 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 //Error acceptance level to the 7th decimal
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   // fmodf param 1
-    double result1; // expected result (fractional portion)
-    double result2; // expected result (integer portion)
+    double value;             /* value to test the function with */
+    double expected;          /* expected result */   
+    double variance;          /* maximum delta between the expected and actual result */
+    double expected_intpart;  /* expected result */
+    double variance_intpart;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance, double expected_intpart, double variance_intpart)
+{
+    double result_intpart;
+    double result = modf(value, &result_intpart);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+    double delta_intpart = fabs(result_intpart - expected_intpart);
+
+    if ((delta > variance) || (delta_intpart > variance_intpart))
+    {
+        Fail("modf(%g) returned %20.17g with an intpart of %20.17g when it should have returned %20.17g with an intpart of %20.17g",
+             value, result, result_intpart, expected, expected_intpart);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result_intpart;
+    double result = modf(value, &result_intpart);
+
+    if (!_isnan(result) || !_isnan(result_intpart))
+    {
+        Fail("modf(%g) returned %20.17g with an intpart of %20.17g when it should have returned %20.17g with an intpart of %20.17g",
+             value, result, result_intpart, PAL_NAN, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    INT i;
-
     struct test tests[] = 
     {
-      // param 1   fractional   integer
-        { 3,        0,          3  },
-        { -10,      0,         -10 },
-        { 1.1234,   0.1234,     1 },
-        { -1.1234,  -0.1234,    -1 },
-        { 1.7e308,  0,          1.7e308 },
-        { -1.7e308, 0,         -1.7e308 },
-        { 1.7e-30,  1.7e-30,    0 },
-        { 0,        0,          0 }
+        /* value                   expected                variance         expected_intpart     variance_intpart */
+        {  0,                      0,                      PAL_EPSILON,         0,                   PAL_EPSILON },
+        {  0.31830988618379067,    0.31830988618379067,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.43429448190325183,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.63661977236758134,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.69314718055994531,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.70710678118654752,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.78539816339744831,    PAL_EPSILON,         0,                   PAL_EPSILON },       // value:  pi / 4
+        {  1,                      0,                      PAL_EPSILON,         1,                   PAL_EPSILON * 10 },
+        {  1.1283791670955126,     0.1283791670955126,     PAL_EPSILON,         1,                   PAL_EPSILON * 10 },  // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     0.4142135623730950,     PAL_EPSILON,         1,                   PAL_EPSILON * 10 },  // value:  sqrt(2)
+        {  1.4426950408889634,     0.4426950408889634,     PAL_EPSILON,         1,                   PAL_EPSILON * 10 },  // value:  log2(e)
+        {  1.5707963267948966,     0.5707963267948966,     PAL_EPSILON,         1,                   PAL_EPSILON * 10 },  // value:  pi / 2
+        {  2.3025850929940457,     0.3025850929940457,     PAL_EPSILON,         2,                   PAL_EPSILON * 10 },  // value:  ln(10)
+        {  2.7182818284590452,     0.7182818284590452,     PAL_EPSILON,         2,                   PAL_EPSILON * 10 },  // value:  e
+        {  3.1415926535897932,     0.1415926535897932,     PAL_EPSILON,         3,                   PAL_EPSILON * 10 },  // value:  pi
+        {  PAL_POSINF,             0,                      PAL_EPSILON,         PAL_POSINF,          0 }
+        
     };
 
-
-    // PAL initialization
-    if( PAL_Initialize(argc, argv) != 0 )
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return FAIL;
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++ )
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double fractionalResult;
-        double integerResult;
-        double testDelta;
-
-        fractionalResult = modf( tests[i].value, &integerResult );
-
-        // The test is valid when the difference between the
-        // result and the expectation is less than DELTA
-        
-        testDelta = fabs( fractionalResult - tests[i].result1 );
-
-        if( (testDelta >= DELTA) ||
-            (integerResult != tests[i].result2) )
-
-        {
-            Fail( "ERROR: "
-                  "modf(%f) returned "
-                  "fraction=%20.20f and integer=%20.20f "
-                  "when it should have returned "
-                  "fraction=%20.20f and integer=%20.20f ",
-                  tests[i].value,
-                  fractionalResult,
-                  integerResult, 
-                  tests[i].result1,
-                  tests[i].result2 );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance,  tests[i].expected_intpart, tests[i].variance_intpart);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance, -tests[i].expected_intpart, tests[i].variance_intpart);
     }
 
+    validate_isnan(PAL_NAN);
+
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pal/tests/palsuite/c_runtime/modff/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/modff/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f6aa0cb
--- /dev/null
@@ -0,0 +1,4 @@
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
+
@@ -3,16 +3,16 @@ cmake_minimum_required(VERSION 2.8.12.2)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(SOURCES
-  test3.c
+  test1.c
 )
 
-add_executable(paltest_exp_test3
+add_executable(paltest_modff_test1
   ${SOURCES}
 )
 
-add_dependencies(paltest_exp_test3 coreclrpal)
+add_dependencies(paltest_modff_test1 coreclrpal)
 
-target_link_libraries(paltest_exp_test3
+target_link_libraries(paltest_modff_test1
   pthread
   m
   coreclrpal
diff --git a/src/pal/tests/palsuite/c_runtime/modff/test1/test1.c b/src/pal/tests/palsuite/c_runtime/modff/test1/test1.c
new file mode 100644 (file)
index 0000000..6b7a50b
--- /dev/null
@@ -0,0 +1,135 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=============================================================================
+**
+** Source: test1.c (modf)
+**
+** Purpose: Test to ensure that modf return the correct values
+** 
+** Dependencies: PAL_Initialize
+**               PAL_Terminate
+**               Fail
+**               fabs
+**
+**===========================================================================*/
+
+#include <palsuite.h>
+
+// binary32 (float) has a machine epsilon of 2^-23 (approx. 1.19e-07). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-21 (approx. 4.76e-07) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (6-9 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxx will use PAL_EPSILON
+// for the variance, while an expected result in the format of 0.0xxxxxxxxx will use
+// PAL_EPSILON / 10 and and expected result in the format of x.xxxxxx will use PAL_EPSILON * 10.
+#define PAL_EPSILON 4.76837158e-07
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
+{
+    float value;             /* value to test the function with */
+    float expected;          /* expected result */   
+    float variance;          /* maximum delta between the expected and actual result */
+    float expected_intpart;  /* expected result */
+    float variance_intpart;  /* maximum delta between the expected and actual result */
+};
+
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(float value, float expected, float variance, float expected_intpart, float variance_intpart)
+{
+    float result_intpart;
+    float result = modff(value, &result_intpart);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    float delta = fabsf(result - expected);
+    float delta_intpart = fabsf(result_intpart - expected_intpart);
+
+    if ((delta > variance) || (delta_intpart > variance_intpart))
+    {
+        Fail("modff(%g) returned %10.9g with an intpart of %10.9g when it should have returned %10.9g with an intpart of %10.9g",
+             value, result, result_intpart, expected, expected_intpart);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(float value)
+{
+    float result_intpart;
+    float result = modff(value, &result_intpart);
+
+    if (!_isnan(result) || !_isnan(result_intpart))
+    {
+        Fail("modff(%g) returned %10.9g with an intpart of %10.9g when it should have returned %10.9g with an intpart of %10.9g",
+             value, result, result_intpart, PAL_NAN, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
+int __cdecl main(int argc, char **argv)
+{
+    struct test tests[] = 
+    {
+        /* value              expected         variance    expected_intpart    variance_intpart */
+        {  0,                 0,               PAL_EPSILON,    0,                  PAL_EPSILON },
+        {  0.318309886f,      0.318309886f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  1 / pi
+        {  0.434294482f,      0.434294482f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  log10(e)
+        {  0.636619772f,      0.636619772f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  2 / pi
+        {  0.693147181f,      0.693147181f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  ln(2)
+        {  0.707106781f,      0.707106781f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.785398163f,      0.785398163f,    PAL_EPSILON,    0,                  PAL_EPSILON },       // value:  pi / 4
+        {  1,                 0,               PAL_EPSILON,    1,                  PAL_EPSILON * 10 },
+        {  1.12837917f,       0.128379167f,    PAL_EPSILON,    1,                  PAL_EPSILON * 10 },  // value:  2 / sqrt(pi)
+        {  1.41421356f,       0.414213562f,    PAL_EPSILON,    1,                  PAL_EPSILON * 10 },  // value:  sqrt(2)
+        {  1.44269504f,       0.442695041f,    PAL_EPSILON,    1,                  PAL_EPSILON * 10 },  // value:  log2(e)
+        {  1.57079633f,       0.570796327f,    PAL_EPSILON,    1,                  PAL_EPSILON * 10 },  // value:  pi / 2
+        {  2.30258509f,       0.302585093f,    PAL_EPSILON,    2,                  PAL_EPSILON * 10 },  // value:  ln(10)
+        {  2.71828183f,       0.718281828f,    PAL_EPSILON,    2,                  PAL_EPSILON * 10 },  // value:  e
+        {  3.14159265f,       0.141592654f,    PAL_EPSILON,    3,                  PAL_EPSILON * 10 },  // value:  pi
+        {  PAL_POSINF,        0,               PAL_EPSILON,    PAL_POSINF,         0 }
+        
+    };
+
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
+    }
+
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
+    {
+        validate( tests[i].value,  tests[i].expected, tests[i].variance,  tests[i].expected_intpart, tests[i].variance_intpart);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance, -tests[i].expected_intpart, tests[i].variance_intpart);
+    }
+
+    validate_isnan(PAL_NAN);
+
+    PAL_Terminate();
+    return PASS;
+}
@@ -4,14 +4,10 @@
 
 Version = 1.0
 Section = C Runtime
-Function = exp
-Name = Positive Test for exp
+Function = modff
+Name = Positive Test for modff
 TYPE = DEFAULT
-EXE1 = test3
+EXE1 = test1
 Description
-= Passes a series of values to the exp() function,
-= checking each for the expected result. Also checks
-= for proper handling of out-of-range values.
-
-
-
+= Passes to modff() a series of values, checking that
+= each one return to correct value.
index 1962ade..5e1ef7f 100644 (file)
@@ -1,6 +1,3 @@
 cmake_minimum_required(VERSION 2.8.12.2)
 
 add_subdirectory(test1)
-add_subdirectory(test2)
-add_subdirectory(test3)
-
index 2462ba4..0a05cd5 100644 (file)
 **
 ** Source:  test1.c
 **
-** Purpose:  Call the pow function with various values, 
-**           to test specified valid input and boundaries.
-**
+** Purpose: Tests that atan2 returns correct values for a subset of values.
+**          Tests with positive and negative values of x and y to ensure
+**          atan2 is returning results from the correct quadrant.
 **
 **===================================================================*/
 
-/* Notes: SCENARIO                                             CASE
-          - Both number and exponent may be non-integers         1
-          - Exponent may be negative                             2
-          - If number anything and exponent is 0, returns 1      3 
-          - If number is 0 and exponent is positive, returns 0   4
-          - Number may be negative with integer exponents        5
-          - Other valid input returns the usual valid output     6
-          - See test2 for infinite and nan input/output cases    
-*/
-
 #include <palsuite.h>
 
-/* Error acceptance level to the 7th decimal */   
-#define DELTA 0.0000001
-
-struct testCase
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
 {
-    double Number;
-    double Exponent;
-    double CorrectValue;
+    double x;         /* first component of the value to test the function with */
+    double y;         /* second component of the value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double x, double y, double expected, double variance)
+{
+    double result = pow(x, y);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("pow(%g, %g) returned %20.17g when it should have returned %20.17g",
+             x, y, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double x, double y)
+{
+    double result = pow(x, y);
+
+    if (!_isnan(result))
+    {
+        Fail("pow(%g, %g) returned %20.17g when it should have returned %20.17g",
+             x, y, result, PAL_NAN);
+    }
+}
+
+/**
+ * main
+ * 
+ * executable entry point
+ */
 int __cdecl main(int argc, char **argv)
 {
-    double result=0;
-    double testDelta=99999;
-    int i=0;
-
-    struct testCase testCases[] =                            /* CASE  */
-        {
-            {0,           0,       1                      }, /* 3  */
-            {0.0,         0.0,     1                      }, /* 3  */
-            {-0,          0,       1                      }, /* 3  */
-            {-0,          -0,      1                      }, /* 3  */
-            {2,           0,       1                      }, /* 3  */
-            {2,           0.0,     1                      }, /* 3  */
-            {2,           -0.0,    1                      }, /* 3  */
-            {42.3124234,  0,       1                      }, /* 3  */
-            {-2,          -0.0,    1                      }, /* 3  */
-            {-3.33132,    -0.0,    1                      }, /* 3  */
-            {-999990,     0,       1                      }, /* 3  */
-            {9999.9999,   0.0,     1                      }, /* 3  */
-            {-9999.9999,  0.0,     1                      }, /* 3  */
-            {0,           1,       0                      }, /* 4  */ 
-            {0.0,         2,       0                      }, /* 4  */ 
-            {0.0,         3,       0                      }, /* 4  */ 
-            {-0,          9.99999, 0                      }, /* 4  */ 
-            {2,           2,       4                      }, /* 6  */ 
-            {2,           -2,      0.25                   }, /* 6  */
-            {6.25,        2.5,     97.65625               }, /* 6  */
-            {12345.12345, 9.99999, 
-             82207881573997179707867981634171194834944.0  }, /* 6  */
-            {12345,       75,
-             7.2749844621476552703935675020036e+306       }, /* 6  */
-            {-2.012,      2,       4.048144               }, /* 6  */
-            {2,           1,       2                      }, /* 6  */
-            {8,           1,       8                      }, /* 6  */
-            {MAXLONG,     1,       MAXLONG                }, /* 6  */
-            {4.321,       1,       4.321                  }, /* 6  */
-            {-4.321,      1,      -4.321                  }  /* 6  */
-        };
-    if (0 != (PAL_Initialize(argc, argv)))
+    struct test tests[] = 
+    {
+        /* x                       y                       expected                   variance */
+        {  PAL_NEGINF,             PAL_NEGINF,             0,                         PAL_EPSILON },
+        {  PAL_NEGINF,             PAL_POSINF,             PAL_POSINF,                0 },
+
+        { -10,                     PAL_NEGINF,             0,                         PAL_EPSILON },
+        { -10,                    -1,                     -0.1,                       PAL_EPSILON },
+        { -10,                     0,                      1,                         PAL_EPSILON * 10 },
+        { -10,                     1,                     -10,                        PAL_EPSILON * 100 },
+        { -10,                     PAL_POSINF,             PAL_POSINF,                0 },
+
+        { -2.7182818284590452,     PAL_NEGINF,             0,                         PAL_EPSILON },          // x: -(e)
+        { -2.7182818284590452,    -1,                     -0.36787944117144232,       PAL_EPSILON },          // x: -(e)
+        { -2.7182818284590452,     0,                      1,                         PAL_EPSILON * 10 },     // x: -(e)
+        { -2.7182818284590452,     1,                     -2.7182818284590452,        PAL_EPSILON * 10 },     // x: -(e)                       expected: e
+        { -2.7182818284590452,     PAL_POSINF,             PAL_POSINF,                0 },                    // x: -(e)
+
+        { -0.0,                    PAL_NEGINF,             PAL_POSINF,                0 },
+        { -0.0,                   -1,                      PAL_NEGINF,                0 },
+        { -0.0,                   -0.0,                    1,                         PAL_EPSILON * 10 },
+        { -0.0,                    0,                      1,                         PAL_EPSILON * 10 },
+        { -0.0,                    1,                     -0.0,                       PAL_EPSILON },
+        { -0.0,                    PAL_POSINF,             0,                         PAL_EPSILON },
+
+        {  0.0,                    PAL_NEGINF,             PAL_POSINF,                0 },
+        {  0.0,                   -1,                      PAL_POSINF,                0 },
+        {  0,                     -0.0,                    1,                         PAL_EPSILON * 10 },
+        {  0,                      0,                      1,                         PAL_EPSILON * 10 },
+        {  0.0,                    1,                      0,                         PAL_EPSILON },
+        {  0.0,                    PAL_POSINF,             0,                         PAL_EPSILON },
+
+        {  1,                      PAL_NEGINF,             1,                         PAL_EPSILON * 10 },
+        {  1,                      PAL_POSINF,             1,                         PAL_EPSILON * 10 },
+
+        {  2.7182818284590452,     PAL_NEGINF,             0,                         PAL_EPSILON },
+        {  2.7182818284590452,    -3.1415926535897932,     0.043213918263772250,      PAL_EPSILON / 10 },     // x: e     y: -(pi)
+        {  2.7182818284590452,    -2.7182818284590452,     0.065988035845312537,      PAL_EPSILON / 10 },     // x: e     y: -(e)
+        {  2.7182818284590452,    -2.3025850929940457,     0.1,                       PAL_EPSILON },          // x: e     y: -(ln(10))
+        {  2.7182818284590452,    -1.5707963267948966,     0.20787957635076191,       PAL_EPSILON },          // x: e     y: -(pi / 2)
+        {  2.7182818284590452,    -1.4426950408889634,     0.23629008834452270,       PAL_EPSILON },          // x: e     y: -(log2(e))
+        {  2.7182818284590452,    -1.4142135623730950,     0.24311673443421421,       PAL_EPSILON },          // x: e     y: -(sqrt(2))
+        {  2.7182818284590452,    -1.1283791670955126,     0.32355726390307110,       PAL_EPSILON },          // x: e     y: -(2 / sqrt(pi))
+        {  2.7182818284590452,    -1,                      0.36787944117144232,       PAL_EPSILON },          // x: e     y: -(1)
+        {  2.7182818284590452,    -0.78539816339744831,    0.45593812776599624,       PAL_EPSILON },          // x: e     y: -(pi / 4)
+        {  2.7182818284590452,    -0.70710678118654752,    0.49306869139523979,       PAL_EPSILON },          // x: e     y: -(1 / sqrt(2))
+        {  2.7182818284590452,    -0.69314718055994531,    0.5,                       PAL_EPSILON },          // x: e     y: -(ln(2))
+        {  2.7182818284590452,    -0.63661977236758134,    0.52907780826773535,       PAL_EPSILON },          // x: e     y: -(2 / pi)
+        {  2.7182818284590452,    -0.43429448190325183,    0.64772148514180065,       PAL_EPSILON },          // x: e     y: -(log10(e))
+        {  2.7182818284590452,    -0.31830988618379067,    0.72737734929521647,       PAL_EPSILON },          // x: e     y: -(1 / pi)
+        {  2.7182818284590452,     0,                      1,                         PAL_EPSILON * 10 },     // x: e
+        {  2.7182818284590452,     0.31830988618379067,    1.3748022274393586,        PAL_EPSILON * 10 },     // x: e     y:  1 / pi
+        {  2.7182818284590452,     0.43429448190325183,    1.5438734439711811,        PAL_EPSILON * 10 },     // x: e     y:  log10(e)
+        {  2.7182818284590452,     0.63661977236758134,    1.8900811645722220,        PAL_EPSILON * 10 },     // x: e     y:  2 / pi
+        {  2.7182818284590452,     0.69314718055994531,    2,                         PAL_EPSILON * 10 },     // x: e     y:  ln(2)
+        {  2.7182818284590452,     0.70710678118654752,    2.0281149816474725,        PAL_EPSILON * 10 },     // x: e     y:  1 / sqrt(2)
+        {  2.7182818284590452,     0.78539816339744831,    2.1932800507380155,        PAL_EPSILON * 10 },     // x: e     y:  pi / 4
+        {  2.7182818284590452,     1,                      2.7182818284590452,        PAL_EPSILON * 10 },     // x: e                         expected: e
+        {  2.7182818284590452,     1.1283791670955126,     3.0906430223107976,        PAL_EPSILON * 10 },     // x: e     y:  2 / sqrt(pi)
+        {  2.7182818284590452,     1.4142135623730950,     4.1132503787829275,        PAL_EPSILON * 10 },     // x: e     y:  sqrt(2)
+        {  2.7182818284590452,     1.4426950408889634,     4.2320861065570819,        PAL_EPSILON * 10 },     // x: e     y:  log2(e)
+        {  2.7182818284590452,     1.5707963267948966,     4.8104773809653517,        PAL_EPSILON * 10 },     // x: e     y:  pi / 2
+        {  2.7182818284590452,     2.3025850929940457,     10,                        PAL_EPSILON * 100 },    // x: e     y:  ln(10)
+        {  2.7182818284590452,     2.7182818284590452,     15.154262241479264,        PAL_EPSILON * 100 },    // x: e     y:  e
+        {  2.7182818284590452,     3.1415926535897932,     23.140692632779269,        PAL_EPSILON * 100 },    // x: e     y:  pi
+        {  2.7182818284590452,     PAL_POSINF,             PAL_POSINF,                0 },                    // x: e
+        
+        {  10,                     PAL_NEGINF,             0,                         0 },
+        {  10,                    -3.1415926535897932,     0.00072178415907472774,    PAL_EPSILON / 1000 },   //          y: -(pi)
+        {  10,                    -2.7182818284590452,     0.0019130141022243176,     PAL_EPSILON / 100 },    //          y: -(e)
+        {  10,                    -2.3025850929940457,     0.0049821282964407206,     PAL_EPSILON / 100 },    //          y: -(ln(10))
+        {  10,                    -1.5707963267948966,     0.026866041001136132,      PAL_EPSILON / 10 },     //          y: -(pi / 2)
+        {  10,                    -1.4426950408889634,     0.036083192820787210,      PAL_EPSILON / 10 },     //          y: -(log2(e))
+        {  10,                    -1.4142135623730950,     0.038528884700322026,      PAL_EPSILON / 10 },     //          y: -(sqrt(2))
+        {  10,                    -1.1283791670955126,     0.074408205860642723,      PAL_EPSILON / 10 },     //          y: -(2 / sqrt(pi))
+        {  10,                    -1,                      0.1,                       PAL_EPSILON },          //          y: -(1)
+        {  10,                    -0.78539816339744831,    0.16390863613957665,       PAL_EPSILON },          //          y: -(pi / 4)
+        {  10,                    -0.70710678118654752,    0.19628775993505562,       PAL_EPSILON },          //          y: -(1 / sqrt(2))
+        {  10,                    -0.69314718055994531,    0.20269956628651730,       PAL_EPSILON },          //          y: -(ln(2))
+        {  10,                    -0.63661977236758134,    0.23087676451600055,       PAL_EPSILON },          //          y: -(2 / pi)
+        {  10,                    -0.43429448190325183,    0.36787944117144232,       PAL_EPSILON },          //          y: -(log10(e))
+        {  10,                    -0.31830988618379067,    0.48049637305186868,       PAL_EPSILON },          //          y: -(1 / pi)
+        {  10,                     0,                      1,                         PAL_EPSILON * 10 },
+        {  10,                     0.31830988618379067,    2.0811811619898573,        PAL_EPSILON * 10 },     //          y:  1 / pi
+        {  10,                     0.43429448190325183,    2.7182818284590452,        PAL_EPSILON * 10 },     //          y:  log10(e)           expected: e
+        {  10,                     0.63661977236758134,    4.3313150290214525,        PAL_EPSILON * 10 },     //          y:  2 / pi
+        {  10,                     0.69314718055994531,    4.9334096679145963,        PAL_EPSILON * 10 },     //          y:  ln(2)
+        {  10,                     0.70710678118654752,    5.0945611704512962,        PAL_EPSILON * 10 },     //          y:  1 / sqrt(2)
+        {  10,                     0.78539816339744831,    6.1009598002416937,        PAL_EPSILON * 10 },     //          y:  pi / 4
+        {  10,                     1,                      10,                        PAL_EPSILON * 100 },
+        {  10,                     1.1283791670955126,     13.439377934644400,        PAL_EPSILON * 100 },    //          y:  2 / sqrt(pi)
+        {  10,                     1.4142135623730950,     25.954553519470081,        PAL_EPSILON * 100 },    //          y:  sqrt(2)
+        {  10,                     1.4426950408889634,     27.713733786437790,        PAL_EPSILON * 100 },    //          y:  log2(e)
+        {  10,                     1.5707963267948966,     37.221710484165167,        PAL_EPSILON * 100 },    //          y:  pi / 2
+        {  10,                     2.3025850929940457,     200.71743249053009,        PAL_EPSILON * 1000 },   //          y:  ln(10)
+        {  10,                     2.7182818284590452,     522.73529967043665,        PAL_EPSILON * 1000 },   //          y:  e
+        {  10,                     3.1415926535897932,     1385.4557313670111,        PAL_EPSILON * 10000 },  //          y:  pi
+        {  10,                     PAL_POSINF,             PAL_POSINF,                0 },
+        
+        {  PAL_POSINF,             PAL_NEGINF,             0,                         PAL_EPSILON },
+        {  PAL_POSINF,             PAL_POSINF,             PAL_POSINF,                0 },
+    };
+
+    if (PAL_Initialize(argc, argv) != 0)
     {
         return FAIL;
     }
 
-    /* Loop through each case. Call pow on each value and check the 
-       result.
-    */
-    for(i = 0; i < sizeof(testCases) / sizeof(struct testCase); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        result = pow(testCases[i].Number, testCases[i].Exponent);
-        testDelta = fabs(result - testCases[i].CorrectValue);
-
-        if ( testDelta >= DELTA )
-        {
-            Fail("ERROR: pow took the '%f' to the exponent '%f' "
-                 "to be %f instead of %f.\n", 
-                 testCases[i].Number, 
-                 testCases[i].Exponent, 
-                 result, 
-                 testCases[i].CorrectValue);
-        }
+        validate(tests[i].x, tests[i].y, tests[i].expected, tests[i].variance);
     }
 
+    validate_isnan(-10, -1.5707963267948966);                                                                 //          y: -(pi / 2)
+    validate_isnan(-10, -0.78539816339744828);                                                                //          y: -(pi / 4)
+    validate_isnan(-10,  0.78539816339744828);                                                                //          y:   pi / 4
+    validate_isnan(-10,  1.5707963267948966);                                                                 //          y:   pi / 2
+    
+    validate_isnan(-2.7182818284590452, -1.5707963267948966);                                                 // x: -(e)  y: -(pi / 2)
+    validate_isnan(-2.7182818284590452, -0.78539816339744828);                                                // x: -(e)  y: -(pi / 4)
+    validate_isnan(-2.7182818284590452,  0.78539816339744828);                                                // x: -(e)  y:   pi / 4
+    validate_isnan(-2.7182818284590452,  1.5707963267948966);                                                 // x: -(e)  y:   pi / 2
+
+    validate_isnan(-1, PAL_NEGINF);
+    validate_isnan(-1, PAL_POSINF);
+
+    validate_isnan(PAL_NAN, -0.0);
+    validate_isnan(PAL_NAN,  0);
+    
+    validate_isnan(PAL_NEGINF, PAL_NAN);
+    validate_isnan(PAL_NAN,    PAL_NEGINF);
+    
+    validate_isnan(PAL_POSINF, PAL_NAN);
+    validate_isnan(PAL_NAN,    PAL_POSINF);
+    
+    validate_isnan(PAL_NAN, PAL_NAN);
+
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pal/tests/palsuite/c_runtime/pow/test2/test2.c b/src/pal/tests/palsuite/c_runtime/pow/test2/test2.c
deleted file mode 100644 (file)
index 5d713c5..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*=====================================================================
-**
-** Source:  test2.c
-**
-** Purpose:  Call the pow function with various values, 
-**           to test special in/out values.
-**
-**
-**===================================================================*/
-
-/* Notes: The following table summarizes expected results:
-          NUMBER       EXPONENT            RETURNS   CASE
-          PosInf       > 0                 PosInf     1 
-          PosInf       < 0                 0          2
-          NegInf       > 0 (even int)      PosInf     3
-          NegInf       > 0 (odd int)       NegInf     4
-          NegInf       < 0 (odd int)       0          5
-          NegInf       < 0 (even int)      0          6
-          |num| > 1    PosInf              PosInf     7
-          |num| < 1    PosInf              0          8
-          |num| > 1    NegInf              0          9
-          |num| < 1    NegInf              PosInf    10
-          +1           PosInf              NaN       11
-          +1           NegInf              NaN       12
-          < 0          non-int             NaN       13
-          0            < 0 (odd int)       NegInf    14
-          0            < 0 (even int)      PosInf    15
-          Large        Large               PosInf    16
-          -Large       Large               NegInf    17
-          Large        -Large              0         18
-          -Large       -Large              0         19
-*/
-
-#include <palsuite.h>
-
-struct testCase
-{
-    double Number;
-    double Exponent;
-};
-
-int __cdecl main(int argc, char **argv)
-{
-    double zero = 0.0;
-    double PosInf = 1.0 / zero;
-    double NegInf = -1.0 / zero;
-    double NaN = 0.0 / zero;
-    volatile double result=0;
-    int i=0;
-
-    struct testCase retPosInf[] =
-        {                                              /* CASE */
-            {PosInf,         .3123                },   /*  1   */
-            {PosInf,         3123                 },   /*  1   */
-            {PosInf,         31.23                },   /*  1   */
-            {NegInf,         2                    },   /*  3   */
-            {NegInf,         3576                 },   /*  3   */
-            {1.1,            PosInf               },   /*  7   */
-            {6.2315,         PosInf               },   /*  7   */
-            {423511,         PosInf               },   /*  7   */
-            {-1.1,           PosInf               },   /*  7   */
-            {-6.2315,        PosInf               },   /*  7   */
-            {-423511,        PosInf               },   /*  7   */
-            {0.1234,         NegInf               },   /* 10   */
-            {-0.134,         NegInf               },   /* 10   */
-            {0.1234,         NegInf               },   /* 10   */
-            {0,              -1                   },   /* 14   */
-            {0,              -3                   },   /* 14   */
-            {0,              -1324391351          },   /* 14   */
-            {0,              -2                   },   /* 15   */
-            {0,              -35798               },   /* 15   */
-            {MAXLONG,       MAXLONG               }    /* 16   */
-        };
-
-    struct testCase retNegInf[] =
-        {
-            {NegInf,         1                    },   /*  4   */
-            {NegInf,         1324391315           },   /*  4   */
-            {-(MAXLONG),     MAXLONG              }    /* 17   */
-        };
-
-    struct testCase retNaN[] =
-        {
-            {1,              PosInf               },   /*  11  */
-            {1,              NegInf               },   /*  12  */
-            {-1,             -0.1                 },   /*  13  */
-            {-0.1,           -0.1                 },   /*  13  */
-            {-1324391351,    -0.1                 },   /*  13  */
-            {-3124.391351,   -0.1                 },   /*  13  */
-            {-1,             0.1                  },   /*  13  */
-            {-0.1,           0.1                  },   /*  13  */
-            {-1324391351,    0.1                  },   /*  13  */
-            {-3124.391351,   0.1                  }    /*  13  */
-        };
-
-    struct testCase retZero[] =
-        {
-            {PosInf,         -0.323               },   /*  2   */
-            {PosInf,         -1                   },   /*  2   */
-            {PosInf,         -1324391351          },   /*  2   */
-            {PosInf,         -3124.391351         },   /*  2   */
-            {NegInf,         -1                   },   /*  5   */
-            {NegInf,         -3                   },   /*  5   */
-            {NegInf,         -1324391351          },   /*  5   */
-            {NegInf,         -2                   },   /*  6   */
-            {NegInf,         -4                   },   /*  6   */
-            {NegInf,         -1243913514          },   /*  6   */
-            {0.132,          PosInf               },   /*  8   */
-            {-0.132,         PosInf               },   /*  8   */
-            {1.1,            NegInf               },   /*  9   */
-            {-1.1,           NegInf               },   /*  9   */
-            {2,              NegInf               },   /*  9   */
-            {3,              NegInf               },   /*  9   */
-            {-1324391353,    NegInf               },   /*  9   */
-            {1324391354,     NegInf               },   /*  9   */
-            {-31.24391353,   NegInf               },   /*  9   */
-            {31.24391353,    NegInf               },   /*  9   */
-            {MAXLONG,       -(MAXLONG)            },   /* 18   */
-            {-(MAXLONG),    -(MAXLONG)            }    /* 19   */
-        };
-
-
-    if (0 != (PAL_Initialize(argc, argv)))
-    {
-        return FAIL;
-    }
-
-    /* Loop through each case. Call pow on each number/exponent pair 
-       and check the result.
-    */
-    /* First those test cases returning positive infinity.          */
-    for(i = 0; i < sizeof(retPosInf) / sizeof(struct testCase); i++)
-    {
-        result = pow(retPosInf[i].Number, retPosInf[i].Exponent);
-
-        if ( result != PosInf )
-        {
-            Fail("ERROR: pow took '%f' to the exponent '%f' "
-                 "to be %f instead of %f.\n", 
-                 retPosInf[i].Number, 
-                 retPosInf[i].Exponent, 
-                 result, 
-                 PosInf);
-        }
-    }
-
-    /* First those test cases returning negative infinity.          */
-    for(i = 0; i < sizeof(retNegInf) / sizeof(struct testCase); i++)
-    {
-        result = pow(retNegInf[i].Number, retNegInf[i].Exponent);
-
-        if ( result != NegInf )
-        {
-            Fail("ERROR: pow took '%f' to the exponent '%f' "
-                 "to be %f instead of %f.\n", 
-                 retNegInf[i].Number, 
-                 retNegInf[i].Exponent, 
-                 result, 
-                 NegInf);
-        }
-    }
-
-    /* First those test cases returning non-numbers.          */
-    for(i = 0; i < sizeof(retNaN) / sizeof(struct testCase); i++)
-    {
-        result = pow(retNaN[i].Number, retNaN[i].Exponent);
-
-        if ( ! _isnan(result) )
-        {
-            Fail("ERROR: pow took '%f' to the exponent '%f' "
-                 "to be %f instead of %f.\n", 
-                 retNaN[i].Number, 
-                 retNaN[i].Exponent, 
-                 result, 
-                 NaN);
-        }
-    }
-
-    /* First those test cases returning zero.          */
-    for(i = 0; i < sizeof(retZero) / sizeof(struct testCase); i++)
-    {
-        result = pow(retZero[i].Number, retZero[i].Exponent);
-
-        if ( result != 0)
-        {
-            Fail("ERROR: pow took '%f' to the exponent '%f' "
-                 "to be %f instead of %f.\n", 
-                 retZero[i].Number, 
-                 retZero[i].Exponent, 
-                 result, 
-                 0.0);
-        }
-    }
-
-    PAL_Terminate();
-    return PASS;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pal/tests/palsuite/c_runtime/pow/test2/testinfo.dat b/src/pal/tests/palsuite/c_runtime/pow/test2/testinfo.dat
deleted file mode 100644 (file)
index 205baa8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-Version = 1.0
-Section = C Runtime
-Function = pow
-Name = Call pow with special input and output.
-TYPE = DEFAULT
-EXE1 = test2
-Description
-= Call the pow function with special input values or with
-= values that produce special output such as non-numbers
-= infinity or negative infinity.
-
diff --git a/src/pal/tests/palsuite/c_runtime/pow/test3/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/pow/test3/CMakeLists.txt
deleted file mode 100644 (file)
index 414c3ba..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12.2)
-
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
-set(SOURCES
-  test3.c
-)
-
-add_executable(paltest_pow_test3
-  ${SOURCES}
-)
-
-add_dependencies(paltest_pow_test3 coreclrpal)
-
-target_link_libraries(paltest_pow_test3
-  pthread
-  m
-  coreclrpal
-)
diff --git a/src/pal/tests/palsuite/c_runtime/pow/test3/test3.c b/src/pal/tests/palsuite/c_runtime/pow/test3/test3.c
deleted file mode 100644 (file)
index d01710b..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*=============================================================================
-**
-** Source: test3.c
-**
-** Purpose: Test to ensure that pow returns correct values.
-** 
-** Dependencies: PAL_Initialize
-**               PAL_Terminate
-**                              Fail
-**               fabs
-**               _finite
-**               _isnan
-** 
-
-**
-**===========================================================================*/
-
-#include <palsuite.h>
-
-#define DELTA 0.0000001  /* Error acceptance level to the 7th decimal */
-
-/**
- * Helper test structure
- */
-struct test1
-{
-    double value;       /* value to test the function with */
-    double exponent;    /* exponent to test */
-    double result;      /* expected result */
-};
-
-struct test2
-{
-    double value;       /* value to test the function with */
-    double exponent;    /* exponent to test */
-};
-
-
-/**
- * main
- * 
- * executable entry point
- */
-int __cdecl main(int argc, char **argv)
-{
-    int i;
-    double result;
-
-    struct test1 tests[] = 
-    {
-        /* Value        test result */
-        { 0.0, 0.0, 1.0 },
-        { 4.2, 0.0, 1.0 },
-        { 2.0, 3.0, 8.0 },
-        { 0.1, 3.25, 0.000562341325 },
-        { 1.0, 4.0, 1.000000000000 },
-        { 2.4, -6.8, 0.002597547849 },
-        { 3.75, 10.4, 933093.543524607670 },
-        { 7.63, -4.521, 0.000102354411 },
-        { 10, 5, 100000.000000000000 },
-        { 13.26, -2.11, 0.004279895490 },
-        { 18.1, 3.763, 54031.183101303657 },
-        { 25, 4.0001, 390750.757575723810 },
-        { 29.31, -5.997, 0.000000001593 }
-    };
-
-    struct test2 infinite[] =
-    {
-        { 0.0, -2.5 },
-        { 0.0, -1 }
-    };
-
-
-    /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
-    {
-           return (FAIL);
-    }
-
-    for( i = 0; i < sizeof(tests) / sizeof(struct test1); i++)
-    {
-        double testDelta;
-
-        result = pow( tests[i].value, tests[i].exponent );
-
-        /* The test is valid when the difference between the */
-        /* result and the expectation is less than DELTA */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "pow(%g,%g) returned %20.10g"
-                  " when it should have returned %20.10g\n",
-                  tests[i].value,
-                  tests[i].exponent,
-                  result, 
-                  tests[i].result );
-        }
-    }
-
-    for( i = 0; i < sizeof(infinite) / sizeof(struct test2); i++)
-    {
-        result = pow( infinite[i].value, infinite[i].exponent );
-
-        /* The test is valid when the function returns an infinite result */
-        if( _finite( result ) )
-        {
-            Fail( "pow(%g,%g) returned %20.10g"
-                  " when it should have returned 1.#INF00000000",
-                  infinite[i].value,
-                  infinite[i].exponent,
-                  result );
-        }
-    }
-
-    PAL_Terminate();
-    return PASS;
-}
index 701856b..bec58d4 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = sin(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("sin(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = sin(value);
+
+    if (!_isnan(result))
+    {
+        Fail("sin(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0,                0 },
-        { pi/2.0,           1 },
-        { pi,               0 },
-        { (3.0*pi) / 2.0,  -1 },
-        { 2.0 * pi,         0 },
-        { 5.0*pi/2.0,       1 },
-        { 3.0*pi,           0 },
-        { (7.0*pi) / 2.0,  -1 },
-        { 4.0 * pi,         0 }
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.31830988618379067,    0.31296179620778659,    PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.42077048331375735,    PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.59448076852482208,    PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.63896127631363480,    PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.64963693908006244,    PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.70710678118654752,    PAL_EPSILON },       // value:  pi / 4,         expected: 1 / sqrt(2)
+        {  1,                      0.84147098480789651,    PAL_EPSILON },
+        {  1.1283791670955126,     0.90371945743584630,    PAL_EPSILON },       // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     0.98776594599273553,    PAL_EPSILON },       // value:  sqrt(2)
+        {  1.4426950408889634,     0.99180624439366372,    PAL_EPSILON },       // value:  log2(e)
+        {  1.5707963267948966,     1,                      PAL_EPSILON * 10 },  // value:  pi / 2
+        {  2.3025850929940457,     0.74398033695749319,    PAL_EPSILON },       // value:  ln(10)
+        {  2.7182818284590452,     0.41078129050290870,    PAL_EPSILON },       // value:  e
+        {  3.1415926535897932,     0,                      PAL_EPSILON },       // value:  pi
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-
-        result = sin( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "sin(%g) returned %g"
-                  " when it should have returned %g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
+    validate_isnan(PAL_POSINF);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 05c49d6..57eae6b 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to sin() a series of angle value, checking that
 = each one return to correct value.
-
-
-
index c4cc54e..e790b16 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /*Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = sinh(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("sinh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = sinh(value);
+
+    if (!_isnan(result))
+    {
+        Fail("sinh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0,                0 },
-        { pi/2.0,           2.3012989 },
-        { pi,               11.5487394 },
-        { (3.0*pi) / 2.0,   55.6543976 },
-        { 2.0 * pi,         267.7448940 },
-        { 5.0*pi/2.0,       1287.9850539 },
-        { 3.0*pi,           6195.8238619 },
-        { (7.0*pi) / 2.0,   29804.8707287 },
-        { 4.0 * pi,         143375.6565151 }
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.31830988618379067,    0.32371243907207108,    PAL_EPSILON },           // value:  1 / pi
+        {  0.43429448190325183,    0.44807597941469025,    PAL_EPSILON },           // value:  log10(e)
+        {  0.63661977236758134,    0.68050167815224332,    PAL_EPSILON },           // value:  2 / pi
+        {  0.69314718055994531,    0.75,                   PAL_EPSILON },           // value:  ln(2)
+        {  0.70710678118654752,    0.76752314512611633,    PAL_EPSILON },           // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.86867096148600961,    PAL_EPSILON },           // value:  pi / 4
+        {  1,                      1.1752011936438015,     PAL_EPSILON * 10 },
+        {  1.1283791670955126,     1.3835428792038633,     PAL_EPSILON * 10 },      // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     1.9350668221743567,     PAL_EPSILON * 10 },      // value:  sqrt(2)
+        {  1.4426950408889634,     1.9978980091062796,     PAL_EPSILON * 10 },      // value:  log2(e)
+        {  1.5707963267948966,     2.3012989023072949,     PAL_EPSILON * 10 },      // value:  pi / 2
+        {  2.3025850929940457,     4.95,                   PAL_EPSILON * 10 },      // value:  ln(10)
+        {  2.7182818284590452,     7.5441371028169758,     PAL_EPSILON * 10 },      // value:  e
+        {  3.1415926535897932,     11.548739357257748,     PAL_EPSILON * 100 },     // value:  pi
+        {  PAL_POSINF,             PAL_POSINF,             0 },
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-
-        result = sinh( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "sinh(%g) returned %g"
-                  " when it should have returned %g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index ecffb06..f7aee40 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to sinh() a series of angle value, checking that
 = each one return to correct value.
-
-
-
index 028dc2c..62d2251 100644 (file)
 **
 **===================================================================*/
 
-/* Note: Calling sqrt on anything negative gives indefinite results. */
-
 #include <palsuite.h>
 
-struct testCase
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
+
+/**
+ * Helper test structure
+ */
+struct test
 {
-    double Value;
-    double CorrectValue;
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
-int __cdecl main(int argc, char **argv)
+/**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
 {
-    double delta;
-    double result=0;
-    int i=0;
+    double result = sqrt(value);
 
-    struct testCase testCases[] =
-        {
-            {100,  10},
-            {6.25, 2.5},
-            {0,    0},
-            {1.7e+308, 1.3038404810405297e+154} /* Max Double value */
-        };
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
 
-    if (0 != (PAL_Initialize(argc, argv)))
+    if (delta > variance)
     {
-        return FAIL;
+        Fail("sqrt(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
     }
+}
 
-    /* Loop through each case. Call sqrt on each value and check the 
-       result.
-    */
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = sqrt(value);
+
+    if (!_isnan(result))
+    {
+        Fail("sqrt(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
 
-    for(i = 0; i < sizeof(testCases) / sizeof(struct testCase); i++)
+int __cdecl main(int argc, char **argv)
+{
+    struct test tests[] = 
     {
-        result = sqrt(testCases[i].Value);
-        delta = pow(10, log10(testCases[i].Value) - 7);
+        /* value                   expected                variance */
+        {  0.31830988618379067,    0.56418958354775629,    PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.65901022898226081,    PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.79788456080286536,    PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.83255461115769776,    PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.84089641525371454,    PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.88622692545275801,    PAL_EPSILON },       // value:  pi / 4
+        {  1,                      1,                      PAL_EPSILON * 10 },
+        {  1.1283791670955126,     1.0622519320271969,     PAL_EPSILON * 10 },  // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     1.1892071150027211,     PAL_EPSILON * 10 },  // value:  sqrt(2)
+        {  1.4426950408889634,     1.2011224087864498,     PAL_EPSILON * 10 },  // value:  log2(e)
+        {  1.5707963267948966,     1.2533141373155003,     PAL_EPSILON * 10 },  // value:  pi / 2
+        {  2.3025850929940457,     1.5174271293851464,     PAL_EPSILON * 10 },  // value:  ln(10)
+        {  2.7182818284590452,     1.6487212707001281,     PAL_EPSILON * 10 },  // value:  e
+        {  3.1415926535897932,     1.7724538509055160,     PAL_EPSILON * 10 },  // value:  pi
+    };
+
+    /* PAL initialization */
+    if (PAL_Initialize(argc, argv) != 0)
+    {
+        return FAIL;
+    }
+    
+    validate(-0.0, -0.0, PAL_EPSILON);
+    validate( 0.0,  0.0, PAL_EPSILON);
 
-        if (fabs(testCases[i].CorrectValue - result) > delta)
-        {
-            Fail("ERROR: sqrt took the square root of '%f' to be '%f' "
-                 "instead of %f.\n", 
-                 testCases[i].Value, 
-                 result, 
-                 testCases[i].CorrectValue);
-        }
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
+    {
+        validate(tests[i].value, tests[i].expected, tests[i].variance);
+        validate_isnan(-tests[i].value);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index f30daca..443e5da 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /*Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = tan(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("tan(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = tan(value);
+
+    if (!_isnan(result))
+    {
+        Fail("tan(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0.001,          0.001 },
-        { 0.05,           0.050041708 },
-        { 0.5,            0.54630249 },
-        { 1,              1.557407725 },
-        { 2,             -2.185039863 },
-        { 3,             -0.142546543 },
-        { 4,              1.157821282 }
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.31830988618379067,    0.32951473309607836,    PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.46382906716062964,    PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.73930295048660405,    PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.83064087786078395,    PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.85451043200960189,    PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    1,                      PAL_EPSILON * 10 },  // value:  pi / 4
+        {  1,                      1.5574077246549022,     PAL_EPSILON * 10 },
+        {  1.1283791670955126,     2.1108768356626451,     PAL_EPSILON * 10 },  // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     6.3341191670421916,     PAL_EPSILON * 10 },  // value:  sqrt(2)
+        {  1.4426950408889634,     7.7635756709721848,     PAL_EPSILON * 10 },  // value:  log2(e)
+    // SEE BELOW -- {  1.5707963267948966,     PAL_POSINF,             0 },                 // value:  pi / 2
+        {  2.3025850929940457,    -1.1134071468135374,     PAL_EPSILON * 10 },  // value:  ln(10)
+        {  2.7182818284590452,    -0.45054953406980750,    PAL_EPSILON },       // value:  e
+        {  3.1415926535897932,     0,                      PAL_EPSILON },       // value:  pi
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-
-        result = tan( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "tan(%g) returned %g"
-                  " when it should have returned %g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
+    
+    // -- SPECIAL CASE --
+    // Normally, tan(pi / 2) would return PAL_POSINF (atan2(PAL_POSINF) does return (pi / 2)).
+    // However, it seems instead (on all supported systems), we get a different number entirely.
+    validate( 1.5707963267948966,  16331239353195370.0, 0);
+    validate(-1.5707963267948966, -16331239353195370.0, 0);
+    
+    validate_isnan(PAL_NEGINF);
+    validate_isnan(PAL_NAN);
+    validate_isnan(PAL_POSINF);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 26546d3..05d6cfe 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to tan() a series of angle value, checking that
 = each one return to correct value.
-
-
-
index f3452e8..3b8f879 100644 (file)
 ** 
 ** Dependencies: PAL_Initialize
 **               PAL_Terminate
-**                              Fail
+**               Fail
 **               fabs
-** 
-
 **
 **===========================================================================*/
 
 #include <palsuite.h>
 
-#define DELTA 0.0000001 /* Error acceptance level to the 7th decimal */
+// binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this 
+// is slightly too accurate when writing tests meant to run against libm implementations
+// for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
+//
+// The tests themselves will take PAL_EPSILON and adjust it according to the expected result
+// so that the delta used for comparison will compare the most significant digits and ignore
+// any digits that are outside the double precision range (15-17 digits).
+
+// For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
+// PAL_EPSILON for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
+// will use PAL_EPSILON / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
+// use PAL_EPSILON * 10.
+#define PAL_EPSILON 8.8817841970012523e-16
+
+#define PAL_NAN     sqrt(-1.0)
+#define PAL_POSINF -log(0.0)
+#define PAL_NEGINF  log(0.0)
 
 /**
  * Helper test structure
  */
 struct test
 {
-    double value;   /* value to test the function with */
-    double result;  /* expected result */
+    double value;     /* value to test the function with */
+    double expected;  /* expected result */
+    double variance;  /* maximum delta between the expected and actual result */
 };
 
 /**
+ * validate
+ *
+ * test validation function
+ */
+void __cdecl validate(double value, double expected, double variance)
+{
+    double result = tanh(value);
+
+    /*
+     * The test is valid when the difference between result
+     * and expected is less than or equal to variance
+     */
+    double delta = fabs(result - expected);
+
+    if (delta > variance)
+    {
+        Fail("tanh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, expected);
+    }
+}
+
+/**
+ * validate
+ *
+ * test validation function for values returning NaN
+ */
+void __cdecl validate_isnan(double value)
+{
+    double result = tanh(value);
+
+    if (!_isnan(result))
+    {
+        Fail("tanh(%g) returned %20.17g when it should have returned %20.17g",
+             value, result, PAL_NAN);
+    }
+}
+
+/**
  * main
  * 
  * executable entry point
  */
-INT __cdecl main(INT argc, CHAR **argv)
+int __cdecl main(int argc, char **argv)
 {
-    double pi = 3.1415926535;
-    int i;
-
     struct test tests[] = 
     {
-        /* Value        test result */
-        { 0,                0 },
-        { pi/2.0,           0.9171523 },
-        { pi,               0.9962721 },
-        { (3.0*pi) / 2.0,   0.9998386 },
-        { 2.0 * pi,         0.9999930 },
-        { 5.0*pi/2.0,       0.9999997 },
-        { 3.0*pi,           1 },
-        { (7.0*pi) / 2.0,   1 },
-        { 4.0 * pi,         1 }
+        /* value                   expected                variance */
+        {  0,                      0,                      PAL_EPSILON },
+        {  0.31830988618379067,    0.30797791269089433,    PAL_EPSILON },       // value:  1 / pi
+        {  0.43429448190325183,    0.40890401183401433,    PAL_EPSILON },       // value:  log10(e)
+        {  0.63661977236758134,    0.56259360033158334,    PAL_EPSILON },       // value:  2 / pi
+        {  0.69314718055994531,    0.6,                    PAL_EPSILON },       // value:  ln(2)
+        {  0.70710678118654752,    0.60885936501391381,    PAL_EPSILON },       // value:  1 / sqrt(2)
+        {  0.78539816339744831,    0.65579420263267244,    PAL_EPSILON },       // value:  pi / 4
+        {  1,                      0.76159415595576489,    PAL_EPSILON },
+        {  1.1283791670955126,     0.81046380599898809,    PAL_EPSILON },       // value:  2 / sqrt(pi)
+        {  1.4142135623730950,     0.88838556158566054,    PAL_EPSILON },       // value:  sqrt(2)
+        {  1.4426950408889634,     0.89423894585503855,    PAL_EPSILON },       // value:  log2(e)
+        {  1.5707963267948966,     0.91715233566727435,    PAL_EPSILON },       // value:  pi / 2
+        {  2.3025850929940457,     0.98019801980198020,    PAL_EPSILON },       // value:  ln(10)
+        {  2.7182818284590452,     0.99132891580059984,    PAL_EPSILON },       // value:  e
+        {  3.1415926535897932,     0.99627207622074994,    PAL_EPSILON },       // value:  pi
+        {  PAL_POSINF,             1,                      PAL_EPSILON * 10 }
     };
 
-
     /* PAL initialization */
-    if( PAL_Initialize(argc, argv) != 0 )
+    if (PAL_Initialize(argc, argv) != 0)
     {
-           return (FAIL);
+        return FAIL;
     }
 
-    for( i = 0; i < sizeof(tests) / sizeof(struct test); i++)
+    for (int i = 0; i < (sizeof(tests) / sizeof(struct test)); i++)
     {
-        double result;
-        double testDelta;
-
-
-        result = tanh( tests[i].value );
-
-        /*
-         * The test is valid when the difference between the
-         * result and the expectation is less than DELTA
-         */
-        testDelta = fabs( result - tests[i].result );
-        if( testDelta >= DELTA )
-        {
-            Fail( "tanh(%g) returned %g"
-                  " when it should have returned %g",
-                  tests[i].value,
-                  result, 
-                  tests[i].result );
-        }
+        validate( tests[i].value,  tests[i].expected, tests[i].variance);
+        validate(-tests[i].value, -tests[i].expected, tests[i].variance);
     }
+    
+    validate_isnan(PAL_NAN);
 
     PAL_Terminate();
     return PASS;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 6af765c..1b2bc91 100644 (file)
@@ -11,6 +11,3 @@ EXE1 = test1
 Description
 = Passes to tanh() a series of angle value, checking that
 = each one return to correct value.
-
-
-
index ddadfe5..d0a76e9 100644 (file)
@@ -15,9 +15,8 @@ c_runtime/errno/test1/paltest_errno_test1
 c_runtime/errno/test2/paltest_errno_test2
 c_runtime/exit/test1/paltest_exit_test1
 c_runtime/exp/test1/paltest_exp_test1
-c_runtime/exp/test2/paltest_exp_test2
-c_runtime/exp/test3/paltest_exp_test3
 c_runtime/fabs/test1/paltest_fabs_test1
+c_runtime/fabsf/test1/paltest_fabsf_test1
 c_runtime/fclose/test1/paltest_fclose_test1
 c_runtime/fclose/test2/paltest_fclose_test2
 c_runtime/fflush/test1/paltest_fflush_test1
@@ -26,6 +25,7 @@ c_runtime/fgets/test2/paltest_fgets_test2
 c_runtime/fgets/test3/paltest_fgets_test3
 c_runtime/floor/test1/paltest_floor_test1
 c_runtime/fmod/test1/paltest_fmod_test1
+c_runtime/fmodf/test1/paltest_fmodf_test1
 c_runtime/fopen/test1/paltest_fopen_test1
 c_runtime/fopen/test2/paltest_fopen_test2
 c_runtime/fopen/test3/paltest_fopen_test3
@@ -102,9 +102,8 @@ c_runtime/memcpy/test1/paltest_memcpy_test1
 c_runtime/memmove/test1/paltest_memmove_test1
 c_runtime/memset/test1/paltest_memset_test1
 c_runtime/modf/test1/paltest_modf_test1
+c_runtime/modff/test1/paltest_modff_test1
 c_runtime/pow/test1/paltest_pow_test1
-c_runtime/pow/test2/paltest_pow_test2
-c_runtime/pow/test3/paltest_pow_test3
 c_runtime/printf/test1/paltest_printf_test1
 c_runtime/printf/test10/paltest_printf_test10
 c_runtime/printf/test11/paltest_printf_test11
@@ -469,7 +468,6 @@ filemapping_memmgt/LocalFree/test1/paltest_localfree_test1
 filemapping_memmgt/LocalFree/test2/paltest_localfree_test2
 filemapping_memmgt/LockFile/test2/paltest_lockfile_test2
 filemapping_memmgt/LockFile/test7/paltest_lockfile_test7
-filemapping_memmgt/MapViewOfFile/test1/paltest_mapviewoffile_test1
 filemapping_memmgt/MapViewOfFile/test2/paltest_mapviewoffile_test2
 filemapping_memmgt/MapViewOfFile/test3/paltest_mapviewoffile_test3
 filemapping_memmgt/MapViewOfFile/test4/paltest_mapviewoffile_test4
index e667714..36b48d6 100644 (file)
@@ -139,9 +139,8 @@ c_runtime/errno/test1,1
 c_runtime/errno/test2,1
 c_runtime/exit/test1,1
 c_runtime/exp/test1,1
-c_runtime/exp/test2,1
-c_runtime/exp/test3,1
 c_runtime/fabs/test1,1
+c_runtime/fabsf/test1,1
 c_runtime/fclose/test1,1
 c_runtime/fclose/test2,1
 c_runtime/feof/test1,1
@@ -153,6 +152,7 @@ c_runtime/fgets/test2,1
 c_runtime/fgets/test3,1
 c_runtime/floor/test1,1
 c_runtime/fmod/test1,1
+c_runtime/fmodf/test1,1
 c_runtime/fopen/test1,1
 c_runtime/fopen/test2,1
 c_runtime/fopen/test3,1
@@ -238,8 +238,6 @@ c_runtime/memmove/test1,1
 c_runtime/memset/test1,1
 c_runtime/modf/test1,1
 c_runtime/pow/test1,1
-c_runtime/pow/test2,1
-c_runtime/pow/test3,1
 c_runtime/printf/test1,1
 c_runtime/printf/test2,1
 c_runtime/printf/test3,1
index 4d552ca..3726214 100644 (file)
@@ -30,10 +30,12 @@ const char *const GlobalShmFilePathPrefix = "/tmp/.dotnet/shm/global/";
 #define MaxPathSize (200)
 const DWORD PollLoopSleepMilliseconds = 100;
 const DWORD FailTimeoutMilliseconds = 30000;
+DWORD g_expectedTimeoutMilliseconds = 500;
 
-bool isParent;
-char processPath[4096], processCommandLinePath[4096];
-DWORD parentPid = static_cast<DWORD>(-1);
+bool g_isParent = true;
+bool g_isStress = false;
+char g_processPath[4096], g_processCommandLinePath[4096];
+DWORD g_parentPid = static_cast<DWORD>(-1);
 
 extern char *(*test_strcpy)(char *dest, const char *src);
 extern int (*test_strcmp)(const char *s1, const char *s2);
@@ -56,7 +58,7 @@ extern bool WriteHeaderInfo(const char *path, char sharedMemoryType, char versio
     { \
         if (!(expression)) \
         { \
-            if (!isParent) \
+            if (!g_isParent) \
             { \
                 Trace("Child process: "); \
             } \
@@ -66,7 +68,7 @@ extern bool WriteHeaderInfo(const char *path, char sharedMemoryType, char versio
         } \
     } while(false)
 
-char *BuildName(char *buffer, const char *prefix0 = nullptr, const char *prefix1 = nullptr)
+char *BuildName(const char *testName, char *buffer, const char *prefix0, const char *prefix1 = nullptr)
 {
     size_t nameLength = 0;
     const char *prefixes[] = {prefix0, prefix1};
@@ -80,18 +82,34 @@ char *BuildName(char *buffer, const char *prefix0 = nullptr, const char *prefix1
         test_strcpy(&buffer[nameLength], prefix);
         nameLength += test_strlen(prefix);
     }
-    test_sprintf(&buffer[nameLength], "%u", parentPid);
+
+    if (g_isStress)
+    {
+        // Append the test name so that tests can run in parallel
+        nameLength += test_sprintf(&buffer[nameLength], "%s", testName);
+        buffer[nameLength++] = '_';
+    }
+
+    nameLength += test_sprintf(&buffer[nameLength], "%u", g_parentPid);
     return buffer;
 }
 
-char *BuildGlobalShmFilePath(char *buffer, const char *namePrefix)
+char *BuildGlobalShmFilePath(const char *testName, char *buffer, const char *namePrefix)
 {
     size_t pathLength = 0;
     test_strcpy(&buffer[pathLength], GlobalShmFilePathPrefix);
     pathLength += test_strlen(GlobalShmFilePathPrefix);
     test_strcpy(&buffer[pathLength], namePrefix);
     pathLength += test_strlen(namePrefix);
-    test_sprintf(&buffer[pathLength], "%u", parentPid);
+
+    if (g_isStress)
+    {
+        // Append the test name so that tests can run in parallel
+        pathLength += test_sprintf(&buffer[pathLength], "%s", testName);
+        buffer[pathLength++] = '_';
+    }
+
+    pathLength += test_sprintf(&buffer[pathLength], "%u", g_parentPid);
     return buffer;
 }
 
@@ -167,41 +185,62 @@ HANDLE TestOpenMutex(const char *name)
 
 bool StartProcess(const char *funcName)
 {
+    // Command line format: <processPath> <parentPid> <testFunctionName> [stress]
+
     size_t processCommandLinePathLength = 0;
-    processCommandLinePath[processCommandLinePathLength++] = '\"';
-    test_strcpy(&processCommandLinePath[processCommandLinePathLength], processPath);
-    processCommandLinePathLength += test_strlen(processPath);
-    processCommandLinePath[processCommandLinePathLength++] = '\"';
-    processCommandLinePath[processCommandLinePathLength++] = ' ';
-    processCommandLinePathLength += test_sprintf(&processCommandLinePath[processCommandLinePathLength], "%u", parentPid);
-    processCommandLinePath[processCommandLinePathLength++] = ' ';
-    test_strcpy(&processCommandLinePath[processCommandLinePathLength], funcName);
+    g_processCommandLinePath[processCommandLinePathLength++] = '\"';
+    test_strcpy(&g_processCommandLinePath[processCommandLinePathLength], g_processPath);
+    processCommandLinePathLength += test_strlen(g_processPath);
+    g_processCommandLinePath[processCommandLinePathLength++] = '\"';
+    g_processCommandLinePath[processCommandLinePathLength++] = ' ';
+    processCommandLinePathLength += test_sprintf(&g_processCommandLinePath[processCommandLinePathLength], "%u", g_parentPid);
+    g_processCommandLinePath[processCommandLinePathLength++] = ' ';
+    test_strcpy(&g_processCommandLinePath[processCommandLinePathLength], funcName);
     processCommandLinePathLength += test_strlen(funcName);
 
+    if (g_isStress)
+    {
+        test_strcpy(&g_processCommandLinePath[processCommandLinePathLength], " stress");
+        processCommandLinePathLength += _countof("stress") - 1;
+    }
+
     STARTUPINFO si;
     memset(&si, 0, sizeof(si));
     si.cb = sizeof(si);
     PROCESS_INFORMATION pi;
     memset(&pi, 0, sizeof(pi));
-    return !!CreateProcessA(nullptr, processCommandLinePath, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi);
+    if (!CreateProcessA(nullptr, g_processCommandLinePath, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi))
+    {
+        return false;
+    }
+    CloseHandle(pi.hProcess);
+    CloseHandle(pi.hThread);
+    return true;
 }
 
-bool StartThread(LPTHREAD_START_ROUTINE func)
+bool StartThread(LPTHREAD_START_ROUTINE func, void *arg = nullptr, HANDLE *threadHandleRef = nullptr)
 {
     DWORD threadId;
-    HANDLE handle = CreateThread(nullptr, 0, func, nullptr, 0, &threadId);
+    HANDLE handle = CreateThread(nullptr, 0, func, arg, 0, &threadId);
     if (handle != nullptr)
     {
-        CloseHandle(handle);
+        if (threadHandleRef == nullptr)
+        {
+            CloseHandle(handle);
+        }
+        else
+        {
+            *threadHandleRef = handle;
+        }
         return true;
     }
     return false;
 }
 
-bool WaitForMutexToBeCreated(AutoCloseMutexHandle &m, const char *eventNamePrefix)
+bool WaitForMutexToBeCreated(const char *testName, AutoCloseMutexHandle &m, const char *eventNamePrefix)
 {
     char eventName[MaxPathSize];
-    BuildName(eventName, GlobalPrefix, eventNamePrefix);
+    BuildName(testName, eventName, GlobalPrefix, eventNamePrefix);
     DWORD startTime = GetTickCount();
     while (true)
     {
@@ -227,15 +266,15 @@ bool WaitForMutexToBeCreated(AutoCloseMutexHandle &m, const char *eventNamePrefi
 // YieldToParent() below control the releasing, waiting, and ping-ponging, to help create a deterministic path through the
 // parent and child tests while both are running concurrently.
 
-bool AcquireChildRunningEvent(AutoCloseMutexHandle &childRunningEvent)
+bool AcquireChildRunningEvent(const char *testName, AutoCloseMutexHandle &childRunningEvent)
 {
     char name[MaxPathSize];
-    TestCreateMutex(childRunningEvent, BuildName(name, GlobalPrefix, ChildRunningEventNamePrefix));
+    TestCreateMutex(childRunningEvent, BuildName(testName, name, GlobalPrefix, ChildRunningEventNamePrefix));
     TestAssert(WaitForSingleObject(childRunningEvent, FailTimeoutMilliseconds) == WAIT_OBJECT_0);
     return true;
 }
 
-bool InitializeParent(AutoCloseMutexHandle parentEvents[2], AutoCloseMutexHandle childEvents[2])
+bool InitializeParent(const char *testName, AutoCloseMutexHandle parentEvents[2], AutoCloseMutexHandle childEvents[2])
 {
     // Create parent events
     char name[MaxPathSize];
@@ -243,19 +282,19 @@ bool InitializeParent(AutoCloseMutexHandle parentEvents[2], AutoCloseMutexHandle
     {
         TestCreateMutex(
             parentEvents[i],
-            BuildName(name, GlobalPrefix, i == 0 ? ParentEventNamePrefix0 : ParentEventNamePrefix1),
+            BuildName(testName, name, GlobalPrefix, i == 0 ? ParentEventNamePrefix0 : ParentEventNamePrefix1),
             true);
         TestAssert(parentEvents[i] != nullptr);
         TestAssert(GetLastError() != ERROR_ALREADY_EXISTS);
     }
 
     // Wait for the child to create and acquire locks on its events so that the parent can wait on them
-    TestAssert(WaitForMutexToBeCreated(childEvents[0], ChildEventNamePrefix0));
-    TestAssert(WaitForMutexToBeCreated(childEvents[1], ChildEventNamePrefix1));
+    TestAssert(WaitForMutexToBeCreated(testName, childEvents[0], ChildEventNamePrefix0));
+    TestAssert(WaitForMutexToBeCreated(testName, childEvents[1], ChildEventNamePrefix1));
     return true;
 }
 
-bool UninitializeParent(AutoCloseMutexHandle parentEvents[2], bool releaseParentEvents = true)
+bool UninitializeParent(const char *testName, AutoCloseMutexHandle parentEvents[2], bool releaseParentEvents = true)
 {
     if (releaseParentEvents)
     {
@@ -267,17 +306,18 @@ bool UninitializeParent(AutoCloseMutexHandle parentEvents[2], bool releaseParent
     // 'childRunningEvent', so after this wait, the parent process can freely start another child that will deterministically
     // recreate the 'childEvents', which the next parent test will wait on, upon its initialization.
     AutoCloseMutexHandle childRunningEvent;
-    TestAssert(AcquireChildRunningEvent(childRunningEvent));
+    TestAssert(AcquireChildRunningEvent(testName, childRunningEvent));
     TestAssert(childRunningEvent.Release());
     return true;
 }
 
 bool InitializeChild(
+    const char *testName,
     AutoCloseMutexHandle &childRunningEvent,
     AutoCloseMutexHandle parentEvents[2],
     AutoCloseMutexHandle childEvents[2])
 {
-    TestAssert(AcquireChildRunningEvent(childRunningEvent));
+    TestAssert(AcquireChildRunningEvent(testName, childRunningEvent));
 
     // Create child events
     char name[MaxPathSize];
@@ -285,15 +325,15 @@ bool InitializeChild(
     {
         TestCreateMutex(
             childEvents[i],
-            BuildName(name, GlobalPrefix, i == 0 ? ChildEventNamePrefix0 : ChildEventNamePrefix1),
+            BuildName(testName, name, GlobalPrefix, i == 0 ? ChildEventNamePrefix0 : ChildEventNamePrefix1),
             true);
         TestAssert(childEvents[i] != nullptr);
         TestAssert(GetLastError() != ERROR_ALREADY_EXISTS);
     }
 
     // Wait for the parent to create and acquire locks on its events so that the child can wait on them
-    TestAssert(WaitForMutexToBeCreated(parentEvents[0], ParentEventNamePrefix0));
-    TestAssert(WaitForMutexToBeCreated(parentEvents[1], ParentEventNamePrefix1));
+    TestAssert(WaitForMutexToBeCreated(testName, parentEvents[0], ParentEventNamePrefix0));
+    TestAssert(WaitForMutexToBeCreated(testName, parentEvents[1], ParentEventNamePrefix1));
 
     // Parent/child tests start with the parent, so after initialization, wait for the parent to tell the child test to start
     TestAssert(WaitForSingleObject(parentEvents[0], FailTimeoutMilliseconds) == WAIT_OBJECT_0);
@@ -343,6 +383,8 @@ bool YieldToParent(AutoCloseMutexHandle parentEvents[2], AutoCloseMutexHandle ch
 
 bool NameTests()
 {
+    const char *testName = "NameTests";
+
     AutoCloseMutexHandle m;
     char name[MaxPathSize];
 
@@ -351,15 +393,15 @@ bool NameTests()
     TestAssert(m != nullptr);
 
     // Normal name
-    TestCreateMutex(m, BuildName(name, NamePrefix));
+    TestCreateMutex(m, BuildName(testName, name, NamePrefix));
     TestAssert(m != nullptr);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, NamePrefix))) != nullptr);
-    TestCreateMutex(m, BuildName(name, SessionPrefix, NamePrefix));
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, NamePrefix))) != nullptr);
+    TestCreateMutex(m, BuildName(testName, name, SessionPrefix, NamePrefix));
     TestAssert(m != nullptr);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, SessionPrefix, NamePrefix))) != nullptr);
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, SessionPrefix, NamePrefix))) != nullptr);
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
     TestAssert(m != nullptr);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, GlobalPrefix, NamePrefix))) != nullptr);
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, GlobalPrefix, NamePrefix))) != nullptr);
 
     // Name too long. The maximum allowed length depends on the file system, so we're not checking for that.
     {
@@ -374,33 +416,33 @@ bool NameTests()
     }
 
     // Invalid characters in name
-    TestCreateMutex(m, BuildName(name, InvalidNamePrefix0));
+    TestCreateMutex(m, BuildName(testName, name, InvalidNamePrefix0));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, InvalidNamePrefix0))) == nullptr);
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, InvalidNamePrefix0))) == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestCreateMutex(m, BuildName(name, InvalidNamePrefix1));
+    TestCreateMutex(m, BuildName(testName, name, InvalidNamePrefix1));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, InvalidNamePrefix1))) == nullptr);
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, InvalidNamePrefix1))) == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestCreateMutex(m, BuildName(name, SessionPrefix, InvalidNamePrefix0));
+    TestCreateMutex(m, BuildName(testName, name, SessionPrefix, InvalidNamePrefix0));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, SessionPrefix, InvalidNamePrefix0))) == nullptr);
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, SessionPrefix, InvalidNamePrefix0))) == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, InvalidNamePrefix1));
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, InvalidNamePrefix1));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
-    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(name, GlobalPrefix, InvalidNamePrefix1))) == nullptr);
+    TestAssert(AutoCloseMutexHandle(TestOpenMutex(BuildName(testName, name, GlobalPrefix, InvalidNamePrefix1))) == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_NAME);
 
     // Creating a second reference to the same named mutex yields an error indicating that it was opened, not created
     {
-        TestCreateMutex(m, BuildName(name, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, NamePrefix));
         TestAssert(m != nullptr);
         AutoCloseMutexHandle m2;
-        TestCreateMutex(m2, BuildName(name, NamePrefix));
+        TestCreateMutex(m2, BuildName(testName, name, NamePrefix));
         TestAssert(m2 != nullptr);
         TestAssert(GetLastError() == ERROR_ALREADY_EXISTS);
     }
@@ -410,41 +452,46 @@ bool NameTests()
 
 bool HeaderMismatchTests()
 {
+    const char *testName = "HeaderMismatchTests";
+
     AutoCloseMutexHandle m, m2;
     char name[MaxPathSize];
     int fd;
 
     // Create and hold onto a mutex during this test to create the shared memory directory
-    TestCreateMutex(m2, BuildName(name, GlobalPrefix, TempNamePrefix));
+    TestCreateMutex(m2, BuildName(testName, name, GlobalPrefix, TempNamePrefix));
+    TestAssert(m2 != nullptr);
 
     // Unknown shared memory type
-    TestAssert(WriteHeaderInfo(BuildGlobalShmFilePath(name, NamePrefix), -1, 0, &fd));
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+    TestAssert(WriteHeaderInfo(BuildGlobalShmFilePath(testName, name, NamePrefix), -1, 1, &fd));
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_HANDLE);
     TestAssert(test_close(fd) == 0);
-    TestAssert(test_unlink(BuildGlobalShmFilePath(name, NamePrefix)) == 0);
+    TestAssert(test_unlink(BuildGlobalShmFilePath(testName, name, NamePrefix)) == 0);
 
     // Mismatched version
-    TestAssert(WriteHeaderInfo(BuildGlobalShmFilePath(name, NamePrefix), 0, -1, &fd));
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+    TestAssert(WriteHeaderInfo(BuildGlobalShmFilePath(testName, name, NamePrefix), 0, -1, &fd));
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
     TestAssert(m == nullptr);
     TestAssert(GetLastError() == ERROR_INVALID_HANDLE);
     TestAssert(test_close(fd) == 0);
-    TestAssert(test_unlink(BuildGlobalShmFilePath(name, NamePrefix)) == 0);
+    TestAssert(test_unlink(BuildGlobalShmFilePath(testName, name, NamePrefix)) == 0);
 
     return true;
 }
 
 bool MutualExclusionTests_Parent()
 {
+    const char *testName = "MutualExclusionTests";
+
     AutoCloseMutexHandle parentEvents[2], childEvents[2];
-    TestAssert(InitializeParent(parentEvents, childEvents));
+    TestAssert(InitializeParent(testName, parentEvents, childEvents));
     int ei = 0;
     char name[MaxPathSize];
     AutoCloseMutexHandle m;
 
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
     TestAssert(m != nullptr);
 
     // Recursive locking with various timeouts
@@ -460,7 +507,7 @@ bool MutualExclusionTests_Parent()
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child takes the lock
 
     TestAssert(WaitForSingleObject(m, 0) == WAIT_TIMEOUT); // try to lock the mutex without waiting
-    TestAssert(WaitForSingleObject(m, 500) == WAIT_TIMEOUT); // try to lock the mutex with a timeout
+    TestAssert(WaitForSingleObject(m, g_expectedTimeoutMilliseconds) == WAIT_TIMEOUT); // try to lock the mutex with a timeout
     TestAssert(!m.Release()); // try to release the lock while another thread owns it
     TestAssert(GetLastError() == ERROR_NOT_OWNER);
 
@@ -469,21 +516,23 @@ bool MutualExclusionTests_Parent()
     TestAssert(WaitForSingleObject(m, static_cast<DWORD>(-1)) == WAIT_OBJECT_0); // lock the mutex with no timeout and release
     TestAssert(m.Release());
 
-    UninitializeParent(parentEvents);
+    UninitializeParent(testName, parentEvents);
     return true;
 }
 
 DWORD MutualExclusionTests_Child(void *arg = nullptr)
 {
+    const char *testName = "MutualExclusionTests";
+
     AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-    TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+    TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
     int ei = 0;
 
     {
         char name[MaxPathSize];
         AutoCloseMutexHandle m;
 
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(WaitForSingleObject(m, 0) == WAIT_OBJECT_0); // lock the mutex
         YieldToParent(parentEvents, childEvents, ei); // parent attempts to lock/release, and fails
@@ -496,18 +545,20 @@ DWORD MutualExclusionTests_Child(void *arg = nullptr)
 
 bool MutualExclusionTests()
 {
+    const char *testName = "MutualExclusionTests";
+
     {
         AutoCloseMutexHandle m;
         char name[MaxPathSize];
 
         // Releasing a lock that is not owned by any thread fails
-        TestCreateMutex(m, BuildName(name, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(!m.Release());
         TestAssert(GetLastError() == ERROR_NOT_OWNER);
 
         // Acquire a lock during upon creation, and release
-        TestCreateMutex(m, BuildName(name, NamePrefix), true);
+        TestCreateMutex(m, BuildName(testName, name, NamePrefix), true);
         TestAssert(m != nullptr);
         TestAssert(m.Release());
 
@@ -545,38 +596,42 @@ bool MutualExclusionTests()
 
 bool LifetimeTests_Parent()
 {
+    const char *testName = "LifetimeTests";
+
     AutoCloseMutexHandle parentEvents[2], childEvents[2];
-    TestAssert(InitializeParent(parentEvents, childEvents));
+    TestAssert(InitializeParent(testName, parentEvents, childEvents));
     int ei = 0;
     char name[MaxPathSize];
     AutoCloseMutexHandle m;
 
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix)); // create first reference to mutex
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix)); // create first reference to mutex
     TestAssert(m != nullptr);
-    TestAssert(TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child creates second reference to mutex using CreateMutex
     m.Close(); // close first reference
-    TestAssert(TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child closes second reference
-    TestAssert(!TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(!TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
 
-    TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix)); // create first reference to mutex
+    TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix)); // create first reference to mutex
     TestAssert(m != nullptr);
-    TestAssert(TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child creates second reference to mutex using OpenMutex
     m.Close(); // close first reference
-    TestAssert(TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child closes second reference
-    TestAssert(!TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+    TestAssert(!TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
 
-    UninitializeParent(parentEvents);
+    UninitializeParent(testName, parentEvents);
     return true;
 }
 
 DWORD LifetimeTests_Child(void *arg = nullptr)
 {
+    const char *testName = "LifetimeTests";
+
     AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-    TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+    TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
     int ei = 0;
 
     {
@@ -584,13 +639,13 @@ DWORD LifetimeTests_Child(void *arg = nullptr)
         AutoCloseMutexHandle m;
 
         // ... parent creates first reference to mutex
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix)); // create second reference to mutex using CreateMutex
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix)); // create second reference to mutex using CreateMutex
         TestAssert(m != nullptr);
         TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent closes first reference
         m.Close(); // close second reference
 
         TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent verifies, and creates first reference to mutex again
-        m = TestOpenMutex(BuildName(name, GlobalPrefix, NamePrefix)); // create second reference to mutex using OpenMutex
+        m = TestOpenMutex(BuildName(testName, name, GlobalPrefix, NamePrefix)); // create second reference to mutex using OpenMutex
         TestAssert(m != nullptr);
         TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent closes first reference
         m.Close(); // close second reference
@@ -604,16 +659,18 @@ DWORD LifetimeTests_Child(void *arg = nullptr)
 
 bool LifetimeTests()
 {
+    const char *testName = "LifetimeTests";
+
     {
         AutoCloseMutexHandle m;
         char name[MaxPathSize];
 
         // Shm file should be created and deleted
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
-        TestAssert(TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+        TestAssert(TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
         m.Close();
-        TestAssert(!TestFileExists(BuildGlobalShmFilePath(name, NamePrefix)));
+        TestAssert(!TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)));
     }
 
     // Shm file should not be deleted until last reference is released
@@ -629,39 +686,41 @@ DWORD AbandonTests_Child_TryLock(void *arg = nullptr);
 
 bool AbandonTests_Parent()
 {
+    const char *testName = "AbandonTests";
+
+    char name[MaxPathSize];
     AutoCloseMutexHandle m;
     {
         AutoCloseMutexHandle parentEvents[2], childEvents[2];
-        TestAssert(InitializeParent(parentEvents, childEvents));
+        TestAssert(InitializeParent(testName, parentEvents, childEvents));
         int ei = 0;
-        char name[MaxPathSize];
 
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child locks mutex
         TestAssert(parentEvents[0].Release());
         TestAssert(parentEvents[1].Release()); // child sleeps for short duration and abandons the mutex
         TestAssert(WaitForSingleObject(m, FailTimeoutMilliseconds) == WAIT_ABANDONED_0); // attempt to lock and see abandoned mutex
 
-        UninitializeParent(parentEvents, false /* releaseParentEvents */); // parent events are released above
+        UninitializeParent(testName, parentEvents, false /* releaseParentEvents */); // parent events are released above
     }
 
     // Verify that the mutex lock is owned by this thread, by starting a new thread and trying to lock it
     StartThread(AbandonTests_Child_TryLock);
     {
         AutoCloseMutexHandle parentEvents[2], childEvents[2];
-        TestAssert(InitializeParent(parentEvents, childEvents));
+        TestAssert(InitializeParent(testName, parentEvents, childEvents));
         int ei = 0;
 
         TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child tries to lock mutex
 
-        UninitializeParent(parentEvents);
+        UninitializeParent(testName, parentEvents);
     }
 
     // Verify that the mutex lock is owned by this thread, by starting a new process and trying to lock it
     StartProcess("AbandonTests_Child_TryLock");
     AutoCloseMutexHandle parentEvents[2], childEvents[2];
-    TestAssert(InitializeParent(parentEvents, childEvents));
+    TestAssert(InitializeParent(testName, parentEvents, childEvents));
     int ei = 0;
 
     TestAssert(YieldToChild(parentEvents, childEvents, ei)); // child tries to lock mutex
@@ -671,14 +730,33 @@ bool AbandonTests_Parent()
     TestAssert(WaitForSingleObject(m, FailTimeoutMilliseconds) == WAIT_OBJECT_0); // lock again to see it's not abandoned anymore
     TestAssert(m.Release());
 
-    UninitializeParent(parentEvents, false /* releaseParentEvents */); // parent events are released above
+    UninitializeParent(testName, parentEvents, false /* releaseParentEvents */); // parent events are released above
+
+    // Since the child abandons the mutex, and a child process may not release the file lock on the shared memory file before
+    // indicating completion to the parent, make sure to delete the shared memory file by repeatedly opening/closing the mutex
+    // until the parent process becomes the last process to reference the mutex and closing it deletes the file.
+    DWORD startTime = GetTickCount();
+    while (true)
+    {
+        m.Close();
+        if (!TestFileExists(BuildGlobalShmFilePath(testName, name, NamePrefix)))
+        {
+            break;
+        }
+
+        TestAssert(GetTickCount() - startTime < FailTimeoutMilliseconds);
+        m = TestOpenMutex(BuildName(testName, name, GlobalPrefix, NamePrefix));
+    }
+
     return true;
 }
 
-DWORD AbandonTests_Child_GracefulExit(void *arg = nullptr)
+DWORD AbandonTests_Child_GracefulExit_Close(void *arg = nullptr)
 {
+    const char *testName = "AbandonTests";
+
     AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-    TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+    TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
     int ei = 0;
 
     {
@@ -686,22 +764,28 @@ DWORD AbandonTests_Child_GracefulExit(void *arg = nullptr)
         AutoCloseMutexHandle m;
 
         // ... parent waits for child to lock mutex
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(WaitForSingleObject(m, 0) == WAIT_OBJECT_0);
         TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent waits on mutex
-        Sleep(500); // wait for parent to wait on mutex
-        m.Abandon(); // don't close the mutex
+        Sleep(g_expectedTimeoutMilliseconds); // wait for parent to wait on mutex
+        m.Close(); // close mutex without releasing lock
     }
 
     UninitializeChild(childRunningEvent, parentEvents, childEvents);
     return 0;
 }
 
-DWORD AbandonTests_Child_GracefulExit_CloseBeforeRelease(void *arg = nullptr)
+DWORD AbandonTests_Child_GracefulExit_NoClose(void *arg = nullptr)
 {
+    const char *testName = "AbandonTests";
+
+    // This test needs to run in a separate process because it does not close the mutex handle. Running it in a separate thread
+    // causes the mutex object to retain a reference until the process terminates.
+    TestAssert(test_getpid() != g_parentPid);
+
     AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-    TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+    TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
     int ei = 0;
 
     {
@@ -709,12 +793,12 @@ DWORD AbandonTests_Child_GracefulExit_CloseBeforeRelease(void *arg = nullptr)
         AutoCloseMutexHandle m;
 
         // ... parent waits for child to lock mutex
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(WaitForSingleObject(m, 0) == WAIT_OBJECT_0);
         TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent waits on mutex
-        Sleep(500); // wait for parent to wait on mutex
-        m.Close(); // close mutex before releasing lock
+        Sleep(g_expectedTimeoutMilliseconds); // wait for parent to wait on mutex
+        m.Abandon(); // don't close the mutex
     }
 
     UninitializeChild(childRunningEvent, parentEvents, childEvents);
@@ -723,12 +807,14 @@ DWORD AbandonTests_Child_GracefulExit_CloseBeforeRelease(void *arg = nullptr)
 
 DWORD AbandonTests_Child_AbruptExit(void *arg = nullptr)
 {
+    const char *testName = "AbandonTests";
+
     DWORD currentPid = test_getpid();
-    TestAssert(currentPid != parentPid); // this test needs to run in a separate process
+    TestAssert(currentPid != g_parentPid); // this test needs to run in a separate process
 
     {
         AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-        TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+        TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
         int ei = 0;
 
         {
@@ -736,11 +822,11 @@ DWORD AbandonTests_Child_AbruptExit(void *arg = nullptr)
             AutoCloseMutexHandle m;
 
             // ... parent waits for child to lock mutex
-            TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+            TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
             TestAssert(m != nullptr);
             TestAssert(WaitForSingleObject(m, 0) == WAIT_OBJECT_0);
             TestAssert(YieldToParent(parentEvents, childEvents, ei)); // parent waits on mutex
-            Sleep(500); // wait for parent to wait on mutex
+            Sleep(g_expectedTimeoutMilliseconds); // wait for parent to wait on mutex
             m.Abandon(); // don't close the mutex
         }
 
@@ -753,8 +839,10 @@ DWORD AbandonTests_Child_AbruptExit(void *arg = nullptr)
 
 DWORD AbandonTests_Child_TryLock(void *arg)
 {
+    const char *testName = "AbandonTests";
+
     AutoCloseMutexHandle childRunningEvent, parentEvents[2], childEvents[2];
-    TestAssert(InitializeChild(childRunningEvent, parentEvents, childEvents));
+    TestAssert(InitializeChild(testName, childRunningEvent, parentEvents, childEvents));
     int ei = 0;
 
     {
@@ -762,10 +850,10 @@ DWORD AbandonTests_Child_TryLock(void *arg)
         AutoCloseMutexHandle m;
 
         // ... parent waits for child to lock mutex
-        TestCreateMutex(m, BuildName(name, GlobalPrefix, NamePrefix));
+        TestCreateMutex(m, BuildName(testName, name, GlobalPrefix, NamePrefix));
         TestAssert(m != nullptr);
         TestAssert(WaitForSingleObject(m, 0) == WAIT_TIMEOUT); // try to lock the mutex while the parent holds the lock
-        TestAssert(WaitForSingleObject(m, 500) == WAIT_TIMEOUT);
+        TestAssert(WaitForSingleObject(m, g_expectedTimeoutMilliseconds) == WAIT_TIMEOUT);
     }
 
     UninitializeChild(childRunningEvent, parentEvents, childEvents);
@@ -774,16 +862,16 @@ DWORD AbandonTests_Child_TryLock(void *arg)
 
 bool AbandonTests()
 {
-    // Abandon by graceful exit unblocks a waiter
-    TestAssert(StartThread(AbandonTests_Child_GracefulExit));
-    TestAssert(AbandonTests_Parent());
-    TestAssert(StartProcess("AbandonTests_Child_GracefulExit"));
-    TestAssert(AbandonTests_Parent());
+    const char *testName = "AbandonTests";
 
     // Abandon by graceful exit where the lock owner closes the mutex before releasing it, unblocks a waiter
-    TestAssert(StartThread(AbandonTests_Child_GracefulExit_CloseBeforeRelease));
+    TestAssert(StartThread(AbandonTests_Child_GracefulExit_Close));
     TestAssert(AbandonTests_Parent());
-    TestAssert(StartProcess("AbandonTests_Child_GracefulExit_CloseBeforeRelease"));
+    TestAssert(StartProcess("AbandonTests_Child_GracefulExit_Close"));
+    TestAssert(AbandonTests_Parent());
+
+    // Abandon by graceful exit without closing the mutex unblocks a waiter
+    TestAssert(StartProcess("AbandonTests_Child_GracefulExit_NoClose"));
     TestAssert(AbandonTests_Parent());
 
     // Abandon by abrupt exit unblocks a waiter
@@ -796,21 +884,21 @@ bool AbandonTests()
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Test harness
 
-bool RunTests()
+bool (*const (TestList[]))() =
 {
-    bool (*(testList[]))() =
-    {
-        NameTests,
-        HeaderMismatchTests,
-        MutualExclusionTests,
-        LifetimeTests,
-        AbandonTests
-    };
+    NameTests,
+    HeaderMismatchTests,
+    MutualExclusionTests,
+    LifetimeTests,
+    AbandonTests
+};
 
+bool RunTests()
+{
     bool allPassed = true;
-    for (int i = 0; i < _countof(testList); ++i)
+    for (SIZE_T i = 0; i < _countof(TestList); ++i)
     {
-        if (!testList[i]())
+        if (!TestList[i]())
         {
             allPassed = false;
         }
@@ -818,9 +906,75 @@ bool RunTests()
     return allPassed;
 }
 
+DWORD g_stressDurationMilliseconds = 0;
+LONG g_stressTestCounts[_countof(TestList)] = {0};
+LONG g_stressResult = true;
+
+DWORD StressTest(void *arg)
+{
+    // Run the specified test continuously for the stress duration
+    SIZE_T testIndex = reinterpret_cast<SIZE_T>(arg);
+    DWORD startTime = GetTickCount();
+    do
+    {
+        ++g_stressTestCounts[testIndex];
+        if (!TestList[testIndex]())
+        {
+            InterlockedExchange(&g_stressResult, false);
+            break;
+        }
+    } while (
+        InterlockedCompareExchange(&g_stressResult, false, false) == true &&
+        GetTickCount() - startTime < g_stressDurationMilliseconds);
+    return 0;
+}
+
+bool StressTests(DWORD durationMinutes)
+{
+    g_isStress = true;
+    g_expectedTimeoutMilliseconds = 1;
+    g_stressDurationMilliseconds = durationMinutes * (60 * 1000);
+
+    // Start a thread for each test
+    HANDLE threadHandles[_countof(TestList)];
+    for (SIZE_T i = 0; i < _countof(threadHandles); ++i)
+    {
+        TestAssert(StartThread(StressTest, reinterpret_cast<void *>(i), &threadHandles[i]));
+    }
+
+    while (true)
+    {
+        DWORD waitResult =
+            WaitForMultipleObjects(_countof(threadHandles), threadHandles, true /* bWaitAll */, 10 * 1000 /* dwMilliseconds */);
+        TestAssert(waitResult == WAIT_OBJECT_0 || waitResult == WAIT_TIMEOUT);
+        if (waitResult == WAIT_OBJECT_0)
+        {
+            break;
+        }
+
+        Trace("'paltest_namedmutex_test1' stress test counts: ");
+        for (SIZE_T i = 0; i < _countof(g_stressTestCounts); ++i)
+        {
+            if (i != 0)
+            {
+                Trace(", ");
+            }
+            Trace("%u", g_stressTestCounts[i]);
+        }
+        Trace("\n");
+        fflush(stdout);
+    }
+
+    for (SIZE_T i = 0; i < _countof(threadHandles); ++i)
+    {
+        CloseHandle(threadHandles[i]);
+    }
+    return static_cast<bool>(g_stressResult);
+}
+
 int __cdecl main(int argc, char **argv)
 {
-    if (argc != 1 && argc != 3)
+    if (argc < 1 || argc > 4)
     {
         return FAIL;
     }
@@ -830,26 +984,51 @@ int __cdecl main(int argc, char **argv)
         return FAIL;
     }
 
-    test_strcpy(processPath, argv[0]);
+    test_strcpy(g_processPath, argv[0]);
+
     if (argc == 1)
     {
-        isParent = true;
-        parentPid = test_getpid();
+        // Unit test arguments: <processPath>
 
+        g_parentPid = test_getpid();
         int result = RunTests() ? PASS : FAIL;
         ExitProcess(result);
         return result;
     }
 
-    isParent = false;
+    if (test_strcmp(argv[1], "stress") == 0)
+    {
+        // Stress test arguments: <processPath> stress [durationMinutes]
+
+        DWORD durationMinutes = 1;
+        if (argc >= 3 && test_sscanf(argv[2], "%u", &durationMinutes) != 1)
+        {
+            ExitProcess(FAIL);
+            return FAIL;
+        }
+
+        g_parentPid = test_getpid();
+        int result = StressTests(durationMinutes) ? PASS : FAIL;
+        ExitProcess(result);
+        return result;
+    }
+
+    // Child test process arguments: <processPath> <parentPid> <testFunctionName> [stress]
+
+    g_isParent = false;
 
     // Get parent process' ID from argument
-    if (test_sscanf(argv[1], "%u", &parentPid) != 1)
+    if (test_sscanf(argv[1], "%u", &g_parentPid) != 1)
     {
         ExitProcess(FAIL);
         return FAIL;
     }
 
+    if (argc >= 4 && test_strcmp(argv[3], "stress") == 0)
+    {
+        g_isStress = true;
+    }
+
     if (test_strcmp(argv[2], "MutualExclusionTests_Child") == 0)
     {
         MutualExclusionTests_Child();
@@ -858,13 +1037,13 @@ int __cdecl main(int argc, char **argv)
     {
         LifetimeTests_Child();
     }
-    else if (test_strcmp(argv[2], "AbandonTests_Child_GracefulExit") == 0)
+    else if (test_strcmp(argv[2], "AbandonTests_Child_GracefulExit_Close") == 0)
     {
-        AbandonTests_Child_GracefulExit();
+        AbandonTests_Child_GracefulExit_Close();
     }
-    else if (test_strcmp(argv[2], "AbandonTests_Child_GracefulExit_CloseBeforeRelease") == 0)
+    else if (test_strcmp(argv[2], "AbandonTests_Child_GracefulExit_NoClose") == 0)
     {
-        AbandonTests_Child_GracefulExit_CloseBeforeRelease();
+        AbandonTests_Child_GracefulExit_NoClose();
     }
     else if (test_strcmp(argv[2], "AbandonTests_Child_AbruptExit") == 0)
     {
index fcc54e2..bd782c8 100644 (file)
@@ -16,7 +16,7 @@
 // These are GUIDs and IIDs that would normally be provided by the system via uuid.lib,
 // and that the PALRT exposes through headers.
 
-DEFINE_GUID(GUID_NULL, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+DEFINE_GUID(GUID_NULL, 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
 DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_IClassFactory, 0x00000001, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 
index 8fb771e..66aeb7e 100644 (file)
@@ -4,6 +4,21 @@
   <Import Project="$(ToolsDir)PublishContent.targets" />
   <Import Project="$(ToolsDir)versioning.targets" />
 
+  <!-- gathers the items to be published -->
+  <Target Name="GatherItemsForPattern">
+    <Error Condition="'$(PublishPattern)' == ''" Text="Please specify a value for PublishPattern using standard msbuild 'include' syntax." />
+    <ItemGroup>
+      <ForPublishing Include="$(PublishPattern)" />
+    </ItemGroup>
+    <!-- add relative blob path metadata -->
+    <ItemGroup>
+      <ForPublishing>
+        <RelativeBlobPath>$(__BuildType)/%(RecursiveDir)%(Filename)%(Extension)</RelativeBlobPath>  
+      </ForPublishing>
+    </ItemGroup>
+    <Error Condition="'@(ForPublishing)' == ''" Text="No items were found matching pattern '$(PublishPattern)'." />
+  </Target>
+
   <PropertyGroup>
     <PublishPattern Condition="'$(PublishPattern)' == ''">$(PackagesBinDir)**\*.nupkg</PublishPattern>
   </PropertyGroup>
index d4729c4..da4e025 100644 (file)
@@ -441,7 +441,7 @@ operator new[](size_t n)
 
 #endif // HAS_ADDRESS_SANITIZER
 
-void * __cdecl operator new(size_t n, const NoThrow&)
+void * __cdecl operator new(size_t n, const NoThrow&) NOEXCEPT
 {
 #ifdef HAS_ADDRESS_SANITIZER
     // use standard heap functions for address santizier (which doesn't provide for NoThrow)
@@ -461,7 +461,7 @@ void * __cdecl operator new(size_t n, const NoThrow&)
     return result;
 }
 
-void * __cdecl operator new[](size_t n, const NoThrow&)
+void * __cdecl operator new[](size_t n, const NoThrow&) NOEXCEPT
 {
 #ifdef HAS_ADDRESS_SANITIZER
     // use standard heap functions for address santizier (which doesn't provide for NoThrow)
index 9018520..f004be5 100644 (file)
@@ -916,40 +916,6 @@ NESTED_ENTRY JIT_Stelem_Ref__ArrayStoreCheck_Helper, _TEXT
 NESTED_END JIT_Stelem_Ref__ArrayStoreCheck_Helper, _TEXT
 
 
-; Equivalent of x86's c++ /fp:fast sin/cos/tan helpers, on x64 
-
-; public: static double __fastcall COMDouble::Sin(double)
-LEAF_ENTRY ?Sin@COMDouble@@SANN@Z, _TEXT
-        movsd   qword ptr [rsp + 8h], xmm0
-        fld     qword ptr [rsp + 8h]
-        fsin
-        fstp    qword ptr [rsp + 8h]    
-        movsd   xmm0, qword ptr [rsp + 8h]
-        ret
-LEAF_END ?Sin@COMDouble@@SANN@Z, _TEXT
-
-; public: static double __fastcall COMDouble::Cos(double)
-LEAF_ENTRY ?Cos@COMDouble@@SANN@Z, _TEXT
-        movsd   qword ptr [rsp + 8h], xmm0
-        fld     qword ptr [rsp + 8h]
-        fcos
-        fstp    qword ptr [rsp + 8h]
-        movsd   xmm0, qword ptr [rsp + 8h]
-        ret
-LEAF_END ?Cos@COMDouble@@SANN@Z, _TEXT
-
-; public: static double __fastcall COMDouble::Tan(double)
-LEAF_ENTRY ?Tan@COMDouble@@SANN@Z, _TEXT
-        movsd   qword ptr [rsp + 8h], xmm0
-        fld     qword ptr [rsp + 8h]
-        fptan
-        fstp    st(0)
-        fstp    qword ptr [rsp + 8h]
-        movsd   xmm0, qword ptr [rsp + 8h]
-        ret
-LEAF_END ?Tan@COMDouble@@SANN@Z, _TEXT
-
-
 extern JIT_FailFast:proc
 extern s_gsCookie:qword
 
index b768b6c..2a5e3b9 100644 (file)
@@ -164,7 +164,7 @@ LEAF_ENTRY AllocateStringFastMP_InlineGetThread, _TEXT
 
         ; Instead of doing elaborate overflow checks, we just limit the number of elements
         ; to (LARGE_OBJECT_SIZE - 256)/sizeof(WCHAR) or less.
-        ; This will avoid avoid all overflow problems, as well as making sure
+        ; This will avoid all overflow problems, as well as making sure
         ; big string objects are correctly allocated in the big object heap.
 
         cmp     ecx, (ASM_LARGE_OBJECT_SIZE - 256)/2
index 64b9a82..66b0e90 100644 (file)
@@ -277,7 +277,7 @@ NESTED_ENTRY AllocateStringFastMP, _TEXT
 
         ; Instead of doing elaborate overflow checks, we just limit the number of elements
         ; to (LARGE_OBJECT_SIZE - 256)/sizeof(WCHAR) or less.
-        ; This will avoid avoid all overflow problems, as well as making sure
+        ; This will avoid all overflow problems, as well as making sure
         ; big string objects are correctly allocated in the big object heap.
 
         cmp     ecx, (ASM_LARGE_OBJECT_SIZE - 256)/2
@@ -588,7 +588,7 @@ LEAF_ENTRY AllocateStringFastUP, _TEXT
 
         ; Instead of doing elaborate overflow checks, we just limit the number of elements
         ; to (LARGE_OBJECT_SIZE - 256)/sizeof(WCHAR) or less.
-        ; This will avoid avoid all overflow problems, as well as making sure
+        ; This will avoid all overflow problems, as well as making sure
         ; big string objects are correctly allocated in the big object heap.
 
         cmp     ecx, (ASM_LARGE_OBJECT_SIZE - 256)/2
index 3827d9b..53c6877 100644 (file)
@@ -14214,7 +14214,7 @@ BOOL RuntimeCanUseAppPathAssemblyResolver(DWORD adid)
 }
 
 // Returns S_OK if the assembly was successfully loaded
-HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToBindWithin, IAssemblyName *pIAssemblyName, ICLRPrivAssembly **ppLoadedAssembly)
+HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToBindWithin, IAssemblyName *pIAssemblyName, CLRPrivBinderCoreCLR *pTPABinder, BINDER_SPACE::AssemblyName *pAssemblyName, ICLRPrivAssembly **ppLoadedAssembly)
 {
     CONTRACTL
     {
@@ -14243,6 +14243,8 @@ HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToB
         
         GCPROTECT_BEGIN(_gcRefs);
         
+        ICLRPrivAssembly *pAssemblyBindingContext = NULL;
+        
         // Prepare to invoke System.Runtime.Loader.AssemblyLoadContext.Resolve method.
         //
         // First, initialize an assembly spec for the requested assembly
@@ -14251,7 +14253,9 @@ HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToB
         hr = spec.Init(pIAssemblyName);
         if (SUCCEEDED(hr))
         {
-            // Next, allocate an AssemblyName managed object
+            // Step 2 (of CLRPrivBinderAssemblyLoadContext::BindUsingAssemblyName) - Invoke Load method
+            //
+            // Allocate an AssemblyName managed object
             _gcRefs.oRefAssemblyName = (ASSEMBLYNAMEREF) AllocateObject(MscorlibBinder::GetClass(CLASS__ASSEMBLY_NAME));
             
             // Initialize the AssemblyName object from the AssemblySpec
@@ -14268,10 +14272,63 @@ HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToB
                 ObjToArgSlot(_gcRefs.oRefAssemblyName), // AssemblyName instance
             };
 
+            bool fResolvedAssembly = true;
+            bool fResolvedAssemblyViaTPALoadContext = false;
+            
             // Make the call
             _gcRefs.oRefLoadedAssembly = (ASSEMBLYREF) methLoadAssembly.Call_RetOBJECTREF(args);
-            if (_gcRefs.oRefLoadedAssembly != NULL)
+            if (_gcRefs.oRefLoadedAssembly == NULL)
+            {
+                fResolvedAssembly = false;
+            }
+            
+            if (!fResolvedAssembly)
+            {
+                // Step 3 (of CLRPrivBinderAssemblyLoadContext::BindUsingAssemblyName)
+                //
+                // If we could not resolve the assembly using Load method, then bind using TPA binder if present in its
+                // load context.
+                if (pTPABinder != NULL)
+                {
+                    // Switch to pre-emp mode before calling into the binder
+                    GCX_PREEMP();
+                    BINDER_SPACE::Assembly *pCoreCLRFoundAssembly = NULL;
+                    hr = pTPABinder->BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly, true /* excludeAppPaths */);
+                    if (SUCCEEDED(hr))
+                    {
+                        pAssemblyBindingContext = pCoreCLRFoundAssembly;
+                        fResolvedAssembly = true;
+                        fResolvedAssemblyViaTPALoadContext = true;
+                    }
+                }
+            }
+            
+            if (!fResolvedAssembly)
+            {
+                // Step 4 (of CLRPrivBinderAssemblyLoadContext::BindUsingAssemblyName)
+                //
+                // If we couldnt resolve the assembly using TPA LoadContext as well, then
+                // attempt to resolve it using the Resolving event.
+                // Finally, setup arguments for invocation
+                BinderMethodID idHAR_ResolveUsingEvent = METHOD__ASSEMBLYLOADCONTEXT__RESOLVEUSINGEVENT;
+                MethodDescCallSite methLoadAssembly(idHAR_ResolveUsingEvent);
+                
+                // Setup the arguments for the call
+                ARG_SLOT args[2] =
+                {
+                    PtrToArgSlot(pManagedAssemblyLoadContextToBindWithin), // IntPtr for managed assembly load context instance
+                    ObjToArgSlot(_gcRefs.oRefAssemblyName), // AssemblyName instance
+                };
+
+                // Make the call
+                _gcRefs.oRefLoadedAssembly = (ASSEMBLYREF) methLoadAssembly.Call_RetOBJECTREF(args);
+            }
+            
+            if (fResolvedAssembly && !fResolvedAssemblyViaTPALoadContext)
             {
+                // If we are here, assembly was successfully resolved via Load or Resolving events.
+                _ASSERTE(_gcRefs.oRefLoadedAssembly != NULL);
+                    
                 // We were able to get the assembly loaded. Now, get its name since the host could have
                 // performed the resolution using an assembly with different name.
                 DomainAssembly *pDomainAssembly = _gcRefs.oRefLoadedAssembly->GetDomainAssembly();
@@ -14302,23 +14359,23 @@ HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToB
                 
                 // Is the assembly already bound using a binding context that will be incompatible?
                 // An example is attempting to consume an assembly bound to WinRT binder.
-                ICLRPrivAssembly *pAssemblyBindingContext = pLoadedPEAssembly->GetHostAssembly();
-
+                pAssemblyBindingContext = pLoadedPEAssembly->GetHostAssembly();
+            }
+            
 #ifdef FEATURE_COMINTEROP
-                if (AreSameBinderInstance(pAssemblyBindingContext, GetAppDomain()->GetWinRtBinder()))
-                {
-                    // It is invalid to return an assembly bound to an incompatible binder
-                    *ppLoadedAssembly = NULL;
-                    SString name;
-                    spec.GetFileOrDisplayName(0, name);
-                    COMPlusThrowHR(COR_E_INVALIDOPERATION, IDS_HOST_ASSEMBLY_RESOLVER_INCOMPATIBLE_BINDING_CONTEXT, name);
-                }
+            if (AreSameBinderInstance(pAssemblyBindingContext, GetAppDomain()->GetWinRtBinder()))
+            {
+                // It is invalid to return an assembly bound to an incompatible binder
+                *ppLoadedAssembly = NULL;
+                SString name;
+                spec.GetFileOrDisplayName(0, name);
+                COMPlusThrowHR(COR_E_INVALIDOPERATION, IDS_HOST_ASSEMBLY_RESOLVER_INCOMPATIBLE_BINDING_CONTEXT, name);
+            }
 #endif // FEATURE_COMINTEROP
 
-                // Get the ICLRPrivAssembly reference to return back to.
-                *ppLoadedAssembly = clr::SafeAddRef(pLoadedPEAssembly->GetHostAssembly());
-                hr = S_OK;
-            }
+            // Get the ICLRPrivAssembly reference to return back to.
+            *ppLoadedAssembly = clr::SafeAddRef(pAssemblyBindingContext);
+            hr = S_OK;
         }
         
         GCPROTECT_END();
index 7b614e7..df77f1a 100644 (file)
@@ -1360,3 +1360,54 @@ DelayLoad_Helper\suffix:
     DynamicHelper DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_ObjectArg2, _ObjObj
 
 #endif // FEATURE_READYTORUN
+
+#ifdef FEATURE_HIJACK
+
+// ------------------------------------------------------------------
+// Hijack function for functions which return a reference type
+        NESTED_ENTRY OnHijackObjectTripThread, _TEXT, NoHandler
+        PROLOG_PUSH "{r0,r4-r11,lr}"
+
+        CHECK_STACK_ALIGNMENT
+
+        mov r0, sp
+        bl OnHijackObjectWorker
+
+        EPILOG_POP "{r0,r4-r11,pc}"
+        NESTED_END OnHijackObjectTripThread, _TEXT
+
+// ------------------------------------------------------------------
+// Hijack function for functions which return an interior pointer within an object allocated in managed heap
+        NESTED_ENTRY OnHijackInteriorPointerTripThread, _TEXT, NoHandler
+        PROLOG_PUSH "{r0,r4-r11,lr}"
+
+        CHECK_STACK_ALIGNMENT
+
+        mov r0, sp
+        bl C_FUNC(OnHijackInteriorPointerWorker)
+
+        EPILOG_POP "{r0,r4-r11,pc}"
+        NESTED_END OnHijackInteriorPointerTripThread, _TEXT
+
+// ------------------------------------------------------------------
+// Hijack function for functions which return a value type
+        NESTED_ENTRY OnHijackScalarTripThread, _TEXT, NoHandler
+        PROLOG_PUSH "{r0,r4-r11,lr}"
+
+        PROLOG_VPUSH "{d0-d3}"    // saving as d0-d3 can have the floating point return value
+        PROLOG_PUSH "{r1}"        // saving as r1 can have partial return value when return is > 32 bits
+        alloc_stack 4             // 8 byte align
+
+        CHECK_STACK_ALIGNMENT
+
+        add r0, sp, #40
+        bl C_FUNC(OnHijackScalarWorker)
+
+        free_stack 4
+        EPILOG_POP "{r1}"
+        EPILOG_VPOP "{d0-d3}"
+
+        EPILOG_POP "{r0,r4-r11,pc}"
+        NESTED_END OnHijackScalarTripThread, _TEXT
+#endif
+
index a341dc4..74a2186 100644 (file)
@@ -20,7 +20,7 @@
 ;
 ;void JIT_MemSet(void *dst, int val, SIZE_T count)
 ;{
-;    uintptr_t valEx = (char)val;
+;    uintptr_t valEx = (unsigned char)val;
 ;    valEx = valEx | valEx << 8;
 ;    valEx = valEx | valEx << 16;
 ;    valEx = valEx | valEx << 32;
@@ -87,7 +87,7 @@
 ; as C++ method.
 
     LEAF_ENTRY JIT_MemSet
-    sxtb        w8,w1
+    uxtb        w8,w1
     sxtw        x8,w8
     orr         x8,x8,x8 lsl #8
     orr         x8,x8,x8 lsl #0x10
index 072f8b1..889c355 100644 (file)
@@ -527,7 +527,7 @@ MethodTable* Module::CreateArrayMethodTable(TypeHandle elemTypeHnd, CorElementTy
     }
 
     // The type is sufficiently initialized for most general purpose accessor methods to work.
-    // Mark the type as restored to avoid avoid asserts. Note that this also enables IBC logging.
+    // Mark the type as restored to avoid asserts. Note that this also enables IBC logging.
     pMTWriteableData->SetIsFullyLoadedForBuildMethodTable();
 
     {
index 57e2803..b6cab68 100644 (file)
@@ -2102,11 +2102,25 @@ FCIMPL3(void, COMDelegate::DelegateConstruct, Object* refThisUNSAFE, Object* tar
                                 // <TODO>it looks like we need to pass an ownerType in here.
                                 //  Why can we take a delegate to an interface method anyway?  </TODO>
                                 // 
-                                pMeth = pMTTarg->FindDispatchSlotForInterfaceMD(pMeth).GetMethodDesc();
-                                if (pMeth == NULL)
+                                MethodDesc * pDispatchSlotMD = pMTTarg->FindDispatchSlotForInterfaceMD(pMeth).GetMethodDesc();
+                                if (pDispatchSlotMD == NULL)
                                 {
                                     COMPlusThrow(kArgumentException, W("Arg_DlgtTargMeth"));
                                 }
+
+                                if (pMeth->HasMethodInstantiation())
+                                {
+                                    pMeth = MethodDesc::FindOrCreateAssociatedMethodDesc(
+                                        pDispatchSlotMD,
+                                        pDispatchSlotMD->GetMethodTable(),
+                                        (!pDispatchSlotMD->IsStatic() && pDispatchSlotMD->GetMethodTable()->IsValueType()),
+                                        pMeth->GetMethodInstantiation(),
+                                        FALSE /* allowInstParam */);
+                                }
+                                else
+                                {
+                                    pMeth = pDispatchSlotMD;
+                                }
                             }
                         }
                     }
index 9e9ce21..90607f7 100644 (file)
@@ -2530,7 +2530,11 @@ int CEECompileInfo::GetVersionResilientTypeHashCode(CORINFO_MODULE_HANDLE module
 {
     STANDARD_VM_CONTRACT;
 
-    return ::GetVersionResilientTypeHashCode(((Module *)moduleHandle)->GetMDImport(), token);
+    int dwHashCode;
+    if (!::GetVersionResilientTypeHashCode(((Module *)moduleHandle)->GetMDImport(), token, &dwHashCode))
+        ThrowHR(COR_E_BADIMAGEFORMAT);
+
+    return dwHashCode;
 }
 
 int CEECompileInfo::GetVersionResilientMethodHashCode(CORINFO_METHOD_HANDLE methodHandle)
@@ -4935,6 +4939,8 @@ CEEPreloader::CEEPreloader(Module *pModule,
 
     GetAppDomain()->ToCompilationDomain()->SetTargetImage(m_image, this);
 
+    m_methodCompileLimit = pModule->GetMDImport()->GetCountWithTokenKind(mdtMethodDef) * 10;
+
 #ifdef FEATURE_FULL_NGEN
     m_fSpeculativeTriage = FALSE;
     m_fDictionariesPopulated = FALSE;
@@ -5144,7 +5150,7 @@ void CEEPreloader::MethodReferencedByCompiledCode(CORINFO_METHOD_HANDLE handle)
 
         if (pEntry->fScheduled)
             return;        
-        m_uncompiledMethods.Append(pMD);
+        AppendUncompiledMethod(pMD);
     }
     else
     {
@@ -5354,7 +5360,7 @@ void CEEPreloader::AddToUncompiledMethods(MethodDesc *pMD, BOOL fForStubs)
     }
 
     // Add it to the set of uncompiled methods
-    m_uncompiledMethods.Append(pMD);
+    AppendUncompiledMethod(pMD);
 }
 
 //
index 9a9cc14..97c6cc1 100644 (file)
@@ -527,6 +527,17 @@ class CEEPreloader : public ICorCompilePreloader
     // Array of methods that we need to compile.
     SArray<MethodDesc*> m_uncompiledMethods;
 
+    int m_methodCompileLimit;
+
+    void AppendUncompiledMethod(MethodDesc *pMD)
+    {
+        if (m_methodCompileLimit > 0)
+        {
+            m_uncompiledMethods.Append(pMD);
+            m_methodCompileLimit--;
+        }
+    }
+
     struct DuplicateMethodEntry
     {
         MethodDesc * pMD;
index effd16f..9ea5427 100644 (file)
@@ -631,12 +631,13 @@ FCIMPL4(void, DebugStackTrace::GetStackFramesInternal,
                 }
             }
 #endif
-            BOOL fFileInfoSet = FALSE;
+            BOOL fPortablePDB = TRUE;
 
-#ifdef FEATURE_ISYM_READER
-            // Check if the user wants the filenumber, linenumber info...
+            // Check if the user wants the filenumber, linenumber info and that it is possible.
             if (!fIsEnc && fNeedFileInfo)
             {
+#ifdef FEATURE_ISYM_READER
+                BOOL fFileInfoSet = FALSE;
                 ULONG32 sourceLine = 0;
                 ULONG32 sourceColumn = 0;
                 WCHAR wszFileName[MAX_LONGPATH];
@@ -653,6 +654,10 @@ FCIMPL4(void, DebugStackTrace::GetStackFramesInternal,
 
                     if (pISymUnmanagedReader != NULL)
                     {
+                        // Found a ISymUnmanagedReader for the regular PDB so don't attempt to 
+                        // read it as a portable PDB in mscorlib's StackFrameHelper.
+                        fPortablePDB = FALSE;
+
                         ReleaseHolder<ISymUnmanagedMethod> pISymUnmanagedMethod;  
                         HRESULT hr = pISymUnmanagedReader->GetMethod(pMethod->GetMemberDef(), 
                                                                      &pISymUnmanagedMethod);
@@ -796,52 +801,52 @@ FCIMPL4(void, DebugStackTrace::GetStackFramesInternal,
                     OBJECTREF obj = (OBJECTREF) StringObject::NewString(wszFileName);
                     pStackFrameHelper->rgFilename->SetAt(iNumValidFrames, obj);
                 }
-            }
 #endif // FEATURE_ISYM_READER
 
-            // If the above isym reader code did NOT set the source info either because it is ifdef'ed out (on xplat)
-            // or because the pdb is the new portable format on Windows then set the information needed to called the
-            // portable pdb reader in the StackTraceHelper. The source/line info isn't valid on ENC'ed modules.
-            if (!fFileInfoSet && !fIsEnc)
-            {
-                // Save MethodToken for the function
-                I4 *pMethodToken = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiMethodToken)->GetDirectPointerToNonObjectElements();
-                pMethodToken[iNumValidFrames] = pMethod->GetMemberDef();
+                // If the above isym reader code did NOT set the source info either because it is ifdef'ed out (on xplat)
+                // or because the pdb is the new portable format on Windows then set the information needed to call the
+                // portable pdb reader in the StackTraceHelper.
+                if (fPortablePDB)
+                {
+                    // Save MethodToken for the function
+                    I4 *pMethodToken = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiMethodToken)->GetDirectPointerToNonObjectElements();
+                    pMethodToken[iNumValidFrames] = pMethod->GetMemberDef();
 
-                PEFile *pPEFile = pModule->GetFile();
+                    PEFile *pPEFile = pModule->GetFile();
 
-                // Get the address and size of the loaded PE image
-                COUNT_T peSize;
-                PTR_CVOID peAddress = pPEFile->GetLoadedImageContents(&peSize);
+                    // Get the address and size of the loaded PE image
+                    COUNT_T peSize;
+                    PTR_CVOID peAddress = pPEFile->GetLoadedImageContents(&peSize);
 
-                // Save the PE address and size
-                PTR_CVOID *pLoadedPeAddress = (PTR_CVOID *)pStackFrameHelper->rgLoadedPeAddress->GetDataPtr();
-                pLoadedPeAddress[iNumValidFrames] = peAddress;
+                    // Save the PE address and size
+                    PTR_CVOID *pLoadedPeAddress = (PTR_CVOID *)pStackFrameHelper->rgLoadedPeAddress->GetDataPtr();
+                    pLoadedPeAddress[iNumValidFrames] = peAddress;
 
-                I4 *pLoadedPeSize = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiLoadedPeSize)->GetDirectPointerToNonObjectElements();
-                pLoadedPeSize[iNumValidFrames] = (I4)peSize;
+                    I4 *pLoadedPeSize = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiLoadedPeSize)->GetDirectPointerToNonObjectElements();
+                    pLoadedPeSize[iNumValidFrames] = (I4)peSize;
 
-                // If there is a in memory symbol stream
-                CGrowableStream* stream = pModule->GetInMemorySymbolStream();
-                if (stream != NULL)
-                {
-                    MemoryRange range = stream->GetRawBuffer();
+                    // If there is a in memory symbol stream
+                    CGrowableStream* stream = pModule->GetInMemorySymbolStream();
+                    if (stream != NULL)
+                    {
+                        MemoryRange range = stream->GetRawBuffer();
 
-                    // Save the in-memory PDB address and size
-                    PTR_VOID *pInMemoryPdbAddress = (PTR_VOID *)pStackFrameHelper->rgInMemoryPdbAddress->GetDataPtr();
-                    pInMemoryPdbAddress[iNumValidFrames] = range.StartAddress();
+                        // Save the in-memory PDB address and size
+                        PTR_VOID *pInMemoryPdbAddress = (PTR_VOID *)pStackFrameHelper->rgInMemoryPdbAddress->GetDataPtr();
+                        pInMemoryPdbAddress[iNumValidFrames] = range.StartAddress();
 
-                    I4 *pInMemoryPdbSize = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiInMemoryPdbSize)->GetDirectPointerToNonObjectElements();
-                    pInMemoryPdbSize[iNumValidFrames] = (I4)range.Size();
-                }
-                else
-                {
-                    // Set the pdb path (assembly file name)
-                    const SString& assemblyPath = pPEFile->GetPath();
-                    if (!assemblyPath.IsEmpty())
+                        I4 *pInMemoryPdbSize = (I4 *)((I4ARRAYREF)pStackFrameHelper->rgiInMemoryPdbSize)->GetDirectPointerToNonObjectElements();
+                        pInMemoryPdbSize[iNumValidFrames] = (I4)range.Size();
+                    }
+                    else
                     {
-                        OBJECTREF obj = (OBJECTREF)StringObject::NewString(assemblyPath);
-                        pStackFrameHelper->rgAssemblyPath->SetAt(iNumValidFrames, obj);
+                        // Set the pdb path (assembly file name)
+                        const SString& assemblyPath = pPEFile->GetPath();
+                        if (!assemblyPath.IsEmpty())
+                        {
+                            OBJECTREF obj = (OBJECTREF)StringObject::NewString(assemblyPath);
+                            pStackFrameHelper->rgAssemblyPath->SetAt(iNumValidFrames, obj);
+                        }
                     }
                 }
             }
index 4307019..8675ddd 100644 (file)
@@ -227,9 +227,7 @@ FCFuncStart(gStringFuncs)
     FCIntrinsic("get_Chars", COMString::GetCharAt, CORINFO_INTRINSIC_StringGetChar)
     FCFuncElement("IsAscii", COMString::IsAscii)
     FCFuncElement("nativeCompareOrdinalEx", COMString::CompareOrdinalEx)
-    FCFuncElement("IndexOf", COMString::IndexOfChar)
     FCFuncElement("IndexOfAny", COMString::IndexOfCharArray)
-    FCFuncElement("LastIndexOf", COMString::LastIndexOfChar)
     FCFuncElement("LastIndexOfAny", COMString::LastIndexOfCharArray)
     FCFuncElementSig("ReplaceInternal", &gsig_IM_Str_Str_RetStr, COMString::ReplaceString)
 #ifdef FEATURE_COMINTEROP
@@ -1236,31 +1234,27 @@ FCFuncStart(gDelegateFuncs)
 FCFuncEnd()
 
 FCFuncStart(gMathFuncs)
-    FCIntrinsic("Sin", COMDouble::Sin, CORINFO_INTRINSIC_Sin)
+    FCIntrinsicSig("Abs", &gsig_SM_Dbl_RetDbl, COMDouble::Abs, CORINFO_INTRINSIC_Abs)
+    FCIntrinsicSig("Abs", &gsig_SM_Flt_RetFlt, COMSingle::Abs, CORINFO_INTRINSIC_Abs)
+    FCIntrinsic("Acos", COMDouble::Acos, CORINFO_INTRINSIC_Acos)
+    FCIntrinsic("Asin", COMDouble::Asin, CORINFO_INTRINSIC_Asin)
+    FCIntrinsic("Atan", COMDouble::Atan, CORINFO_INTRINSIC_Atan)
+    FCIntrinsic("Atan2", COMDouble::Atan2, CORINFO_INTRINSIC_Atan2)
+    FCIntrinsic("Ceiling", COMDouble::Ceil, CORINFO_INTRINSIC_Ceiling)
     FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos)
-    FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
-    FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
-    FCIntrinsicSig("Abs", &gsig_SM_Flt_RetFlt, COMDouble::AbsFlt, CORINFO_INTRINSIC_Abs)
-    FCIntrinsicSig("Abs", &gsig_SM_Dbl_RetDbl, COMDouble::AbsDbl, CORINFO_INTRINSIC_Abs)
+    FCIntrinsic("Cosh", COMDouble::Cosh, CORINFO_INTRINSIC_Cosh)
     FCIntrinsic("Exp", COMDouble::Exp, CORINFO_INTRINSIC_Exp)
-    FCIntrinsic("Pow", COMDouble::Pow, CORINFO_INTRINSIC_Pow)
-#if defined(_TARGET_X86_)
-    FCUnreferenced FCFuncElement("PowHelperSimple", COMDouble::PowHelperSimple)
-    FCUnreferenced FCFuncElement("PowHelper", COMDouble::PowHelper)
-#endif
-    FCIntrinsic("Tan", COMDouble::Tan, CORINFO_INTRINSIC_Tan)
     FCIntrinsic("Floor", COMDouble::Floor, CORINFO_INTRINSIC_Floor)
     FCFuncElement("Log", COMDouble::Log)
+    FCIntrinsic("Log10", COMDouble::Log10, CORINFO_INTRINSIC_Log10)
+    FCIntrinsic("Pow", COMDouble::Pow, CORINFO_INTRINSIC_Pow)
+    FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
+    FCIntrinsic("Sin", COMDouble::Sin, CORINFO_INTRINSIC_Sin)
     FCIntrinsic("Sinh", COMDouble::Sinh, CORINFO_INTRINSIC_Sinh)
-    FCIntrinsic("Cosh", COMDouble::Cosh, CORINFO_INTRINSIC_Cosh)
+    FCFuncElement("SplitFractionDouble", COMDouble::ModF)
+    FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
+    FCIntrinsic("Tan", COMDouble::Tan, CORINFO_INTRINSIC_Tan)
     FCIntrinsic("Tanh", COMDouble::Tanh, CORINFO_INTRINSIC_Tanh)
-    FCIntrinsic("Acos", COMDouble::Acos, CORINFO_INTRINSIC_Acos)
-    FCIntrinsic("Asin", COMDouble::Asin, CORINFO_INTRINSIC_Asin)
-    FCIntrinsic("Atan", COMDouble::Atan, CORINFO_INTRINSIC_Atan)
-    FCIntrinsic("Atan2", COMDouble::Atan2, CORINFO_INTRINSIC_Atan2)
-    FCIntrinsic("Log10", COMDouble::Log10, CORINFO_INTRINSIC_Log10)
-    FCIntrinsic("Ceiling", COMDouble::Ceil, CORINFO_INTRINSIC_Ceiling)
-    FCFuncElement("SplitFractionDouble", COMDouble::ModFDouble)
 FCFuncEnd()
 
 FCFuncStart(gThreadFuncs)
index 58a796a..64725f6 100644 (file)
@@ -5048,19 +5048,29 @@ bool IsDivByZeroAnIntegerOverflow(PCONTEXT pContext)
 }
 #endif //_AMD64_
 
-BOOL PALAPI IsSafeToHandleHardwareException(PCONTEXT contextRecord, PEXCEPTION_RECORD exceptionRecord)
+BOOL IsSafeToCallExecutionManager()
 {
     Thread *pThread = GetThread();
-    PCODE controlPc = GetIP(contextRecord);
+
     // It is safe to call the ExecutionManager::IsManagedCode only if the current thread is in
     // the cooperative mode. Otherwise ExecutionManager::IsManagedCode could deadlock if 
     // the exception happened when the thread was holding the ExecutionManager's writer lock.
     // When the thread is in preemptive mode, we know for sure that it is not executing managed code.
-    BOOL isManagedCode = (pThread != NULL && pThread->PreemptiveGCDisabled() && ExecutionManager::IsManagedCode(controlPc));
+    // Unfortunately, when running GC stress mode that invokes GC after every jitted or NGENed
+    // instruction, we need to relax that to enable instrumentation of PInvoke stubs that switch to
+    // preemptive GC mode at some point.
+    return ((pThread != NULL) && pThread->PreemptiveGCDisabled()) || 
+           GCStress<cfg_instr_jit>::IsEnabled() || 
+           GCStress<cfg_instr_ngen>::IsEnabled();
+}
+
+BOOL PALAPI IsSafeToHandleHardwareException(PCONTEXT contextRecord, PEXCEPTION_RECORD exceptionRecord)
+{
+    PCODE controlPc = GetIP(contextRecord);
     return g_fEEStarted && (
         exceptionRecord->ExceptionCode == STATUS_BREAKPOINT || 
         exceptionRecord->ExceptionCode == STATUS_SINGLE_STEP ||
-        isManagedCode ||
+        (IsSafeToCallExecutionManager() && ExecutionManager::IsManagedCode(controlPc)) ||
         IsIPInMarkedJitHelper(controlPc));
 }
 
@@ -5072,10 +5082,8 @@ VOID PALAPI HandleHardwareException(PAL_SEHException* ex)
     {
         // A hardware exception is handled only if it happened in a jitted code or 
         // in one of the JIT helper functions (JIT_MemSet, ...)
-        Thread *pThread = GetThread();
         PCODE controlPc = GetIP(&ex->ContextRecord);
-        BOOL isManagedCode = (pThread != NULL && pThread->PreemptiveGCDisabled() && ExecutionManager::IsManagedCode(controlPc));
-        if (isManagedCode && IsGcMarker(ex->ExceptionRecord.ExceptionCode, &ex->ContextRecord))
+        if (ExecutionManager::IsManagedCode(controlPc) && IsGcMarker(ex->ExceptionRecord.ExceptionCode, &ex->ContextRecord))
         {
             RtlRestoreContext(&ex->ContextRecord, &ex->ExceptionRecord);
             UNREACHABLE();
index 0b5bf34..9dda25e 100644 (file)
@@ -364,6 +364,65 @@ public:
 
 #endif // _TARGET_AMD64_
 
+// When Sprinking break points, we must make sure that certain calls to 
+// Thread-suspension routines inlined into the managed method are not 
+// converted to GC-Stress points. Otherwise, this will lead to race 
+// conditions with the GC.
+//
+// For example, for an inlined PInvoke stub, the JIT generates the following code
+// 
+//    call    CORINFO_HELP_INIT_PINVOKE_FRAME // Obtain the thread pointer
+//    \85
+//    mov      byte  ptr[rsi + 12], 0   // Switch to preemptive mode [thread->premptiveGcDisabled = 0]
+//    call     rax                      // The actual native call, in preemptive mode
+//    mov      byte  ptr[rsi + 12], 1   // Switch the thread to Cooperative mode
+//    cmp      dword ptr[(reloc 0x7ffd1bb77148)], 0  // if(g_TrapReturningThreads)
+//    je       SHORT G_M40565_IG05
+//    call[CORINFO_HELP_STOP_FOR_GC]             // Call JIT_RareDisableHelper()
+//    \85
+//
+// For the SprinkleBreakPoints() routine, the JIT_RareDisableHelper() itself will 
+// look like an ordinary indirect call/safepoint. So, it may rewrite it with 
+// a TRAP to perform GC
+//
+//    call    CORINFO_HELP_INIT_PINVOKE_FRAME // Obtain the thread pointer
+//    \85
+//    mov      byte  ptr[rsi + 12], 0   // Switch to preemptive mode [thread->premptiveGcDisabled = 0]
+//    cli                               // INTERRUPT_INSTR_CALL
+//    mov      byte  ptr[rsi + 12], 1   // Switch the thread to Cooperative mode
+//    cmp      dword ptr[(reloc 0x7ffd1bb77148)], 0  // if(g_TrapReturningThreads)
+//    je       SHORT G_M40565_IG05
+//    cli                               // INTERRUPT_INSTR_CALL
+//    \85
+//
+//  Now, a managed thread (T) can race with the GC as follows:
+// 1)  At the first safepoint, we notice that T is in preemptive mode during the call for GCStress
+//      So, it is put it in cooperative mode for the purpose of GCStress(fPremptiveGcDisabledForGcStress)
+// 2)  We DoGCStress(). Start off background GC in a different thread.
+// 3)  Then the thread T is put back to preemptive mode (because that\92s where it was).
+//      Thread T continues execution along with the GC thread.
+// 4)  The Jitted code puts thread T to cooperative mode, as part of PInvoke epilog
+// 5)  Now instead of CORINFO_HELP_STOP_FOR_GC(), we hit the GCStress trap and start 
+//      another round of GCStress while in Cooperative mode.
+// 6)  Now, thread T can modify the stack (ex: RedirectionFrame setup) while the GC thread is scanning it.
+// 
+// This problem can be avoided by not inserting traps-for-GC in place of calls to CORINFO_HELP_STOP_FOR_GC()
+//
+// How do we identify the calls to CORINFO_HELP_STOP_FOR_GC()?
+// Since this is a GCStress only requirement, its not worth special identification in the GcInfo 
+// Since CORINFO_HELP_STOP_FOR_GC() calls are realized as indirect calls by the JIT, we cannot identify 
+// them by address at the time of SprinkleBreakpoints().
+// So, we actually let the SprinkleBreakpoints() replace the call to CORINFO_HELP_STOP_FOR_GC() with a trap,
+// and revert it back to the original instruction the first time we hit the trap in OnGcCoverageInterrupt().
+//
+// Similarly, inserting breakpoints can be avoided for JIT_PollGC() and JIT_StressGC().
+
+#if defined(_TARGET_ARM_) || defined(_TARGET_AMD64_)
+extern "C" FCDECL0(VOID, JIT_RareDisableHelper);
+#else
+FCDECL0(VOID, JIT_RareDisableHelper);
+#endif
+
 /****************************************************************************/
 /* sprinkle interupt instructions that will stop on every GCSafe location
    regionOffsetAdj - Represents the offset of the current region 
@@ -484,6 +543,9 @@ void GCCoverageInfo::SprinkleBreakpoints(
 
                     if (target != 0)
                     {
+                        // JIT_RareDisableHelper() is expected to be an indirect call.
+                        // If we encounter a direct call (in future), skip the call 
+                        _ASSERTE(target != (SLOT)JIT_RareDisableHelper); 
                         targetMD = getTargetMethodDesc((PCODE)target);
                     }
                 }
@@ -890,12 +952,24 @@ static SLOT getTargetOfCall(SLOT instrPtr, PCONTEXT regs, SLOT*nextInstr) {
     BYTE baseadj = 0;
     WORD displace = 0;
 
+    // In certain situations, the instruction bytes are read from a different
+    // location than the actual bytes being executed.
+    // When decoding the instructions of a method which is sprinkled with 
+    // TRAP instructions for GCStress, we decode the bytes from a copy 
+    // of the instructions stored before the traps-for-gc were inserted.
+    // Hoiwever, the PC-relative addressing/displacement of the CALL-target
+    // will still be with respect to the currently executing PC.
+    // So, if a register context is available, we pick the PC from it 
+    // (for address calculation purposes only). 
+
+    SLOT PC = (regs) ? (SLOT)GetIP(regs) : instrPtr;
+
 #ifdef _TARGET_ARM_
     if((instrPtr[1] & 0xf0) == 0xf0) // direct call
     {
         int imm32 = GetThumb2BlRel24((UINT16 *)instrPtr);
         *nextInstr = instrPtr + 4;
-        return instrPtr + 4 + imm32;
+        return PC + 4 + imm32;
     }
     else if(((instrPtr[1] & 0x47) == 0x47) & ((instrPtr[0] & 0x80) == 0x80)) // indirect call
     {
@@ -911,7 +985,7 @@ static SLOT getTargetOfCall(SLOT instrPtr, PCONTEXT regs, SLOT*nextInstr) {
        // SignExtend the immediate value.
        imm26 = (imm26 << 4) >> 4;
        *nextInstr = instrPtr + 4;
-       return instrPtr + imm26;
+       return PC + imm26;
    }
    else if (((*reinterpret_cast<DWORD*>(instrPtr)) & 0xFFFFC1F) == 0xD63F0000)
    {
@@ -942,10 +1016,10 @@ static SLOT getTargetOfCall(SLOT instrPtr, PCONTEXT regs, SLOT*nextInstr) {
 
 #endif // _TARGET_AMD64_
 
-    if (instrPtr[0] == 0xE8) {
+    if (instrPtr[0] == 0xE8) {  // Direct Relative Near
         *nextInstr = instrPtr + 5;
 
-        size_t base = (size_t) instrPtr + 5;
+        size_t base = (size_t) PC + 5;
 
         INT32 displacement = (INT32) (
             ((UINT32)instrPtr[1]) +
@@ -959,7 +1033,7 @@ static SLOT getTargetOfCall(SLOT instrPtr, PCONTEXT regs, SLOT*nextInstr) {
         return((SLOT)(base + (SSIZE_T)displacement));
     }
 
-    if (instrPtr[0] == 0xFF) {
+    if (instrPtr[0] == 0xFF) { // Indirect Absolute Near
 
         _ASSERTE(regs);
 
@@ -1035,7 +1109,7 @@ static SLOT getTargetOfCall(SLOT instrPtr, PCONTEXT regs, SLOT*nextInstr) {
                     // calculate the address of the next instruction we need to
                     // jump forward 6 bytes: 1 for the opcode, 1 for the ModRM byte,
                     // and 4 for the operand.  see AMD64 Programmer's Manual Vol 3.
-                    result = instrPtr + 6;
+                    result = PC + 6;
 #else
                     result = 0;
 #endif // _TARGET_AMD64_
@@ -1133,7 +1207,11 @@ bool IsGcCoverageInterrupt(LPVOID ip)
     }
 
     // Now it's safe to dereference the IP to check the instruction
+#ifdef _TARGET_ARM_    
+    UINT16 instructionCode = *reinterpret_cast<UINT16 *>(ip);
+#else
     UINT8 instructionCode = *reinterpret_cast<UINT8 *>(ip);
+#endif 
     switch (instructionCode)
     {
         case INTERRUPT_INSTR:
@@ -1147,6 +1225,24 @@ bool IsGcCoverageInterrupt(LPVOID ip)
     }
 }
 
+// Remove the GcCoverage interrupt instruction, and restore the 
+// original instruction. Only one instruction must be used, 
+// because multiple threads can be executing the same code stream.
+
+void RemoveGcCoverageInterrupt(Volatile<BYTE>* instrPtr, BYTE * savedInstrPtr)
+{
+#ifdef _TARGET_ARM_
+        if (GetARMInstructionLength(savedInstrPtr) == 2)
+            *(WORD *)instrPtr  = *(WORD *)savedInstrPtr;
+        else
+            *(DWORD *)instrPtr = *(DWORD *)savedInstrPtr;
+#elif defined(_TARGET_ARM64_)
+        *(DWORD *)instrPtr = *(DWORD *)savedInstrPtr;
+#else
+        *instrPtr = *savedInstrPtr;
+#endif
+}
+
 BOOL OnGcCoverageInterrupt(PCONTEXT regs)
 {
     SO_NOT_MAINLINE_FUNCTION;
@@ -1175,33 +1271,30 @@ BOOL OnGcCoverageInterrupt(PCONTEXT regs)
     if (gcCover == 0)
         return(FALSE);        // we aren't doing code gcCoverage on this function
 
-    /****
-    if (gcCover->curInstr != 0)
-        *gcCover->curInstr = INTERRUPT_INSTR;
-    ****/
+    BYTE * savedInstrPtr = &gcCover->savedCode[offset];
+
+    // If this trap instruction is taken in place of CORINFO_HELP_STOP_FOR_GC()
+    // Do not start a GC, but continue with the original instruction.
+    // See the comments above SprinkleBreakpoints() function.
+    SLOT nextInstr;
+    SLOT target = getTargetOfCall(savedInstrPtr, regs, &nextInstr);
+
+    if (target == (SLOT)JIT_RareDisableHelper) {
+        RemoveGcCoverageInterrupt(instrPtr, savedInstrPtr);
+        return TRUE;
+    }
 
     Thread* pThread = GetThread();
     _ASSERTE(pThread);
-   
+
 #if defined(USE_REDIRECT_FOR_GCSTRESS) && !defined(PLATFORM_UNIX)
     // If we're unable to redirect, then we simply won't test GC at this
     // location.
     if (!pThread->CheckForAndDoRedirectForGCStress(regs))
     {
-        /* remove the interrupt instruction */
-        BYTE * savedInstrPtr = &gcCover->savedCode[offset];
-
-#ifdef _TARGET_ARM_
-        if (GetARMInstructionLength(savedInstrPtr) == 2)
-            *(WORD *)instrPtr  = *(WORD *)savedInstrPtr;
-        else
-            *(DWORD *)instrPtr = *(DWORD *)savedInstrPtr;
-#elif defined(_TARGET_ARM64_)
-        *(DWORD *)instrPtr = *(DWORD *)savedInstrPtr;
-#else
-        *instrPtr = *savedInstrPtr;
-#endif
+        RemoveGcCoverageInterrupt(instrPtr, savedInstrPtr);
     }
+
 #else // !USE_REDIRECT_FOR_GCSTRESS
 
 #ifdef _DEBUG
index 87eef87..65638d1 100644 (file)
@@ -682,6 +682,8 @@ Dictionary::PopulateEntry(
                 th = th.GetMethodTable()->GetMethodTableMatchingParentClass(declaringType.AsMethodTable());
             }
 
+            th.GetMethodTable()->EnsureInstanceActive();
+
             result = (CORINFO_GENERIC_HANDLE)th.AsPtr();
             break;
         }
@@ -880,6 +882,14 @@ Dictionary::PopulateEntry(
                 result = (CORINFO_GENERIC_HANDLE)pMethod->GetMultiCallableAddrOfCode();
             }
             else
+            if (kind == DispatchStubAddrSlot)
+            {
+                _ASSERTE((methodFlags & ENCODE_METHOD_SIG_SlotInsteadOfToken) == 0);
+                PCODE *ppCode = (PCODE*)(void*)pMethod->GetLoaderAllocator()->GetHighFrequencyHeap()->AllocMem(S_SIZE_T(sizeof(PCODE)));
+                *ppCode = pMethod->GetMultiCallableAddrOfCode();
+                result = (CORINFO_GENERIC_HANDLE)ppCode;
+            }
+            else
             {
                 _ASSERTE(kind == MethodDescSlot);
                 result = (CORINFO_GENERIC_HANDLE)pMethod;
@@ -907,6 +917,8 @@ Dictionary::PopulateEntry(
             DWORD fieldIndex;
             IfFailThrow(ptr.GetData(&fieldIndex));
 
+            th.AsMethodTable()->EnsureInstanceActive();
+
             result = (CORINFO_GENERIC_HANDLE)th.AsMethodTable()->GetFieldDescByIndex(fieldIndex);
             break;
         }
index ff0ea93..949b115 100644 (file)
@@ -1227,7 +1227,7 @@ void *JIT_TrialAlloc::GenAllocString(Flags flags)
 
     // Instead of doing elaborate overflow checks, we just limit the number of elements
     // to (LARGE_OBJECT_SIZE - 256)/sizeof(WCHAR) or less.
-    // This will avoid avoid all overflow problems, as well as making sure
+    // This will avoid all overflow problems, as well as making sure
     // big string objects are correctly allocated in the big object heap.
 
     _ASSERTE(sizeof(WCHAR) == 2);
index 5a120bd..3bdb245 100644 (file)
@@ -3468,7 +3468,7 @@ NoSpecialCase:
                 methodFlags |= ENCODE_METHOD_SIG_SlotInsteadOfToken;
             }
             else
-            if (entryKind == DispatchStubAddrSlot)
+            if (entryKind == DispatchStubAddrSlot && pTemplateMD->IsVtableMethod())
             {
                 // Encode the method for dispatch stub using slot to avoid touching the interface method MethodDesc at runtime
 
index 91e2a10..7681028 100644 (file)
@@ -43,7 +43,8 @@
 #include "system.h"
 #include "comutilnative.h"
 #include "comsynchronizable.h"
-#include "floatclass.h"
+#include "floatdouble.h"
+#include "floatsingle.h"
 #include "decimal.h"
 #include "currency.h"
 #include "comdatetime.h"
index df00dcf..afc89f1 100644 (file)
@@ -1680,6 +1680,7 @@ DEFINE_METHOD(FIRSTCHANCE_EVENTARGS,  CTOR,                   .ctor,
 DEFINE_CLASS(ASSEMBLYLOADCONTEXT,  Loader,                AssemblyLoadContext)    
 DEFINE_METHOD(ASSEMBLYLOADCONTEXT,  RESOLVE,          Resolve,                      SM_IntPtr_AssemblyName_RetAssemblyBase)
 DEFINE_METHOD(ASSEMBLYLOADCONTEXT,  RESOLVEUNMANAGEDDLL,          ResolveUnmanagedDll,                      SM_Str_IntPtr_RetIntPtr)
+DEFINE_METHOD(ASSEMBLYLOADCONTEXT,  RESOLVEUSINGEVENT,          ResolveUsingResolvingEvent,                      SM_IntPtr_AssemblyName_RetAssemblyBase)
 
 #endif // defined(FEATURE_HOST_ASSEMBLY_RESOLVER)
 
index 60f2e9a..83c4015 100644 (file)
@@ -2043,13 +2043,10 @@ EXTERN_C PCODE STDCALL ExternalMethodFixupWorker(TransitionBlock * pTransitionBl
             // Note that we do not want to call code:MethodDesc::IsPointingToPrestub() here. It does not take remoting interception 
             // into account and so it would cause otherwise intercepted methods to be JITed. It is a compat issue if the JITing fails.
             //
-            if (DoesSlotCallPrestub(pCode))
+            if (!DoesSlotCallPrestub(pCode))
             {
-                ETWOnStartup(PrestubWorker_V1, PrestubWorkerEnd_V1);
-                pCode = pMD->DoPrestub(NULL);
+                pCode = PatchNonVirtualExternalMethod(pMD, pCode, pImportSection, pIndirection);
             }
-
-            pCode = PatchNonVirtualExternalMethod(pMD, pCode, pImportSection, pIndirection);
         }
     }
 
index 3636a8e..6e78bae 100644 (file)
@@ -85,7 +85,7 @@ BOOL ReadyToRunInfo::TryLookupTypeTokenFromName(NameHandle *pName, mdToken * pFo
     CONTRACTL
     {
         GC_NOTRIGGER;
-        THROWS;
+        NOTHROW;
         SO_INTOLERANT;
         SUPPORTS_DAC;
         PRECONDITION(!m_availableTypesHashtable.IsNull());
@@ -147,15 +147,19 @@ BOOL ReadyToRunInfo::TryLookupTypeTokenFromName(NameHandle *pName, mdToken * pFo
             // Token must be a typedef token that we previously resolved (we shouldn't get here with an exported type token)
             _ASSERT(TypeFromToken(tokenBasedEncloser.m_TypeToken) == mdtTypeDef);
 
+            int dwCurrentHashCode;
             mdToken mdCurrentTypeToken = tokenBasedEncloser.m_TypeToken;
-            dwHashCode ^= GetVersionResilientTypeHashCode(tokenBasedEncloser.m_pModule->GetMDImport(), mdCurrentTypeToken);
+            if (!GetVersionResilientTypeHashCode(tokenBasedEncloser.m_pModule->GetMDImport(), mdCurrentTypeToken, &dwCurrentHashCode))
+                return FALSE;
+            dwHashCode ^= dwCurrentHashCode;
         }
     }
     else
     {
         // Token based lookups (ex: tokens from IL code)
 
-        dwHashCode = GetVersionResilientTypeHashCode(pName->GetTypeModule()->GetMDImport(), pName->GetTypeToken());
+        if (!GetVersionResilientTypeHashCode(pName->GetTypeModule()->GetMDImport(), pName->GetTypeToken(), &dwHashCode))
+            return FALSE;
     }
 
 
index b48991f..4271c75 100644 (file)
@@ -6,14 +6,15 @@
 #include "versionresilienthashcode.h"
 #include "typehashingalgorithms.h"
 
-int GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token)
+bool GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token, int * pdwHashCode)
 {
     CONTRACTL
     {
-        THROWS;
+        NOTHROW;
         GC_NOTRIGGER;
         SO_TOLERANT;
         MODE_ANY;
+        PRECONDITION(CheckPointer(pdwHashCode));
     }
     CONTRACTL_END
 
@@ -31,42 +32,44 @@ int GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType
     while (hasTypeToken)
     {
         if (IsNilToken(token))
-            ThrowHR(COR_E_BADIMAGEFORMAT);
+            return false;
 
         switch (TypeFromToken(token))
         {
         case mdtTypeDef:
             if (FAILED(pMDImport->GetNameOfTypeDef(token, &szName, &szNamespace)))
-                ThrowHR(COR_E_BADIMAGEFORMAT);
+                return false;
             hr = pMDImport->GetNestedClassProps(token, &token);
             if (hr == CLDB_E_RECORD_NOTFOUND)
                 hasTypeToken = false;
             else if (FAILED(hr))
-                ThrowHR(COR_E_BADIMAGEFORMAT);
+                return false;
             break;
 
         case mdtTypeRef:
             if (FAILED(pMDImport->GetNameOfTypeRef(token, &szNamespace, &szName)))
-                ThrowHR(COR_E_BADIMAGEFORMAT);
+                return false;
             if (FAILED(pMDImport->GetResolutionScopeOfTypeRef(token, &token)))
-                ThrowHR(COR_E_BADIMAGEFORMAT);
+                return false;
             hasTypeToken = (TypeFromToken(token) == mdtTypeRef);
             break;
 
         case mdtExportedType:
             if (FAILED(pMDImport->GetExportedTypeProps(token, &szNamespace, &szName, &token, NULL, NULL)))
-                ThrowHR(COR_E_BADIMAGEFORMAT);
+                return false;
             hasTypeToken = (TypeFromToken(token) == mdtExportedType);
             break;
 
         default:
-            ThrowHR(COR_E_BADIMAGEFORMAT);
+            return false;
         }
 
         hashcode ^= ComputeNameHashCode(szNamespace, szName);
     }
 
-    return hashcode;
+    *pdwHashCode = hashcode;
+
+    return true;
 }
 
 #ifndef DACCESS_COMPILE
index 03a1c0c..9ef0dd3 100644 (file)
@@ -4,6 +4,6 @@
 
 int GetVersionResilientTypeHashCode(TypeHandle type);
 
-int GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token);
+bool GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token, int * pdwHashCode);
 
 int GetVersionResilientMethodHashCode(MethodDesc *pMD);
index c918fcb..831c61b 100644 (file)
@@ -3434,6 +3434,9 @@ bool ZapInfo::getReadyToRunHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken,
        switch (id)
        {
        case CORINFO_HELP_READYTORUN_NEW:
+        // Call CEEInfo::getNewHelper to validate the request (e.g., check for abstract class).
+        m_pEEJitInfo->getNewHelper(pResolvedToken, m_currentMethodHandle);
+
                if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
                        return false;   // Requires runtime lookup.
                pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
index b1accfa..53c5a7a 100644 (file)
@@ -599,7 +599,7 @@ RelativePath=baseservices\exceptions\regressions\Dev11\147911\test147911\test147
 WorkingDir=baseservices\exceptions\regressions\Dev11\147911\test147911
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_FAIL
+Categories=NEW;EXCLUDED
 HostStyle=0
 [dynamicmethodliveness.cmd_86]
 RelativePath=baseservices\exceptions\regressions\Dev11\154243\dynamicmethodliveness\dynamicmethodliveness.cmd
@@ -1250,7 +1250,7 @@ RelativePath=baseservices\threading\generics\Monitor\EnterExit08\EnterExit08.cmd
 WorkingDir=baseservices\threading\generics\Monitor\EnterExit08
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [EnterExit09.cmd_179]
 RelativePath=baseservices\threading\generics\Monitor\EnterExit09\EnterExit09.cmd
@@ -1278,7 +1278,7 @@ RelativePath=baseservices\threading\generics\Monitor\EnterExit12\EnterExit12.cmd
 WorkingDir=baseservices\threading\generics\Monitor\EnterExit12
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [EnterExit13.cmd_183]
 RelativePath=baseservices\threading\generics\Monitor\EnterExit13\EnterExit13.cmd
@@ -1292,7 +1292,7 @@ RelativePath=baseservices\threading\generics\Monitor\EnterExit14\EnterExit14.cmd
 WorkingDir=baseservices\threading\generics\Monitor\EnterExit14
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [TryEnter01.cmd_185]
 RelativePath=baseservices\threading\generics\Monitor\TryEnter01\TryEnter01.cmd
@@ -1306,7 +1306,7 @@ RelativePath=baseservices\threading\generics\Monitor\TryEnter03\TryEnter03.cmd
 WorkingDir=baseservices\threading\generics\Monitor\TryEnter03
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [TryEnter04.cmd_187]
 RelativePath=baseservices\threading\generics\Monitor\TryEnter04\TryEnter04.cmd
@@ -1327,7 +1327,7 @@ RelativePath=baseservices\threading\generics\Monitor\TryEnter06\TryEnter06.cmd
 WorkingDir=baseservices\threading\generics\Monitor\TryEnter06
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [GThread01.cmd_190]
 RelativePath=baseservices\threading\generics\syncdelegate\GThread01\GThread01.cmd
@@ -1964,7 +1964,7 @@ RelativePath=baseservices\threading\generics\TimerCallback\tighttimercallback\ti
 WorkingDir=baseservices\threading\generics\TimerCallback\tighttimercallback
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;EXPECTED_PASS
+Categories=Pri1;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [thread01.cmd_281]
 RelativePath=baseservices\threading\generics\WaitCallback\thread01\thread01.cmd
@@ -2412,7 +2412,7 @@ RelativePath=baseservices\threading\interlocked\compareexchange\CompareExchangeT
 WorkingDir=baseservices\threading\interlocked\compareexchange\CompareExchangeTClass
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_FAIL;UNSTABLE
 HostStyle=0
 [CompareExchangeTClass_1.cmd_345]
 RelativePath=baseservices\threading\interlocked\compareexchange\CompareExchangeTClass_1\CompareExchangeTClass_1.cmd
@@ -2643,7 +2643,7 @@ RelativePath=baseservices\threading\monitor\tryenter\longtimeout\longtimeout.cmd
 WorkingDir=baseservices\threading\monitor\tryenter\longtimeout
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [EnterExitExit.cmd_378]
 RelativePath=baseservices\threading\monitor\unownedlock\EnterExitExit\EnterExitExit.cmd
@@ -3364,7 +3364,7 @@ RelativePath=baseservices\threading\regressions\beta2\437017\437017.cmd
 WorkingDir=baseservices\threading\regressions\beta2\437017
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [437044.cmd_481]
 RelativePath=baseservices\threading\regressions\beta2\437044\437044.cmd
@@ -4631,7 +4631,7 @@ RelativePath=CoreMangLib\cti\system\array\ArraySort3\ArraySort3.cmd
 WorkingDir=CoreMangLib\cti\system\array\ArraySort3
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
+Categories=Pri1;RT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [ArraySort3b.cmd_662]
 RelativePath=CoreMangLib\cti\system\array\ArraySort3b\ArraySort3b.cmd
@@ -9503,7 +9503,7 @@ RelativePath=CoreMangLib\cti\system\dividebyzeroexception\DivideByZeroExceptionC
 WorkingDir=CoreMangLib\cti\system\dividebyzeroexception\DivideByZeroExceptionCtor
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_FAIL;REGRESS
+Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 [DivideByZeroExceptionCtor2.cmd_1358]
 RelativePath=CoreMangLib\cti\system\dividebyzeroexception\DivideByZeroExceptionCtor2\DivideByZeroExceptionCtor2.cmd
@@ -18890,7 +18890,7 @@ RelativePath=CoreMangLib\cti\system\type\TypeGetType1\TypeGetType1.cmd
 WorkingDir=CoreMangLib\cti\system\type\TypeGetType1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_FAIL;REGRESS
+Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 [TypeGetType2.cmd_2699]
 RelativePath=CoreMangLib\cti\system\type\TypeGetType2\TypeGetType2.cmd
@@ -20500,35 +20500,35 @@ RelativePath=GC\Features\HeapExpansion\bestfit\bestfit.cmd
 WorkingDir=GC\Features\HeapExpansion\bestfit
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [bestfit-finalize.cmd_2932]
 RelativePath=GC\Features\HeapExpansion\bestfit-finalize\bestfit-finalize.cmd
 WorkingDir=GC\Features\HeapExpansion\bestfit-finalize
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [bestfit-threaded.cmd_2933]
 RelativePath=GC\Features\HeapExpansion\bestfit-threaded\bestfit-threaded.cmd
 WorkingDir=GC\Features\HeapExpansion\bestfit-threaded
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [bestfit_1.cmd_2934]
 RelativePath=GC\Features\HeapExpansion\bestfit_1\bestfit_1.cmd
 WorkingDir=GC\Features\HeapExpansion\bestfit_1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [expandheap.cmd_2935]
 RelativePath=GC\Features\HeapExpansion\expandheap\expandheap.cmd
 WorkingDir=GC\Features\HeapExpansion\expandheap
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [Finalizer.cmd_2936]
 RelativePath=GC\Features\HeapExpansion\Finalizer\Finalizer.cmd
@@ -20556,7 +20556,7 @@ RelativePath=GC\Features\HeapExpansion\pluggaps\pluggaps.cmd
 WorkingDir=GC\Features\HeapExpansion\pluggaps
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [keepalivearray.cmd_2940]
 RelativePath=GC\Features\KeepAlive\keepaliveother\keepalivearray\keepalivearray.cmd
@@ -20612,7 +20612,7 @@ RelativePath=GC\Features\LOHCompaction\lohcompactapi\lohcompactapi.cmd
 WorkingDir=GC\Features\LOHCompaction\lohcompactapi
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [lohcompactapi2.cmd_2948]
 RelativePath=GC\Features\LOHCompaction\lohcompactapi2\lohcompactapi2.cmd
@@ -20857,7 +20857,7 @@ RelativePath=GC\Scenarios\BinTree\thdtreegrowingobj\thdtreegrowingobj.cmd
 WorkingDir=GC\Scenarios\BinTree\thdtreegrowingobj
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_FAIL
+Categories=NEW;EXPECTED_FAIL;UNSTABLE
 HostStyle=0
 [thdtreelivingobj.cmd_2991]
 RelativePath=GC\Scenarios\BinTree\thdtreelivingobj\thdtreelivingobj.cmd
@@ -21046,7 +21046,7 @@ RelativePath=GC\Scenarios\GCBench\gcbench\gcbench.cmd
 WorkingDir=GC\Scenarios\GCBench\gcbench
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [GCSimulator.cmd_3019]
 RelativePath=GC\Scenarios\GCSimulator\GCSimulator\GCSimulator.cmd
@@ -24077,7 +24077,7 @@ RelativePath=GC\Scenarios\GCStress\gcstress\gcstress.cmd
 WorkingDir=GC\Scenarios\GCStress\gcstress
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [leakgen.cmd_3452]
 RelativePath=GC\Scenarios\LeakGen\leakgen\leakgen.cmd
@@ -24098,7 +24098,7 @@ RelativePath=GC\Scenarios\LeakWheel\leakwheel\leakwheel.cmd
 WorkingDir=GC\Scenarios\LeakWheel\leakwheel
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [minleakgen.cmd_3455]
 RelativePath=GC\Scenarios\MinLeakGen\minleakgen\minleakgen.cmd
@@ -24133,7 +24133,7 @@ RelativePath=GC\Scenarios\ReflectObj\reflectobj\reflectobj.cmd
 WorkingDir=GC\Scenarios\ReflectObj\reflectobj
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [continue.cmd_3461]
 RelativePath=GC\Scenarios\Resurrection\continue\continue.cmd
@@ -24161,7 +24161,7 @@ RelativePath=GC\Scenarios\ServerModel\servermodel\servermodel.cmd
 WorkingDir=GC\Scenarios\ServerModel\servermodel
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [singlinkgen.cmd_3465]
 RelativePath=GC\Scenarios\SingLinkList\singlinkgen\singlinkgen.cmd
@@ -29488,7 +29488,7 @@ RelativePath=JIT\Directed\UnrollLoop\loop2_cs_do\loop2_cs_do.cmd
 WorkingDir=JIT\Directed\UnrollLoop\loop2_cs_do
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [loop2_cs_r.cmd_4251]
 RelativePath=JIT\Directed\UnrollLoop\loop2_cs_r\loop2_cs_r.cmd
@@ -29502,7 +29502,7 @@ RelativePath=JIT\Directed\UnrollLoop\loop2_cs_ro\loop2_cs_ro.cmd
 WorkingDir=JIT\Directed\UnrollLoop\loop2_cs_ro
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [loop3_il_d.cmd_4253]
 RelativePath=JIT\Directed\UnrollLoop\loop3_il_d\loop3_il_d.cmd
@@ -34745,14 +34745,14 @@ RelativePath=JIT\jit64\hfa\main\testA\hfa_nd2A_d\hfa_nd2A_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_nd2A_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nd2A_r.cmd_5003]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_nd2A_r\hfa_nd2A_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_nd2A_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nf0A_d.cmd_5004]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_nf0A_d\hfa_nf0A_d.cmd
@@ -34787,14 +34787,14 @@ RelativePath=JIT\jit64\hfa\main\testA\hfa_nf2A_d\hfa_nf2A_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_nf2A_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nf2A_r.cmd_5009]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_nf2A_r\hfa_nf2A_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_nf2A_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sd0A_d.cmd_5010]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_sd0A_d\hfa_sd0A_d.cmd
@@ -34829,14 +34829,14 @@ RelativePath=JIT\jit64\hfa\main\testA\hfa_sd2A_d\hfa_sd2A_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_sd2A_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sd2A_r.cmd_5015]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_sd2A_r\hfa_sd2A_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_sd2A_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sf0A_d.cmd_5016]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_sf0A_d\hfa_sf0A_d.cmd
@@ -34871,14 +34871,14 @@ RelativePath=JIT\jit64\hfa\main\testA\hfa_sf2A_d\hfa_sf2A_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_sf2A_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sf2A_r.cmd_5021]
 RelativePath=JIT\jit64\hfa\main\testA\hfa_sf2A_r\hfa_sf2A_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testA\hfa_sf2A_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nd0B_d.cmd_5022]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_nd0B_d\hfa_nd0B_d.cmd
@@ -34899,14 +34899,14 @@ RelativePath=JIT\jit64\hfa\main\testB\hfa_nd2B_d\hfa_nd2B_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_nd2B_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nd2B_r.cmd_5025]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_nd2B_r\hfa_nd2B_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_nd2B_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nf0B_d.cmd_5026]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_nf0B_d\hfa_nf0B_d.cmd
@@ -34927,14 +34927,14 @@ RelativePath=JIT\jit64\hfa\main\testB\hfa_nf2B_d\hfa_nf2B_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_nf2B_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nf2B_r.cmd_5029]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_nf2B_r\hfa_nf2B_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_nf2B_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sd0B_d.cmd_5030]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_sd0B_d\hfa_sd0B_d.cmd
@@ -34955,14 +34955,14 @@ RelativePath=JIT\jit64\hfa\main\testB\hfa_sd2B_d\hfa_sd2B_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_sd2B_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sd2B_r.cmd_5033]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_sd2B_r\hfa_sd2B_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_sd2B_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sf0B_d.cmd_5034]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_sf0B_d\hfa_sf0B_d.cmd
@@ -34983,14 +34983,14 @@ RelativePath=JIT\jit64\hfa\main\testB\hfa_sf2B_d\hfa_sf2B_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_sf2B_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_sf2B_r.cmd_5037]
 RelativePath=JIT\jit64\hfa\main\testB\hfa_sf2B_r\hfa_sf2B_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testB\hfa_sf2B_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946
 HostStyle=0
 [hfa_nd0C_d.cmd_5038]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_nd0C_d\hfa_nd0C_d.cmd
@@ -35025,14 +35025,14 @@ RelativePath=JIT\jit64\hfa\main\testC\hfa_nd2C_d\hfa_nd2C_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_nd2C_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_nd2C_r.cmd_5043]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_nd2C_r\hfa_nd2C_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_nd2C_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_nf0C_d.cmd_5044]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_nf0C_d\hfa_nf0C_d.cmd
@@ -35067,14 +35067,14 @@ RelativePath=JIT\jit64\hfa\main\testC\hfa_nf2C_d\hfa_nf2C_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_nf2C_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_nf2C_r.cmd_5049]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_nf2C_r\hfa_nf2C_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_nf2C_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_sd0C_d.cmd_5050]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_sd0C_d\hfa_sd0C_d.cmd
@@ -35109,14 +35109,14 @@ RelativePath=JIT\jit64\hfa\main\testC\hfa_sd2C_d\hfa_sd2C_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_sd2C_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_sd2C_r.cmd_5055]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_sd2C_r\hfa_sd2C_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_sd2C_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_sf0C_d.cmd_5056]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_sf0C_d\hfa_sf0C_d.cmd
@@ -35151,14 +35151,14 @@ RelativePath=JIT\jit64\hfa\main\testC\hfa_sf2C_d\hfa_sf2C_d.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_sf2C_d
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_sf2C_r.cmd_5061]
 RelativePath=JIT\jit64\hfa\main\testC\hfa_sf2C_r\hfa_sf2C_r.cmd
 WorkingDir=JIT\jit64\hfa\main\testC\hfa_sf2C_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;NATIVE_INTEROP
+Categories=Pri0;EXPECTED_PASS;ISSUE_4946;NATIVE_INTEROP
 HostStyle=0
 [hfa_nd0E_d.cmd_5062]
 RelativePath=JIT\jit64\hfa\main\testE\hfa_nd0E_d\hfa_nd0E_d.cmd
@@ -35795,7 +35795,7 @@ RelativePath=JIT\jit64\localloc\ehverify\eh11_large\eh11_large.cmd
 WorkingDir=JIT\jit64\localloc\ehverify\eh11_large
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REGRESS
+Categories=Pri0;EXPECTED_FAIL;REL_FAIL;UNSTABLE
 HostStyle=0
 [eh11_small.cmd_5153]
 RelativePath=JIT\jit64\localloc\ehverify\eh11_small\eh11_small.cmd
@@ -36579,28 +36579,28 @@ RelativePath=JIT\jit64\opt\cse\HugeArray1\HugeArray1.cmd
 WorkingDir=JIT\jit64\opt\cse\HugeArray1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [hugeexpr1.cmd_5296]
 RelativePath=JIT\jit64\opt\cse\hugeexpr1\hugeexpr1.cmd
 WorkingDir=JIT\jit64\opt\cse\hugeexpr1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [HugeField1.cmd_5297]
 RelativePath=JIT\jit64\opt\cse\HugeField1\HugeField1.cmd
 WorkingDir=JIT\jit64\opt\cse\HugeField1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [HugeField2.cmd_5298]
 RelativePath=JIT\jit64\opt\cse\HugeField2\HugeField2.cmd
 WorkingDir=JIT\jit64\opt\cse\HugeField2
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [hugeSimpleExpr1.cmd_5299]
 RelativePath=JIT\jit64\opt\cse\hugeSimpleExpr1\hugeSimpleExpr1.cmd
@@ -37188,7 +37188,7 @@ RelativePath=JIT\jit64\opt\rngchk\RngchkStress3\RngchkStress3.cmd
 WorkingDir=JIT\jit64\opt\rngchk\RngchkStress3
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [SimpleArray_01_o.cmd_5383]
 RelativePath=JIT\jit64\opt\rngchk\SimpleArray_01_o\SimpleArray_01_o.cmd
@@ -47646,7 +47646,7 @@ RelativePath=JIT\Methodical\explicit\rotate\_il_dbgrotarg_double\_il_dbgrotarg_d
 WorkingDir=JIT\Methodical\explicit\rotate\_il_dbgrotarg_double
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [_il_dbgrotarg_float.cmd_6889]
 RelativePath=JIT\Methodical\explicit\rotate\_il_dbgrotarg_float\_il_dbgrotarg_float.cmd
@@ -52476,7 +52476,7 @@ RelativePath=JIT\Methodical\structs\systemvbringup\structinregs\structinregs.cmd
 WorkingDir=JIT\Methodical\structs\systemvbringup\structinregs
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_FAIL;ISSUE_4949
 HostStyle=0
 [switch1.cmd_7581]
 RelativePath=JIT\Methodical\switch\switch1\switch1.cmd
@@ -53029,7 +53029,7 @@ RelativePath=JIT\Methodical\tailcall_v4\hijacking\hijacking.cmd
 WorkingDir=JIT\Methodical\tailcall_v4\hijacking
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;ISSUE_4122
+Categories=Pri0;EXPECTED_FAIL;ISSUE_4122;LONG_RUNNING
 HostStyle=0
 [smallFrame.cmd_7664]
 RelativePath=JIT\Methodical\tailcall_v4\smallFrame\smallFrame.cmd
@@ -55493,7 +55493,7 @@ RelativePath=JIT\Performance\CodeQuality\Bytemark\Bytemark\Bytemark.cmd
 WorkingDir=JIT\Performance\CodeQuality\Bytemark\Bytemark
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [FractalPerf.cmd_8019]
 RelativePath=JIT\Performance\CodeQuality\FractalPerf\FractalPerf\FractalPerf.cmd
@@ -55514,7 +55514,7 @@ RelativePath=JIT\Performance\CodeQuality\Roslyn\CscBench\CscBench.cmd
 WorkingDir=JIT\Performance\CodeQuality\Roslyn\CscBench
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [SciMark.cmd_8022]
 RelativePath=JIT\Performance\CodeQuality\SciMark\SciMark\SciMark.cmd
@@ -57901,7 +57901,7 @@ RelativePath=JIT\Regression\CLR-x86-JIT\V1-M11-Beta1\b40725\b40725\b40725.cmd
 WorkingDir=JIT\Regression\CLR-x86-JIT\V1-M11-Beta1\b40725\b40725
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [b41002.cmd_8375]
 RelativePath=JIT\Regression\CLR-x86-JIT\V1-M11-Beta1\b41002\b41002\b41002.cmd
@@ -61583,7 +61583,7 @@ RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b399444\b399444b\b399444b.cmd
 WorkingDir=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b399444\b399444b
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASS
+Categories=Pri0;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [b405223.cmd_8913]
 RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b405223\b405223\b405223.cmd
@@ -61639,7 +61639,7 @@ RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b425314\b425314\b425314.cmd
 WorkingDir=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b425314\b425314
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REGRESS
+Categories=Pri0;EXPECTED_FAIL;REGRESS;LONG_RUNNING
 HostStyle=0
 [b426654.cmd_8922]
 RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-Beta2\b426654\b426654\b426654.cmd
@@ -62374,7 +62374,7 @@ RelativePath=JIT\Regression\JitBlue\DevDiv_199169\DevDiv_199169\DevDiv_199169.cm
 WorkingDir=JIT\Regression\JitBlue\DevDiv_199169\DevDiv_199169
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_FAIL
+Categories=NEW;EXPECTED_PASS
 HostStyle=0
 [DevDiv_200492.cmd_9028]
 RelativePath=JIT\Regression\JitBlue\DevDiv_200492\DevDiv_200492\DevDiv_200492.cmd
@@ -63438,7 +63438,7 @@ RelativePath=JIT\Regression\VS-ia64-JIT\V1.2-M02\b28158\b28158\b28158.cmd
 WorkingDir=JIT\Regression\VS-ia64-JIT\V1.2-M02\b28158\b28158
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_PASS
+Categories=Pri0;JIT;EXPECTED_PASS;LONG_RUNNING
 HostStyle=0
 [b28158_64.cmd_9180]
 RelativePath=JIT\Regression\VS-ia64-JIT\V1.2-M02\b28158\b28158_64\b28158_64.cmd
@@ -63655,14 +63655,14 @@ RelativePath=JIT\SIMD\CircleInConvex_r\CircleInConvex_r.cmd
 WorkingDir=JIT\SIMD\CircleInConvex_r
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REGRESS
+Categories=Pri0;EXPECTED_PASS
 HostStyle=0
 [CircleInConvex_ro.cmd_9212]
 RelativePath=JIT\SIMD\CircleInConvex_ro\CircleInConvex_ro.cmd
 WorkingDir=JIT\SIMD\CircleInConvex_ro
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REGRESS
+Categories=Pri0;EXPECTED_PASS
 HostStyle=0
 [CreateGeneric_r.cmd_9213]
 RelativePath=JIT\SIMD\CreateGeneric_r\CreateGeneric_r.cmd
@@ -67750,14 +67750,14 @@ RelativePath=readytorun\mainv1\mainv1.cmd
 WorkingDir=readytorun\mainv1
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [mainv2.cmd_9797]
 RelativePath=readytorun\mainv2\mainv2.cmd
 WorkingDir=readytorun\mainv2
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_PASS
+Categories=NEW;EXPECTED_PASS;UNSTABLE
 HostStyle=0
 [Dev10_629953.cmd_9798]
 RelativePath=reflection\regression\dev10bugs\Dev10_629953\Dev10_629953.cmd
index 605ab19..37acb76 100644 (file)
@@ -36,7 +36,6 @@ set __GCSimulatorTests=
 set __msbuildCleanBuildArgs=
 set __msbuildExtraArgs=
 set __verbosity=normal
-set __GCStressLevel=0
 
 :Arg_Loop
 if "%1" == "" goto ArgsDone
@@ -66,7 +65,6 @@ if /i "%1" == "crossgen"            (set __crossgen=true&shift&goto Arg_Loop)
 if /i "%1" == "ilasmroundtrip"      (set __ILAsmRoundtrip=true&shift&goto Arg_Loop)
 if /i "%1" == "sequential"          (set __BuildSequential=1&shift&goto Arg_Loop)
 if /i "%1" == "priority"            (set __TestPriority=%2&shift&shift&goto Arg_Loop)
-if /i "%1" == "gcstresslevel"       (set __GCStressLevel=%2&shift&shift&goto Arg_Loop)
 if /i "%1" == "longgctests"         (set __LongGCTests=1&shift&goto Arg_Loop)
 if /i "%1" == "gcsimulator"         (set __GCSimulatorTests=1&shift&goto Arg_Loop)
 
@@ -265,11 +263,6 @@ if not defined VSINSTALLDIR (
 
 set __msbuildManagedBuildArgs=%__msbuildCleanBuildArgs%
 
-if defined __crossgen (
-    echo Building tests with CrossGen enabled.
-    set __msbuildManagedBuildArgs=%__msbuildManagedBuildArgs% /p:CrossGen=true
-)
-
 if defined __ILAsmRoundtrip (
     echo Building tests with IlasmRoundTrip enabled.
     set __msbuildManagedBuildArgs=%__msbuildManagedBuildArgs% /p:IlasmRoundTrip=true
@@ -280,11 +273,6 @@ if defined __TestPriority (
     set __msbuildManagedBuildArgs=%__msbuildManagedBuildArgs% /p:CLRTestPriorityToBuild=%__TestPriority%
 )
 
-if %__GCStressLevel% GTR 0 (
-    echo Tests will run under GCStressLevel = %__GCStressLevel%
-    set __msbuildManagedBuildArgs=%__msbuildManagedBuildArgs% /p:GCStressLevel=%__GCStressLevel%   
-)
-
 if defined __LongGCTests (
     echo Building tests with Long GC tests enabled.
     set __msbuildManagedBuildArgs=%__msbuildManagedBuildArgs% /p:GCLongRunning=true
@@ -377,7 +365,9 @@ echo clean: force a clean build ^(default is to perform an incremental build^).
 echo CrossGen: enables the tests to run crossgen on the test executables before executing them. 
 echo msbuildargs ... : all arguments following this tag will be passed directly to msbuild.
 echo priority ^<N^> : specify a set of test that will be built and run, with priority N.
-echo gcstresslevel ^<N^> : specify the GCStress level the tests should run under.
+echo     0: Build only priority 0 cases as essential testcases (default)
+echo     1: Build all tests with priority 0 and 1
+echo     666: Build all tests with priority 0, 1 ... 666
 echo sequential: force a non-parallel build ^(default is to build in parallel
 echo     using all processors^).
 echo longgctests: Build tests so that runtests.cmd will do a long-running GC test.
index 64cc31a..ef5b4fe 100644 (file)
@@ -63,7 +63,9 @@ if /i "%1" == "jitminopts"            (set COMPlus_JITMinOpts=1&shift&shift&goto
 if /i "%1" == "jitforcerelocs"        (set COMPlus_ForceRelocs=1&shift&shift&goto Arg_Loop)
 if /i "%1" == "GenerateLayoutOnly"    (set __GenerateLayoutOnly=1&set __SkipWrapperGeneration=true&shift&goto Arg_Loop)
 if /i "%1" == "PerfTests"             (set __PerfTests=true&set __SkipWrapperGeneration=true&shift&goto Arg_Loop)
-if /i "%1" == "runcrossgentests"      (set __RunCrossgenTests=1&shift&goto Arg_Loop)
+if /i "%1" == "runcrossgentests"      (set RunCrossGen=true&shift&goto Arg_Loop)
+REM change it to COMPlus_GCStress when we stop using xunit harness
+if /i "%1" == "gcstresslevel"         (set __GCSTRESSLEVEL=%2&shift&shift&goto Arg_Loop) 
 
 if /i not "%1" == "msbuildargs" goto SkipMsbuildArgs
 :: All the rest of the args will be collected and passed directly to msbuild.
@@ -163,8 +165,7 @@ REM These log files are created automatically by the test run process. Q: what d
 set __TestRunHtmlLog=%__LogsDir%\TestRun_%__BuildOS%__%__BuildArch%__%__BuildType%.html
 set __TestRunXmlLog=%__LogsDir%\TestRun_%__BuildOS%__%__BuildArch%__%__BuildType%.xml
 
-REM set ENV variables here:
-if defined __RunCrossgenTests ( set RunCrossGen=true)
+
 if "%__PerfTests%"=="true" goto RunPerfTests
 if "%__SkipWrapperGeneration%"=="true" goto SkipWrapperGeneration
 
@@ -316,10 +317,10 @@ if "%CORE_ROOT%" == "" (
 
 :: Long GC tests take about 10 minutes per test on average, so
 :: they often bump up against the default 10 minute timeout.
-:: 20 minutes is more than enough time for a test to complete successfully.
+:: 30 minutes is more than enough time for a test to complete successfully.
 if defined __LongGCTests (
-    echo Running Long GC tests, extending timeout to 20 minutes
-    set __TestTimeout=1200000
+    echo Running Long GC tests, extending timeout to 30 minutes
+    set __TestTimeout=1800000
 )
 
 set __BuildLogRootName=Tests_GenerateRuntimeLayout
@@ -350,10 +351,14 @@ echo TestEnv- Optional parameter - this will run a custom script to set custom t
 echo VSVersion- Optional parameter - VS2013 or VS2015 ^(default: VS2015^)
 echo GenerateLayoutOnly - If specified will not run the tests and will only create the Runtime Dependency Layout
 echo RunCrossgenTests   - Runs ReadytoRun tests
-echo jitstress <n>      - Runs the tests with COMPlus_JitStress=n
-echo jitstressregs <n>  - Runs the tests with COMPlus_JitStressRegs=n
+echo jitstress n        - Runs the tests with COMPlus_JitStress=n
+echo jitstressregs n    - Runs the tests with COMPlus_JitStressRegs=n
 echo jitminopts         - Runs the tests with COMPlus_JITMinOpts=1
 echo jitforcerelocs     - Runs the tests with COMPlus_ForceRelocs=1
+echo gcstresslevel n    - Runs the tests with COMPlus_GCStress=n
+echo     0: None                                1: GC on all allocs and 'easy' places
+echo     2: GC on transitions to preemptive GC  4: GC on every allowable JITed instr
+echo     8: GC on every allowable NGEN instr   16: GC only on a unique stack trace
 echo CORE_ROOT The path to the runtime  
 exit /b 1
 
index 2a70c1b..5dc6c71 100755 (executable)
@@ -46,11 +46,16 @@ function print_usage {
     echo '  --useServerGC                    : Enable server GC for this test run'
     echo '  --test-env                       : Script to set environment variables for tests'
     echo '  --runcrossgentests               : Runs the ready to run tests' 
-    echo ''
     echo '  --jitstress=<n>                  : Runs the tests with COMPlus_JitStress=n'
     echo '  --jitstressregs=<n>              : Runs the tests with COMPlus_JitStressRegs=n'
     echo '  --jitminopts                     : Runs the tests with COMPlus_JITMinOpts=1'
     echo '  --jitforcerelocs                 : Runs the tests with COMPlus_ForceRelocs=1'
+    echo '  --gcstresslevel n                : Runs the tests with COMPlus_GCStress=n'
+    echo '    0: None                                1: GC on all allocs and 'easy' places'
+    echo '    2: GC on transitions to preemptive GC  4: GC on every allowable JITed instr'
+    echo '    8: GC on every allowable NGEN instr   16: GC only on a unique stack trace'
+    echo '  --show-time                      : Print execution sequence and running time for each test'
+    echo '  --no-lf-conversion               : Do not execute LF conversion before running test script'
     echo ''
     echo 'Runtime Code Coverage options:'
     echo '  --coreclr-coverage               : Optional argument to get coreclr code coverage reports'
@@ -377,9 +382,9 @@ function create_core_overlay {
 function precompile_overlay_assemblies {
 
     if [ $doCrossgen == 1 ]; then
-    
+
         local overlayDir=$CORE_ROOT
-        
+
         filesToPrecompile=$(ls -trh $overlayDir/*.dll)
         for fileToPrecompile in ${filesToPrecompile}
         do
@@ -391,7 +396,7 @@ function precompile_overlay_assemblies {
                     $overlayDir/crossgen /Platform_Assemblies_Paths $overlayDir $filename 2>/dev/null
                     local exitCode=$?
                     if [ $exitCode == -2146230517 ]; then
-                        echo $filename is not a managed assembly.    
+                        echo $filename is not a managed assembly.
                     elif [ $exitCode != 0 ]; then
                         echo Unable to precompile $filename.
                     else
@@ -402,7 +407,7 @@ function precompile_overlay_assemblies {
         done
     else
         echo Skipping crossgen of FX assemblies.
-    fi    
+    fi
 }
 
 function copy_test_native_bin_to_test_root {
@@ -550,6 +555,7 @@ fi
 declare -a scriptFilePaths
 declare -a outputFilePaths
 declare -a processIds
+declare -a testStartTimes
 
 function finish_test {
     wait ${processIds[$nextProcessIndex]}
@@ -560,26 +566,36 @@ function finish_test {
     local outputFilePath=${outputFilePaths[$nextProcessIndex]}
     local scriptFileName=$(basename "$scriptFilePath")
 
+    local testEndTime=
+    local testRunningTime=
+    local header=
+
+    if [ "$showTime" == "ON" ]; then
+        testEndTime=$(date +%s)
+        testRunningTime=$(echo "$testEndTime - ${testStartTimes[$nextProcessIndex]}" | bc)
+        header=$(printf "[%03d:%4.0fs] " "$countTotalTests" "$testRunningTime")
+    fi
+
     local xunitTestResult
     case $testScriptExitCode in
         0)
             let countPassedTests++
             xunitTestResult='Pass'
             if ((verbose == 1 || runFailingTestsOnly == 1)); then
-                echo "PASSED   - $scriptFilePath"
+                echo "PASSED   - ${header}${scriptFilePath}"
             else
-                echo "         - $scriptFilePath"
+                echo "         - ${header}${scriptFilePath}"
             fi
             ;;
         2)
             let countSkippedTests++
             xunitTestResult='Skip'
-            echo "SKIPPED  - $scriptFilePath"
+            echo "SKIPPED  - ${header}${scriptFilePath}"
             ;;
         *)
             let countFailedTests++
             xunitTestResult='Fail'
-            echo "FAILED   - $scriptFilePath"
+            echo "FAILED   - ${header}${scriptFilePath}"
             ;;
     esac
     let countTotalTests++
@@ -610,9 +626,11 @@ function prep_test {
 
     test "$verbose" == 1 && echo "Preparing $scriptFilePath"
 
-    # Convert DOS line endings to Unix if needed
-    perl -pi -e 's/\r\n|\n|\r/\n/g' "$scriptFilePath"
-    
+    if [ ! "$noLFConversion" == "ON" ]; then
+        # Convert DOS line endings to Unix if needed
+        perl -pi -e 's/\r\n|\n|\r/\n/g' "$scriptFilePath"
+    fi
+        
     # Add executable file mode bit if needed
     chmod +x "$scriptFilePath"
 
@@ -626,7 +644,7 @@ function start_test {
     if ((runFailingTestsOnly == 1)) && ! is_failing_test "$scriptFilePath"; then
         return
     fi
-    
+
     # Skip any test that's not in the current playlist, if a playlist was
     # given to us.
     if [ -n "$playlistFile" ] && ! is_playlist_test "$scriptFilePath"; then
@@ -642,6 +660,10 @@ function start_test {
     local outputFilePath=$(dirname "$scriptFilePath")/${scriptFileName}.out
     outputFilePaths[$nextProcessIndex]=$outputFilePath
 
+    if [ "$showTime" == "ON" ]; then
+        testStartTimes[$nextProcessIndex]=$(date +%s)
+    fi
+
     test "$verbose" == 1 && echo "Starting $scriptFilePath"
     if is_unsupported_test "$scriptFilePath"; then
         skip_unsupported_test "$scriptFilePath" "$outputFilePath" &
@@ -738,6 +760,8 @@ coreClrSrc=
 coverageOutputDir=
 testEnv=
 playlistFile=
+showTime=
+noLFConversion=
 
 ((disableEventLogging = 0))
 ((serverGC = 0))
@@ -805,7 +829,7 @@ do
             ((disableEventLogging = 1))
             ;;
         --runcrossgentests)
-            ((RunCrossGenTests = 1))
+            export RunCrossGen=1
             ;;
         --sequential)
             ((maxProcesses = 1))
@@ -831,6 +855,15 @@ do
         --test-env=*)
             testEnv=${i#*=}
             ;;            
+        --gcstresslevel=*)
+            export COMPlus_GCStress=${i#*=}
+            ;;            
+        --show-time)
+            showTime=ON
+            ;;
+        --no-lf-conversion)
+            noLFConversion=ON
+            ;;
         *)
             echo "Unknown switch: $i"
             print_usage
@@ -843,9 +876,6 @@ if ((disableEventLogging == 0)); then
     export COMPlus_EnableEventLog=1
 fi
 
-if ((RunCrossGenTests == 1)); then
-    export RunCrossGen=1
-fi
 export CORECLR_SERVER_GC="$serverGC"
 
 if [ -z "$testRootDir" ]; then
@@ -864,7 +894,7 @@ if [ -z "$mscorlibDir" ]; then
        mscorlibDir=$coreClrBinDir
 fi
 if [ -d $mscorlibDir/bin ]; then
-    cp $mscorlibDir/bin/* $mscorlibDir   
+    cp $mscorlibDir/bin/* $mscorlibDir
 fi
 
 # If this is a coverage run, make sure the appropriate args have been passed
@@ -918,11 +948,13 @@ fi
 scriptPath=$(dirname $0)
 ${scriptPath}/setup-runtime-dependencies.sh --outputDir=$coreOverlayDir
 
+export __TestEnv=$testEnv
+
 cd "$testRootDir"
 time_start=$(date +"%s")
 if [ -z "$testDirectories" ]
 then
-    # No test directories were specified, so run everything in the current 
+    # No test directories were specified, so run everything in the current
     # directory and its subdirectories.
     run_tests_in_directory "."
 else
index 5b13d09..182f0ef 100755 (executable)
@@ -78,7 +78,7 @@ REM ============================================================================
 REM Write dependency information to project.json
 echo { ^
     "dependencies": { ^
-    "runtime.win7-%__Arch%.Microsoft.NETCore.CoreDisTools": "1.0.1-prerelease-00001" ^
+    "runtime.win7-%__Arch%.Microsoft.NETCore.CoreDisTools": "1.0.1-prerelease-*" ^
     }, ^
     "frameworks": { "dnxcore50": { } } ^
     } > "%__JasonFilePath%"
index 3db178c..db5ecb4 100755 (executable)
@@ -119,7 +119,7 @@ fi
 packageName='runtime.'$rid'.Microsoft.NETCore.CoreDisTools'
 echo {  \
     \"dependencies\": { \
-    \"$packageName\": \"1.0.1-prerelease-00001\" \
+    \"$packageName\": \"1.0.1-prerelease-*\" \
     }, \
     \"frameworks\": { \"dnxcore50\": { } } \
     } > $jsonFilePath
index 99becdd..71ee893 100644 (file)
@@ -18,10 +18,6 @@ WARNING:   When setting properties based on their current state (for example:
 -->
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
-  <ItemGroup>
-    <CLRTestBashEnvironmentVariable Condition="'$(GCStressLevel)' != '' and '$(GCStressLevel)' != '0'" Include="export complus_gcstress=$(GCStressLevel)" />
-  </ItemGroup>
-
   <Target
     Name="GetIlasmRoundTripBashScript"
     Returns="$(IlasmRoundTripBashScript)">
@@ -301,8 +297,10 @@ cd "$%28dirname "$0")"
 LockFile="lock"
 
 
-# The __TestEnv variable may be used to specify something to run before the test.
-$__TestEnv
+# The __TestEnv variable may be used to specify a script to source before the test.
+if [ -n "$__TestEnv" ]%3B then
+    source $__TestEnv
+fi
 
 $(BashEnvironmentVariables)
 $(BashCLRTestEnvironmentCompatibilityCheck)
index 284a2ee..e8c5fbf 100644 (file)
@@ -18,10 +18,6 @@ WARNING:   When setting properties based on their current state (for example:
 -->
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
-  <ItemGroup>
-    <CLRTestBatchEnvironmentVariable Condition="'$(GCStressLevel)' != '' and '$(GCStressLevel)' != '0'" Include="set complus_gcstress=$(GCStressLevel)" />
-  </ItemGroup>
-
   <Target
     Name="GetIlasmRoundTripBatchScript"
     Returns="$(IlasmRoundTripBatchScript)">
index 398315b..5abb4eb 100644 (file)
@@ -18,6 +18,7 @@ namespace CoreclrTestLib
         public const int EXIT_SUCCESS_CODE = 0;
         public const string TIMEOUT_ENVIRONMENT_VAR = "__TestTimeout";
         public const int DEFAULT_TIMEOUT = 1000 * 60*10;
+        public const string GC_STRESS_LEVEL = "__GCSTRESSLEVEL";
 
         public int RunTest(string executable, string outputFile, string errorFile)
         {
@@ -30,6 +31,8 @@ namespace CoreclrTestLib
             string environmentVar = Environment.GetEnvironmentVariable(TIMEOUT_ENVIRONMENT_VAR);
             int timeout = environmentVar != null ? int.Parse(environmentVar) : DEFAULT_TIMEOUT;
 
+            string gcstressVar = Environment.GetEnvironmentVariable(GC_STRESS_LEVEL);
+
             var outputStream = new FileStream(outputFile, FileMode.Create);
             var errorStream = new FileStream(errorFile, FileMode.Create);
 
@@ -37,6 +40,13 @@ namespace CoreclrTestLib
             using (var errorWriter = new StreamWriter(errorStream))
             using (Process process = new Process())
             {
+                if (gcstressVar!=null)
+                {
+                    //Note: this is not the best way to set the Env, but since we are using 
+                    //Desktop to start the tests, this Env will affect the test harness behavior
+                    process.StartInfo.EnvironmentVariables["COMPlus_GCStress"] = gcstressVar;
+                }
+
                 process.StartInfo.FileName = executable;
                 process.StartInfo.UseShellExecute = false;
                 process.StartInfo.RedirectStandardOutput = true;
index fcdaa52..d2841ea 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 51aeb8e..4964785 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 57ef311..788176d 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index afec85d..e5573be 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 1ce77d1..7eb6493 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 60e16be..055dc1a 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ad74203..1cb1c7b 100644 (file)
@@ -17,6 +17,7 @@
     <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>1</CLRTestPriority>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 29c4261..d03fb23 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 9ea109a..f881bfc 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index e77a0ab..f192d3a 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index a9966cc..777ea09 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 7255f62..c23c953 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 8ad6d5f..b47f14c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 74f42dc..1ebe1c4 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index b032f6e..c7d2791 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 57e841f..f4e1757 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index c37c71b..8c5be39 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index 32fe397..62b58ba 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index b813b7e..d14a23b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 033beaf..2f45bbe 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index c31c6a1..6721fdc 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index c24bbda..cc1d4ed 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index c6e3ed4..632ae7e 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index dc02519..71b2daf 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 4028c91..ef71918 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index e1a2598..c4537c7 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index eaeaf6d..5852cbb 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index c64dfc4..4c99eba 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 8354695..e205a56 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 7511425..0ac41fa 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index a44331c..314f1c0 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 95afd02..18755d9 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 476e389..0498c55 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 25fe796..2f923f6 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index f799055..9839ddd 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 9b0e7ef..c23a974 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 15f79b7..82c44a3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 3e489db..aaee185 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index d582b1b..f0ffc1e 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index c37c71b..8c5be39 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index db3a484..fb8bae6 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 4f19b11..11b8db1 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 56fd726..b61f752 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 0e8097f..a106cc2 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 03a5ff1..b2b7d42 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 9696940..ec84610 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 4393c03..6f2e7f2 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 87102b2..51f84f4 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index c76bb56..844a206 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 0c12fa5..275f31f 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index e12132a..4c02fd4 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index be5141a..3be5260 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 12a2a3e..0c61ea1 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index a6f9341..beb1588 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>BuildOnly</CLRTestKind>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 1f67656..499884c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>BuildOnly</CLRTestKind>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 38021fa..0d8d85b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index ed74f9b..96d7cb3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 09fe192..cce30d3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 1a1ddf8..8ddee08 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index a6f9341..beb1588 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>BuildOnly</CLRTestKind>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 1f67656..499884c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>BuildOnly</CLRTestKind>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 9671a2e..3c3f0a3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 7e966da..7bfae51 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index f2b5942..96566a0 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 669fa78..8fdc9ec 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 5e17987..be80e44 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 5e17987..be80e44 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 3e4639e..8e8a00e 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index f19d924..6f518d9 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 7f272f5..3ba9f60 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index eaf9466..5894bf2 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index dce937b..86a5c15 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index f6d7355..850b24c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>
   </PropertyGroup>
index eb17c7b..282dd04 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index 56e1066..230b43e 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 12e6b20..82c0f7b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 6dc8ce2..74d78b4 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 38676cf..667830c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index b6108b7..1192959 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestKind>BuildOnly</CLRTestKind> 
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index ea18012..4f69655 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ce84cac..b21f4cf 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index fc244a9..4533c3b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 0905fe7..1427943 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 28d5fc9..ea3d876 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index 588323c..f6862ff 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 0ad7926..ad97572 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ab28683..d5c2bb3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 8f04fce..2915f9f 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index e9aba06..8f634e9 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 8e57c2e..dfa8942 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index f52e435..c942db2 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index bbc2a1c..db6c723 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 6076046..ea08890 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index 3604b4d..c2785b3 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index 649cd24..767adcb 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index a2086ea..a4a16af 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index a2086ea..a4a16af 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ccde220..22ae6cc 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ecefd7d..717d488 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ad0388b..000215b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <IsLongRunningGCTest>true</IsLongRunningGCTest>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 6a0d01c..a32d9f5 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index b4b60c2..cae5ec0 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 6d7a2d1..65c0cf8 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 31bbfb1..85bc5e9 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index a2bfdb1..3a6ef8c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 9bf6bdf..88c3732 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CLRTestKind>SharedLibrary</CLRTestKind>    
   </PropertyGroup>
index b5ba338..8ae7105 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 89737b1..3f55f2f 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>3 100</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 9409d71..7536472 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>8 100</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 6ab7aaa..74e8d8b 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 86ee137..42a5a5d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6cb3879..b296ec4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 86469e3..93a56c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 66b642c..01d5a2a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8298916..eb1c8f4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3144367..96404bb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 56e8aed..0adec63 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2c6af85..b21617f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7b76476..3795d2c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 556c3dc..e1ecaa9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6218d73..0e398f3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 25a8a52..126cbbc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 19ca41f..8175c64 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index da33463..579fe7e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 667494c..4545179 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a468772..48b4c6f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 15a8586..4826dd7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 055858a..d34f5aa 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 055858a..d34f5aa 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a9a108e..4679f01 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a9a108e..4679f01 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index be8e87c..3996745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cd4f5d4..b78dc2d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 76d808a..915245f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c01be6c..62903d1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c519670..d522f74 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7a0c555..9ba42c7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 02699ab..a8d16c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1c0f260..82b97f5 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2011fb5..5579142 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cafee0d..51788b2 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 74e0b04..96238a6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5d6dd02..5856e91 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c659191..29edcf1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d6e6a84..0e748d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 17b9e42..cf591a8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cdd7fd2..f0a2123 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 30167e1..99235b9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7148b24..2e49148 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6f5473b..437adfc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e69bd71..6c86b8a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6f5473b..437adfc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c935f07..bd3b466 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 96fe542..eac66a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c053417..fecfed3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6e8c1cd..3978912 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5b7a9d3..b6e3f2b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f5f6dbd..5d2c0d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2e2105b..cc609ce 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 14996e6..e08633d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index b7b36c0..06a19b6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 8517 -sdz 17 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e69bd71..6c86b8a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f4353f8..98d48c9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 07c0d50..1c42fbd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f8cfc3a..eda47a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f2a4428..63535bc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f2d0691..23748f8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 91ca392..ebe948c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index b08f91c..df66738 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 35ebf9e..ad4da79 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa1cceb..ecb7039 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 00a6c5e..e4ebbc4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e01e3e8..e1ea4b1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9d966ef..4d22344 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ce16928..4f21655 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d61f865..7126d3f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a6893e9..e9aa22a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 7 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 667494c..4545179 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8298916..eb1c8f4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index be8e87c..3996745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d6e6a84..0e748d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2c6af85..b21617f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e44ba58..b0cc03e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8bc3d0e..2bec1e6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 40a2232..14f4855 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 02699ab..a8d16c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 96fe542..eac66a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9ec1437..e9fdacf 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 30000 -sdc 6000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 85f6410..1d2a1e4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 6000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9343214..19af782 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 86469e3..93a56c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4f308a8..e2ab634 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 2 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2c6af85..b21617f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1363ea3..498f5e3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0ebcdd0..2bdc745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2c6af85..b21617f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5812412..f173579 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0ebcdd0..2bdc745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5812412..f173579 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e44ba58..b0cc03e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4d8531d..77a429b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1d6304b..9ef170d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6ba89cf..078916d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e44ba58..b0cc03e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ca54460..7e95e26 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3a6fcb1..4254a27 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4000840..c666b0f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6783b2a..aa04031 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 03c9bc1..fde642f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0d85ac4..5e9e208 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4d8531d..77a429b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 79e7ad1..1080439 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 50eb7c3..c57b97b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 865fefc..bcd8a4d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9e65e95..fd92d16 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d70479f..1270a0e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6a7b5ef..ab281ab 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index edae1ec..3d6d171 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 884942b..76d1956 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0d85ac4..5e9e208 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index acebb78..30a741b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1d6304b..9ef170d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 070e753..5153a29 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index faac00d..6a06d0b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a01d689..97f9dc3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e5c023d..d50b802 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 85e5be9..6e05a54 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d27acb0..9da9690 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 247685d..f6c2f5e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 77dfed2..8eeffd8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 478aa41..d947398 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8cea5a2..8fa6279 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6ba89cf..078916d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7ada157..9a36a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3a45c73..1df45e2 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 432e968..2d2b80e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 636e79e..b3fcd02 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4d494de..aa43c3d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4ab5cc9..470555a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4508cb9..b1edfdf 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8899100..d98b984 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fe40492..1b0d263 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3529575..59fce50 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ca54460..7e95e26 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8cea5a2..8fa6279 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5e879e1..65e8a58 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6db0854..cdc7a33 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 18eab5c..2ed2dbb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 59d0fa4..bf7e7d1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e375d71..8bbc66f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 61793fa..7410633 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cf9573e..5516cef 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e52671c..beca26c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3522c76..2dedafd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3a6fcb1..4254a27 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5edda6b..590bab3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf9515b..baec950 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4c25fd8..c543222 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2fd0c35..a9e47c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f331168..5193883 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 171dc24..033f6eb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e83d11a..a5eaca6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c99ff22..1a315e0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ddf6e00..4237e7e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 132f46e..3e02f3f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4000840..c666b0f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e35ea43..2df08d9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f10c3a6..05fadd3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8a268bb..060dee7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3ee5181..35949d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cf115da..dfd4681 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5f173a9..edadb55 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6783b2a..aa04031 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6cb3879..b296ec4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 03c9bc1..fde642f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 86469e3..93a56c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 66b642c..01d5a2a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 758df05..dfcb049 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8298916..eb1c8f4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3144367..96404bb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 56e8aed..0adec63 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7b76476..3795d2c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 556c3dc..e1ecaa9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6218d73..0e398f3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 25a8a52..126cbbc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 19ca41f..8175c64 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index da33463..579fe7e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 667494c..4545179 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a468772..48b4c6f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0d85ac4..5e9e208 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 15a8586..4826dd7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 055858a..d34f5aa 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 055858a..d34f5aa 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a9a108e..4679f01 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a9a108e..4679f01 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index be8e87c..3996745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cd4f5d4..b78dc2d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 76d808a..915245f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c01be6c..62903d1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c519670..d522f74 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7a0c555..9ba42c7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f0af44f..e311d0a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 02699ab..a8d16c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1c0f260..82b97f5 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2011fb5..5579142 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cafee0d..51788b2 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c25b0cb..b6f4f5c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 74e0b04..96238a6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5d6dd02..5856e91 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c659191..29edcf1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d6e6a84..0e748d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 17b9e42..cf591a8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cdd7fd2..f0a2123 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 30167e1..99235b9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7148b24..2e49148 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 79e7ad1..1080439 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6f5473b..437adfc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e69bd71..6c86b8a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6f5473b..437adfc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c935f07..bd3b466 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 96fe542..eac66a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c053417..fecfed3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6e8c1cd..3978912 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5b7a9d3..b6e3f2b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f5f6dbd..5d2c0d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2e2105b..cc609ce 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 50eb7c3..c57b97b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 14996e6..e08633d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index b7b36c0..06a19b6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 8517 -sdz 17 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e69bd71..6c86b8a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f4353f8..98d48c9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 07c0d50..1c42fbd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f8cfc3a..eda47a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f2a4428..63535bc 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f2d0691..23748f8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 2 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 91ca392..ebe948c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index b08f91c..df66738 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 865fefc..bcd8a4d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 35ebf9e..ad4da79 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa1cceb..ecb7039 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 00a6c5e..e4ebbc4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 4 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e01e3e8..e1ea4b1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9d966ef..4d22344 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ce16928..4f21655 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d61f865..7126d3f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 5 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a6893e9..e9aa22a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 7 -tp 0 -dz 17 -sdz 17 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 667494c..4545179 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8298916..eb1c8f4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9e65e95..fd92d16 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index be8e87c..3996745 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d6e6a84..0e748d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e44ba58..b0cc03e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8bc3d0e..2bec1e6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 40a2232..14f4855 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 02699ab..a8d16c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 96fe542..eac66a3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9ec1437..e9fdacf 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 30000 -sdc 6000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 85f6410..1d2a1e4 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 6000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9343214..19af782 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d70479f..1270a0e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 86469e3..93a56c6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 17 -dc 20000 -sdc 8000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fd6f1fc..083bc54 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 7 -tp 0 -dz 17 -sdc 1024 -dc 10000 -sdz 17 -lt 2 -dp 0.1 -dw 0.0 -f</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1139d29..4781ff3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 8 -tp 0 -dz 17 -sdc 1024 -dc 10000 -sdz 17 -lt 2 -dp 0.2 -dw 0.0 -f</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4f0d43e..d5bf48d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 10 -tp 0 -dz 17 -sdc 1024 -dc 10000 -sdz 17 -lt 2 -dp 0.2 -dw 0.0 -f</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7039313..83b59c2 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 10 -tp 0 -dz 17 -sdc 1024 -dc 10000 -sdz 17 -lt 2 -dp 0.3 -dw 0.0 -f</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1a936f1..8c7da92 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 8 -tp 0 -dz 17 -sdc 1024 -dc 10000 -sdz 17 -lt 2 -dp 0.3 -dw 0.1 -f</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6a7b5ef..ab281ab 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3522c76..2dedafd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf67c0a..dfe4e1e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c519670..d522f74 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index edae1ec..3d6d171 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 884942b..76d1956 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0d85ac4..5e9e208 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index acebb78..30a741b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 070e753..5153a29 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index faac00d..6a06d0b 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2b8c48c..172e8c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index a01d689..97f9dc3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e5c023d..d50b802 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 85e5be9..6e05a54 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index d27acb0..9da9690 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 247685d..f6c2f5e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 77dfed2..8eeffd8 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 478aa41..d947398 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8cea5a2..8fa6279 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 7ada157..9a36a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3a45c73..1df45e2 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 0936b9b..e278c6e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 432e968..2d2b80e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 636e79e..b3fcd02 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4d494de..aa43c3d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4ab5cc9..470555a 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4508cb9..b1edfdf 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8899100..d98b984 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fe40492..1b0d263 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3529575..59fce50 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8cea5a2..8fa6279 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5e879e1..65e8a58 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 1363ea3..498f5e3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6db0854..cdc7a33 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 18eab5c..2ed2dbb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 59d0fa4..bf7e7d1 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e375d71..8bbc66f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 61793fa..7410633 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cf9573e..5516cef 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.0 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e52671c..beca26c 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3522c76..2dedafd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5edda6b..590bab3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index bf9515b..baec950 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.8</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 4c25fd8..c543222 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 2fd0c35..a9e47c0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f331168..5193883 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 171dc24..033f6eb 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e83d11a..a5eaca6 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.4 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index c99ff22..1a315e0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index ddf6e00..4237e7e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 132f46e..3e02f3f 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e35ea43..2df08d9 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f10c3a6..05fadd3 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 8a268bb..060dee7 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8517 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.8 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 3ee5181..35949d0 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index cf115da..dfd4681 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 5f173a9..edadb55 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 3 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -f -dp 0.8 -dw 0.4</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 9fd7d47..5ac94bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index f85e3e6..7484e8e 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 05fcecb..2f021da 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 4 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 97d8705..4340a0d 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 5 -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index e56588e..436d6bd 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 2 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index fa0ddda..d387a53 100644 (file)
@@ -14,6 +14,7 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <DefineConstants>$(DefineConstants);STATIC;PROJECTK_BUILD</DefineConstants>
     <CLRTestExecutionArguments>-t 1 -tp 0 -dz 17 -sdz 8500 -dc 10000 -sdc 5000 -lt 3 -f -dp 0.0 -dw 0.0</CLRTestExecutionArguments>
     <IsGCSimulatorTest>true</IsGCSimulatorTest>
index 6c9caa3..9a44d93 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ebede9f..8334c04 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 7e7a1ed..bc91fd2 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 16e9485..fe3cb84 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index ef830a7..7635483 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 73acc24..e783da1 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
     <CLRTestExecutionArguments>7 40 4 77</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
index 2cf6c9f..be02e47 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index c0d92ba..95da230 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 2da835f..0a17888 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index d7d9be3..5fb7758 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 56996f3..1430d87 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index a402b69..2dcbe54 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 4dcf00f..c679f97 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 71a1de1..b6c9f1a 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index 8c4a0b8..fc1f47c 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index d41f82c..3286e39 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
index b2938e6..e1eca57 100644 (file)
@@ -13,6 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <GCStressIncompatible>true</GCStressIncompatible>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AbsDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AbsDouble.cs
new file mode 100644 (file)
index 0000000..6429a39
--- /dev/null
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Abs(double) over 5000 iterations for the domain -1, +1
+
+        private const double absDoubleDelta = 0.0004;
+        private const double absDoubleExpectedResult = 2499.9999999999659;
+
+        [Benchmark]
+        public static void AbsDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    AbsDoubleTest();
+                }
+            }
+        }
+
+        public static void AbsDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += absDoubleDelta;
+                result += Math.Abs(value);
+            }
+
+            var diff = Math.Abs(absDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {absDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AcosDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AcosDouble.cs
new file mode 100644 (file)
index 0000000..3ba2867
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Acos(double) over 5000 iterations for the domain -1, +1
+
+        private const double acosDoubleDelta = 0.0004;
+        private const double acosDoubleExpectedResult = 7852.4108380716079;
+
+        [Benchmark]
+        public static void AcosDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    AcosDoubleTest();
+                }
+            }
+        }
+
+        public static void AcosDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += acosDoubleDelta;
+                result += Math.Acos(value);
+            }
+
+            var diff = Math.Abs(acosDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {acosDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AsinDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AsinDouble.cs
new file mode 100644 (file)
index 0000000..030756c
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Asin(double) over 5000 iterations for the domain -1, +1
+
+        private const double asinDoubleDelta = 0.0004;
+        private const double asinDoubleExpectedResult = 1.5707959028763392;
+
+        [Benchmark]
+        public static void AsinDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    AsinDoubleTest();
+                }
+            }
+        }
+
+        public static void AsinDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += asinDoubleDelta;
+                result += Math.Asin(value);
+            }
+
+            var diff = Math.Abs(asinDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {asinDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Atan2Double.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Atan2Double.cs
new file mode 100644 (file)
index 0000000..82831e6
--- /dev/null
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Atan2(double, double) over 5000 iterations for the domain y: -1, +1; x: +1, -1
+
+        private const double atan2DoubleDeltaX = -0.0004;
+        private const double atan2DoubleDeltaY = 0.0004;
+        private const double atan2DoubleExpectedResult = 3926.99081698702;
+
+        [Benchmark]
+        public static void Atan2DoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    Atan2DoubleTest();
+                }
+            }
+        }
+
+        public static void Atan2DoubleTest()
+        {
+            var result = 0.0; var valueX = 1.0; var valueY = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                valueX += atan2DoubleDeltaX; valueY += atan2DoubleDeltaY;
+                result += Math.Atan2(valueY, valueX);
+            }
+
+            var diff = Math.Abs(atan2DoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {atan2DoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AtanDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/AtanDouble.cs
new file mode 100644 (file)
index 0000000..ec2ebe3
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Atan(double) over 5000 iterations for the domain -1, +1
+
+        private const double atanDoubleDelta = 0.0004;
+        private const double atanDoubleExpectedResult = 0.78539816322061329;
+
+        [Benchmark]
+        public static void AtanDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    AtanDoubleTest();
+                }
+            }
+        }
+
+        public static void AtanDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += atanDoubleDelta;
+                result += Math.Atan(value);
+            }
+
+            var diff = Math.Abs(atanDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {atanDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CeilingDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CeilingDouble.cs
new file mode 100644 (file)
index 0000000..f822aae
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Ceiling(double) over 5000 iterations for the domain -1, +1
+
+        private const double ceilingDoubleDelta = 0.0004;
+        private const double ceilingDoubleExpectedResult = 2500;
+
+        [Benchmark]
+        public static void CeilingDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    CeilingDoubleTest();
+                }
+            }
+        }
+
+        public static void CeilingDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += ceilingDoubleDelta;
+                result += Math.Ceiling(value);
+            }
+
+            var diff = Math.Abs(ceilingDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {ceilingDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CosDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CosDouble.cs
new file mode 100644 (file)
index 0000000..e95ab5c
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Cos(double) over 5000 iterations for the domain 0, PI
+
+        private const double cosDoubleDelta = 0.0006283185307180;
+        private const double cosDoubleExpectedResult = -1.0000000005924159;
+
+        [Benchmark]
+        public static void CosDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    CosDoubleTest();
+                }
+            }
+        }
+
+        public static void CosDoubleTest()
+        {
+            var result = 0.0; var value = 0.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += cosDoubleDelta;
+                result += Math.Cos(value);
+            }
+
+            var diff = Math.Abs(cosDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {cosDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CoshDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/CoshDouble.cs
new file mode 100644 (file)
index 0000000..c8b7fb6
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Cosh(double) over 5000 iterations for the domain -1, +1
+
+        private const double coshDoubleDelta = 0.0004;
+        private const double coshDoubleExpectedResult = 5876.0060465657216;
+
+        [Benchmark]
+        public static void CoshDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    CoshDoubleTest();
+                }
+            }
+        }
+
+        public static void CoshDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += coshDoubleDelta;
+                result += Math.Cosh(value);
+            }
+
+            var diff = Math.Abs(coshDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {coshDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/ExpDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/ExpDouble.cs
new file mode 100644 (file)
index 0000000..64be839
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Exp(double) over 5000 iterations for the domain -1, +1
+
+        private const double expDoubleDelta = 0.0004;
+        private const double expDoubleExpectedResult = 5877.1812477590884;
+
+        [Benchmark]
+        public static void ExpDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    ExpDoubleTest();
+                }
+            }
+        }
+
+        public static void ExpDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += expDoubleDelta;
+                result += Math.Exp(value);
+            }
+
+            var diff = Math.Abs(expDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {expDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/FloorDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/FloorDouble.cs
new file mode 100644 (file)
index 0000000..4d4b4f2
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Floor(double) over 5000 iterations for the domain -1, +1
+
+        private const double floorDoubleDelta = 0.0004;
+        private const double floorDoubleExpectedResult = -2500;
+
+        [Benchmark]
+        public static void FloorDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    FloorDoubleTest();
+                }
+            }
+        }
+
+        public static void FloorDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += floorDoubleDelta;
+                result += Math.Floor(value);
+            }
+
+            var diff = Math.Abs(floorDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {floorDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Log10Double.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/Log10Double.cs
new file mode 100644 (file)
index 0000000..330d8a7
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Log10(double) over 5000 iterations for the domain -1, +1
+
+        private const double log10DoubleDelta = 0.0004;
+        private const double log10DoubleExpectedResult = -664.07384902184072;
+
+        [Benchmark]
+        public static void Log10DoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    Log10DoubleTest();
+                }
+            }
+        }
+
+        public static void Log10DoubleTest()
+        {
+            var result = 0.0; var value = 0.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += log10DoubleDelta;
+                result += Math.Log10(value);
+            }
+
+            var diff = Math.Abs(log10DoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {log10DoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/LogDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/LogDouble.cs
new file mode 100644 (file)
index 0000000..bddb84b
--- /dev/null
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Log(double) over 5000 iterations for the domain -1, +1
+
+        private const double logDoubleDelta = 0.0004;
+        private const double logDoubleExpectedResult = -1529.0865454048721;
+
+        [Benchmark]
+        public static void LogDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    LogDoubleTest();
+                }
+            }
+        }
+
+        public static void LogDoubleTest()
+        {
+            var result = 0.0; var value = 0.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += logDoubleDelta;
+                result += Math.Log(value);
+            }
+
+            var diff = Math.Abs(logDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {logDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/PowDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/PowDouble.cs
new file mode 100644 (file)
index 0000000..c824807
--- /dev/null
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Pow(double, double) over 5000 iterations for the domain x: +2, +1; y: -2, -1
+
+        private const double powDoubleDeltaX = -0.0004;
+        private const double powDoubleDeltaY = 0.0004;
+        private const double powDoubleExpectedResult = 4659.4627376138733;
+
+        [Benchmark]
+        public static void PowDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    PowDoubleTest();
+                }
+            }
+        }
+
+        public static void PowDoubleTest()
+        {
+            var result = 0.0; var valueX = 2.0; var valueY = -2.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                valueX += powDoubleDeltaX; valueY += powDoubleDeltaY;
+                result += Math.Pow(valueX, valueY);
+            }
+
+            var diff = Math.Abs(powDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {powDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/RoundDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/RoundDouble.cs
new file mode 100644 (file)
index 0000000..9c5dcc9
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Round(double) over 5000 iterations for the domain -PI/2, +PI/2
+
+        private const double roundDoubleDelta = 0.0006283185307180;
+        private const double roundDoubleExpectedResult = 2;
+
+        [Benchmark]
+        public static void RoundDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    RoundDoubleTest();
+                }
+            }
+        }
+
+        public static void RoundDoubleTest()
+        {
+            var result = 0.0; var value = -1.5707963267948966;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += roundDoubleDelta;
+                result += Math.Round(value);
+            }
+
+            var diff = Math.Abs(roundDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {roundDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinDouble.cs
new file mode 100644 (file)
index 0000000..73886aa
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Sin(double) over 5000 iterations for the domain -PI/2, +PI/2
+
+        private const double sinDoubleDelta = 0.0006283185307180;
+        private const double sinDoubleExpectedResult = 1.0000000005445053;
+
+        [Benchmark]
+        public static void SinDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    SinDoubleTest();
+                }
+            }
+        }
+
+        public static void SinDoubleTest()
+        {
+            var result = 0.0; var value = -1.5707963267948966;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += sinDoubleDelta;
+                result += Math.Sin(value);
+            }
+
+            var diff = Math.Abs(sinDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {sinDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinhDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SinhDouble.cs
new file mode 100644 (file)
index 0000000..8f79cc9
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Sinh(double) over 5000 iterations for the domain -1, +1
+
+        private const double sinhDoubleDelta = 0.0004;
+        private const double sinhDoubleExpectedResult = 1.17520119337903;
+
+        [Benchmark]
+        public static void SinhDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    SinhDoubleTest();
+                }
+            }
+        }
+
+        public static void SinhDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += sinhDoubleDelta;
+                result += Math.Sinh(value);
+            }
+
+            var diff = Math.Abs(sinhDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {sinhDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SqrtDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/SqrtDouble.cs
new file mode 100644 (file)
index 0000000..5d9e554
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Sqrt(double) over 5000 iterations for the domain 0, PI
+
+        private const double sqrtDoubleDelta = 0.0006283185307180;
+        private const double sqrtDoubleExpectedResult = 5909.0605337797215;
+
+        [Benchmark]
+        public static void SqrtDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    SqrtDoubleTest();
+                }
+            }
+        }
+
+        public static void SqrtDoubleTest()
+        {
+            var result = 0.0; var value = 0.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += sqrtDoubleDelta;
+                result += Math.Sqrt(value);
+            }
+
+            var diff = Math.Abs(sqrtDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {sqrtDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanDouble.cs
new file mode 100644 (file)
index 0000000..6988c67
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Tan(double) over 5000 iterations for the domain -PI/2, +PI/2
+
+        private const double tanDoubleDelta = 0.0004;
+        private const double tanDoubleExpectedResult = 1.5574077243051505;
+
+        [Benchmark]
+        public static void TanDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    TanDoubleTest();
+                }
+            }
+        }
+
+        public static void TanDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += tanDoubleDelta;
+                result += Math.Tan(value);
+            }
+
+            var diff = Math.Abs(tanDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {tanDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanhDouble.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Double/TanhDouble.cs
new file mode 100644 (file)
index 0000000..c4809e5
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Tanh(double) over 5000 iterations for the domain -1, +1
+
+        private const double tanhDoubleDelta = 0.0004;
+        private const double tanhDoubleExpectedResult = 0.76159415578341827;
+
+        [Benchmark]
+        public static void TanhDoubleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    TanhDoubleTest();
+                }
+            }
+        }
+
+        public static void TanhDoubleTest()
+        {
+            var result = 0.0; var value = -1.0;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += tanhDoubleDelta;
+                result += Math.Tanh(value);
+            }
+
+            var diff = Math.Abs(tanhDoubleExpectedResult - result);
+
+            if (diff > doubleEpsilon)
+            {
+                throw new Exception($"Expected Result {tanhDoubleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.cs
new file mode 100644 (file)
index 0000000..8ddc6ad
--- /dev/null
@@ -0,0 +1,158 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using Microsoft.Xunit.Performance;
+
+[assembly: OptimizeForBenchmarks]
+[assembly: MeasureInstructionsRetired]
+
+namespace Functions
+{
+    public static class Program
+    {
+#if DEBUG
+        private const int defaultIterations = 1;
+#else
+        private const int defaultIterations = 1000;
+#endif
+
+        private static readonly IDictionary<string, Action> TestList = new Dictionary<string, Action>() {
+            ["absdouble"] = MathTests.AbsDoubleTest,
+            ["abssingle"] = MathTests.AbsSingleTest,
+            ["acosdouble"] = MathTests.AcosDoubleTest,
+            ["asindouble"] = MathTests.AsinDoubleTest,
+            ["atandouble"] = MathTests.AtanDoubleTest,
+            ["atan2double"] = MathTests.Atan2DoubleTest,
+            ["ceilingdouble"] = MathTests.CeilingDoubleTest,
+            ["cosdouble"] = MathTests.CosDoubleTest,
+            ["coshdouble"] = MathTests.CoshDoubleTest,
+            ["expdouble"] = MathTests.ExpDoubleTest,
+            ["floordouble"] = MathTests.FloorDoubleTest,
+            ["logdouble"] = MathTests.LogDoubleTest,
+            ["log10double"] = MathTests.Log10DoubleTest,
+            ["powdouble"] = MathTests.PowDoubleTest,
+            ["rounddouble"] = MathTests.RoundDoubleTest,
+            ["sindouble"] = MathTests.SinDoubleTest,
+            ["sinhdouble"] = MathTests.SinhDoubleTest,
+            ["sqrtdouble"] = MathTests.SqrtDoubleTest,
+            ["tandouble"] = MathTests.TanDoubleTest,
+            ["tanhdouble"] = MathTests.TanhDoubleTest
+        };
+
+        private static int Main(string[] args)
+        {
+            var isPassing = true; var iterations = defaultIterations;
+            ICollection<string> testsToRun = new HashSet<string>();
+
+            try
+            {
+                for (int index = 0; index < args.Length; index++)
+                {
+                    if (args[index].ToLowerInvariant() == "-bench")
+                    {
+                        index++;
+
+                        if ((index >= args.Length) || !int.TryParse(args[index], out iterations))
+                        {
+                            iterations = defaultIterations;
+                        }
+                    }
+                    else if (args[index].ToLowerInvariant() == "all")
+                    {
+                        testsToRun = TestList.Keys;
+                        break;
+                    }
+                    else
+                    {
+                        var testName = args[index].ToLowerInvariant();
+
+                        if (!TestList.ContainsKey(testName))
+                        {
+                            PrintUsage();
+                            break;
+                        }
+
+                        testsToRun.Add(testName);
+                    }
+                }
+
+                if (testsToRun.Count == 0)
+                {
+                    testsToRun = TestList.Keys;
+                }
+
+                foreach (var testToRun in testsToRun)
+                {
+                    Console.WriteLine($"Running {testToRun} test...");
+                    Test(iterations, TestList[testToRun]);
+                }
+            }
+            catch (Exception exception)
+            {
+                Console.WriteLine($"    Error: {exception.Message}");
+                isPassing = false;
+            }
+
+            return isPassing ? 100 : -1;
+        }
+
+        private static void PrintUsage()
+        {
+            Console.WriteLine(@"Usage:
+Functions [name] [-bench #]
+
+  [name]: The name of the function to test. Defaults to 'all'.
+    all");
+
+            foreach (var testName in TestList.Keys)
+            {
+                Console.WriteLine($"  {testName}");
+            }
+
+            Console.WriteLine($@"
+  [-bench #]: The number of iterations. Defaults to {defaultIterations}");
+        }
+
+        private static void Test(int iterations, Action action)
+        {
+            // ****************************************************************
+
+            Console.WriteLine("  Warming up...");
+
+            var startTimestamp = Stopwatch.GetTimestamp();
+
+            action();
+
+            var totalElapsedTime = (Stopwatch.GetTimestamp() - startTimestamp);
+            var totalElapsedTimeInSeconds = (totalElapsedTime / (double)(Stopwatch.Frequency));
+
+            Console.WriteLine($"    Total Time: {totalElapsedTimeInSeconds}");
+
+            // ****************************************************************
+
+            Console.WriteLine($"  Executing {iterations} iterations...");
+
+            totalElapsedTime = 0L;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                startTimestamp = Stopwatch.GetTimestamp();
+
+                action();
+
+                totalElapsedTime += (Stopwatch.GetTimestamp() - startTimestamp);
+            }
+
+            totalElapsedTimeInSeconds = (totalElapsedTime / (double)(Stopwatch.Frequency));
+
+            Console.WriteLine($"    Total Time: {totalElapsedTimeInSeconds} seconds");
+            Console.WriteLine($"    Average Time: {totalElapsedTimeInSeconds / iterations} seconds");
+
+            // ****************************************************************
+        }
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.csproj b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Functions.csproj
new file mode 100644 (file)
index 0000000..48fcf72
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C949CB07-60B2-420A-B3CA-59847ED4700B}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="$(JitPackagesConfigFileDirectory)benchmark\project.json" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Double\AbsDouble.cs" />
+    <Compile Include="Single\AbsSingle.cs" />
+    <Compile Include="Double\AcosDouble.cs" />
+    <Compile Include="Double\AsinDouble.cs" />
+    <Compile Include="Double\AtanDouble.cs" />
+    <Compile Include="Double\Atan2Double.cs" />
+    <Compile Include="Double\CeilingDouble.cs" />
+    <Compile Include="Double\CosDouble.cs" />
+    <Compile Include="Double\CoshDouble.cs" />
+    <Compile Include="Double\ExpDouble.cs" />
+    <Compile Include="Double\FloorDouble.cs" />
+    <Compile Include="Functions.cs" />
+    <Compile Include="Double\LogDouble.cs" />
+    <Compile Include="Double\Log10Double.cs" />
+    <Compile Include="MathTests.cs" />
+    <Compile Include="Double\PowDouble.cs" />
+    <Compile Include="Double\RoundDouble.cs" />
+    <Compile Include="Double\SinDouble.cs" />
+    <Compile Include="Double\SinhDouble.cs" />
+    <Compile Include="Double\SqrtDouble.cs" />
+    <Compile Include="Double\TanDouble.cs" />
+    <Compile Include="Double\TanhDouble.cs" />
+  </ItemGroup>
+  <PropertyGroup>
+    <ProjectJson>$(JitPackagesConfigFileDirectory)benchmark\project.json</ProjectJson>
+    <ProjectLockJson>$(JitPackagesConfigFileDirectory)benchmark\project.lock.json</ProjectLockJson>
+  </PropertyGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/MathTests.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/MathTests.cs
new file mode 100644 (file)
index 0000000..b738c75
--- /dev/null
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // double has a machine epsilon of approx: 2.22e-16. However, due to floating-point precision
+        // errors, this is too accurate when aggregating values of a set of iterations. Using the
+        // single-precision machine epsilon as our epsilon should be 'good enough' for the purposes
+        // of the perf testing as it ensures we get the expected value and that it is at least as precise
+        // as we would have computed with the single-precision version of the function (without aggregation).
+        private const double doubleEpsilon = 1.19e-07;
+
+        // 5000 iterations is enough to cover the full domain of inputs for certain functions (such
+        // as Cos, which has a domain of 0 to PI) at reasonable intervals (in the case of Cos, the
+        // interval is PI / 5000 which is 0.0006283185307180). It should also give reasonable coverage
+        // for functions which have a larger domain (such as Atan, which covers the full set of real numbers).
+        private const int iterations = 5000;
+
+        // float has a machine epsilon of approx: 1.19e-07. However, due to floating-point precision
+        // errors, this is too accurate when aggregating values of a set of iterations. Using the
+        // half-precision machine epsilon as our epsilon should be 'good enough' for the purposes
+        // of the perf testing as it ensures we get the expected value and that it is at least as precise
+        // as we would have computed with the half-precision version of the function (without aggregation).
+        private const float singleEpsilon = 9.77e-04f;
+    }
+}
diff --git a/tests/src/JIT/Performance/CodeQuality/Math/Functions/Single/AbsSingle.cs b/tests/src/JIT/Performance/CodeQuality/Math/Functions/Single/AbsSingle.cs
new file mode 100644 (file)
index 0000000..6168991
--- /dev/null
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Xunit.Performance;
+
+namespace Functions
+{
+    public static partial class MathTests
+    {
+        // Tests Math.Abs(single) over 5000 iterations for the domain -1, +1
+
+        private const float absSingleDelta = 0.0004f;
+        private const float absSingleExpectedResult = 2500.03125f;
+
+        [Benchmark]
+        public static void AbsSingleBenchmark()
+        {
+            foreach (var iteration in Benchmark.Iterations)
+            {
+                using (iteration.StartMeasurement())
+                {
+                    AbsSingleTest();
+                }
+            }
+        }
+
+        public static void AbsSingleTest()
+        {
+            var result = 0.0f; var value = -1.0f;
+
+            for (var iteration = 0; iteration < iterations; iteration++)
+            {
+                value += absSingleDelta;
+                result += Math.Abs(value);
+            }
+
+            var diff = Math.Abs(absSingleExpectedResult - result);
+
+            if (diff > singleEpsilon)
+            {
+                throw new Exception($"Expected Result {absSingleExpectedResult}; Actual Result {result}");
+            }
+        }
+    }
+}
index f2ee913..7ce79e0 100644 (file)
                 <tags>SIMD,AVX</tags>
             </benchmark>
     </benchmark-suite>
+    <benchmark-suite>
+        <name>Math</name>
+        <benchmark>
+            <name>Functions-AbsDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>absdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AbsSingle</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>abssingle -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AcosDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>acosdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AsinDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>asindouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AtanDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>atandouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-Atan2Double</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>atan2double -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CeilingDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>ceilingdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CosDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>cosdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CoshDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>coshdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-ExpDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>expdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-FloorDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>floordouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-LogDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>logdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-Log10Double</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>log10double -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-PowDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>powdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-RoundDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>rounddouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SinDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sindouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SinhDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sinhdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SqrtDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sqrtdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-TanDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>tandouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-TanhDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>tanhdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+    </benchmark-suite>
 </benchmark-system>
index 66e6318..ebbc2ea 100644 (file)
             <expected-results>100</expected-results>
         </benchmark>
     </benchmark-suite>
+    <benchmark-suite>
+        <name>Math</name>
+        <benchmark>
+            <name>Functions-AbsDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>absdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AbsSingle</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>abssingle -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AcosDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>acosdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AsinDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>asindouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-AtanDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>atandouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-Atan2Double</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>atan2double -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CeilingDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>ceilingdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CosDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>cosdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-CoshDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>coshdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-ExpDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>expdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-FloorDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>floordouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-LogDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>logdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-Log10Double</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>log10double -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-PowDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>powdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-RoundDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>rounddouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SinDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sindouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SinhDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sinhdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-SqrtDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>sqrtdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-TanDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>tandouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+        <benchmark>
+            <name>Functions-TanhDouble</name>
+            <directory>.\Math\Functions\Functions</directory>
+            <executable>Functions.exe</executable>
+            <args>tanhdouble -bench 1000000</args>
+            <expected-results>100</expected-results>
+        </benchmark>
+    </benchmark-suite>
 </benchmark-system>
index 147b303..47550a0 100644 (file)
@@ -31,6 +31,7 @@
     <NoLogo>True</NoLogo>
     <NoStandardLib>True</NoStandardLib>
     <Noconfig>True</Noconfig>
+    <Optimize>True</Optimize>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
     <JitOptimizationSensitive>True</JitOptimizationSensitive>
     <DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
diff --git a/tests/src/JIT/Regression/CLR-x86-JIT/V1.2-M01/b05623/b05623.il b/tests/src/JIT/Regression/CLR-x86-JIT/V1.2-M01/b05623/b05623.il
deleted file mode 100644 (file)
index 7505a64..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern mscorlib { }
-.assembly extern System.Console
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
-  .ver 4:0:0:0
-}
-.assembly extern Microsoft.VisualC
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
-  .hash = (EC 47 1C 7B E2 10 BB EE 15 E2 3B 4E FB 55 44 9D   // .G.{......;N.UD.
-           E2 D0 4D B7 )                                     // ..M.
-  .ver 7:0:3300:0
-}
-.assembly t
-{
-
-  // --- The following custom attribute is added automatically, do not uncomment -------
-  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
-  //                                                                                bool) = ( 01 00 00 01 00 00 ) 
-
-  .hash algorithm 0x00008004
-  .ver 0:0:0:0
-}
-.module t.exe
-// MVID: {B0E04E8C-E35E-406B-87D5-0DB207C0D0AC}
-.imagebase 0x00400000
-.subsystem 0x00000003
-.file alignment 512
-.corflags 0x00000001
-// Image base: 0x02fe0000
-
-// =============== CLASS MEMBERS DECLARATION ===================
-
-.method public static char modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)& modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) 
-        PtrToStringChars(string modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) s) cil managed
-{
-  .vtentry 3 : 1
-  // Code size       24 (0x18)
-  .maxstack  2
-  .locals (unsigned int8 modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)& pinned modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) V_0,
-           unsigned int32 V_1,
-           string modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) pinned modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) V_2)
-  IL_0000:  ldnull
-  IL_0001:  stloc.2
-  IL_0002:  ldarg.0
-  IL_0003:  stloc.2
-  IL_0004:  ldarg.0
-  IL_0005:  conv.i4
-  IL_0006:  stloc.0
-  IL_0007:  ldloc.0
-  IL_0008:  brfalse.s  IL_0014
-
-  IL_000a:  call       int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData()
-  IL_000f:  stloc.1
-  IL_0010:  ldloc.0
-  IL_0011:  ldloc.1
-  IL_0012:  add
-  IL_0013:  stloc.0
-  IL_0014:  ldloc.0
-  IL_0015:  br.s       IL_0017
-
-  IL_0017:  ret
-} // end of global method PtrToStringChars
-
-
-.class private auto ansi beforefieldinit T
-       extends [mscorlib]System.Object
-{
-  .method public hidebysig static int32 Main(string[] args) cil managed
-  {
-    .entrypoint
-    // Code size       9 (0x9)
-    .maxstack  1
-       ldc.i4 100
-    IL_0008:  ret
-  } // end of method T::Main
-
-
-    .method family static void  StringToPtrFast(string pstrSrc,
-                                                int32 offset,
-                                                char* pwchDest,
-                                                int32 modopt([Microsoft.VisualC]Microsoft.VisualC.IsLongModifier) cwchSize) cil managed
-    {
-      // Code size       64 (0x40)
-      .maxstack  3
-      .locals (char modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)& pinned modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) V_0,
-               int32 V_1)
-      IL_0000:  ldc.i4.0
-      IL_0001:  ldarg.3
-      IL_0002:  bge.s      IL_003f
-
-      IL_0004:  ldarg.0
-      IL_0005:  call       instance int32 [mscorlib]System.String::get_Length()
-      IL_000a:  ldarg.1
-      IL_000b:  ldarg.3
-      IL_000c:  add
-      IL_000d:  blt.s      IL_0039
-
-      IL_000f:  ldarg.0
-      IL_0010:  call       char modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)& modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) PtrToStringChars(string modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier))
-      IL_0015:  stloc.0
-      IL_0016:  ldloc.0
-      IL_0017:  ldarg.1
-      IL_0018:  ldc.i4.2
-      IL_0019:  mul
-      IL_001a:  add
-      IL_001b:  stloc.0
-      IL_001c:  ldc.i4.0
-      IL_001d:  stloc.1
-      IL_001e:  ldloc.1
-      IL_001f:  ldarg.3
-      IL_0020:  bge.s      IL_0035
-
-      IL_0022:  ldarg.2
-      IL_0023:  ldloc.0
-      IL_0024:  ldind.u2
-      IL_0025:  stind.i2
-      IL_0026:  ldarg.2
-      IL_0027:  ldc.i4.2
-      IL_0028:  add
-      IL_0029:  starg.s    pwchDest
-      IL_002b:  ldloc.0
-      IL_002c:  ldc.i4.2
-      IL_002d:  add
-      IL_002e:  stloc.0
-      IL_002f:  ldloc.1
-      IL_0030:  ldc.i4.1
-      IL_0031:  add
-      IL_0032:  stloc.1
-      IL_0033:  br.s       IL_001e
-
-      IL_0035:  ldc.i4.0
-      IL_0036:  stloc.0
-      IL_0037:  br.s       IL_003f
-
-      IL_0039:  newobj     instance void [mscorlib]System.IndexOutOfRangeException::.ctor()
-      IL_003e:  throw
-
-      IL_003f:  ret
-    } // end of method CXVariantBase::StringToPtrFast
-
-
-
-} // end of class T
-
-
-
-// =============================================================
-
-
-//*********** DISASSEMBLY COMPLETE ***********************
-// WARNING: Created Win32 resource file repro.res
diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.il b/tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.il
new file mode 100644 (file)
index 0000000..d2cb5bd
--- /dev/null
@@ -0,0 +1,150 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// The tail call helper JIT_TailCall has an implicit assumption that all
+// arguments of the tail call are allocated on the caller's frame.
+// In this test A tail-calls B and B tail-calls A: Main --> A --> B --> A --> B --> A.
+// In the last B --> A tail call the frame from the preceding A --> B tail call is resused.
+// It's big enough because of the first B --> A tail call.
+// The bug was that the code for B wasn't copying the incoming struct parameter to its frame.
+// The struct lived on the caller's frame and when it was reused for the B --> A tail call,
+// the struct was overwritten.
+
+.assembly extern mscorlib { }
+
+.assembly GitHub_5164 { }
+
+.class public sequential ansi sealed beforefieldinit LargeStruct
+       extends [mscorlib]System.ValueType
+{
+  .field public int64 l1
+  .field public int64 l2
+  .method public hidebysig specialname rtspecialname 
+          instance void  .ctor(int64 l1,
+                               int64 l2) cil managed
+  {
+    // Code size       15 (0xf)
+    .maxstack  8
+    IL_0000:  ldarg.0
+    IL_0001:  ldarg.1
+    IL_0002:  stfld      int64 LargeStruct::l1
+    IL_0007:  ldarg.0
+    IL_0008:  ldarg.2
+    IL_0009:  stfld      int64 LargeStruct::l2
+    IL_000e:  ret
+  } // end of method LargeStruct::.ctor
+
+} // end of class LargeStruct
+
+.class private auto ansi beforefieldinit Test
+       extends [mscorlib]System.Object
+{
+  .method public hidebysig static int32  Main() cil managed
+  {
+    .entrypoint
+    // Code size       48 (0x30)
+    .maxstack  3
+    .locals init (valuetype LargeStruct V_0,
+             valuetype LargeStruct V_1,
+             valuetype LargeStruct V_2)
+    IL_0000:  ldloca.s   V_0
+    IL_0002:  ldc.i4.1
+    IL_0003:  conv.i8
+    IL_0004:  ldc.i4.2
+    IL_0005:  conv.i8
+    IL_0006:  call       instance void LargeStruct::.ctor(int64,
+                                                          int64)
+    IL_000b:  ldloca.s   V_1
+    IL_000d:  ldc.i4.3
+    IL_000e:  conv.i8
+    IL_000f:  ldc.i4.4
+    IL_0010:  conv.i8
+    IL_0011:  call       instance void LargeStruct::.ctor(int64,
+                                                          int64)
+    IL_0016:  ldc.i4.0
+    IL_0017:  ldloc.0
+    IL_0018:  ldloc.1
+    IL_0019:  call       valuetype LargeStruct Test::A(int32,
+                                                       valuetype LargeStruct,
+                                                       valuetype LargeStruct)
+    IL_001e:  stloc.2
+    IL_001f:  ldloca.s   V_2
+    IL_0021:  ldfld      int64 LargeStruct::l1
+    IL_0026:  ldloca.s   V_2
+    IL_0028:  ldfld      int64 LargeStruct::l2
+    IL_002d:  add
+    IL_002e:  conv.i4
+    IL_002f:  ret
+  } // end of method Test::Main
+
+  .method public hidebysig static valuetype LargeStruct 
+          A(int32 count,
+            valuetype LargeStruct s1,
+            valuetype LargeStruct s2) cil managed noinlining
+  {
+    // Code size       58 (0x3a)
+    .maxstack  4
+    .locals init (valuetype LargeStruct V_0)
+    IL_0000:  ldloca.s   V_0
+    IL_0002:  ldarga.s   s1
+    IL_0004:  ldfld      int64 LargeStruct::l1
+    IL_0009:  ldarga.s   s2
+    IL_000b:  ldfld      int64 LargeStruct::l1
+    IL_0010:  add
+    IL_0011:  ldarga.s   s1
+    IL_0013:  ldfld      int64 LargeStruct::l2
+    IL_0018:  ldarga.s   s2
+    IL_001a:  ldfld      int64 LargeStruct::l2
+    IL_001f:  add
+    IL_0020:  call       instance void LargeStruct::.ctor(int64,
+                                                          int64)
+    IL_0025:  ldarg.0
+    IL_0026:  ldc.i4.3
+    IL_0027:  bge.s      IL_0038
+
+    IL_0029:  ldarg.0
+    IL_002a:  ldc.i4.1
+    IL_002b:  add
+    IL_002c:  dup
+    IL_002d:  starg.s    count
+    IL_002f:  ldloc.0
+    IL_0030:  tail.
+    IL_0032:  call       valuetype LargeStruct Test::B(int32,
+                                                       valuetype LargeStruct)
+    IL_0037:  ret
+
+    IL_0038:  ldloc.0
+    IL_0039:  ret
+  } // end of method Test::A
+
+  .method public hidebysig static valuetype LargeStruct 
+          B(int32 count,
+            valuetype LargeStruct s) cil managed noinlining
+  {
+    // Code size       28 (0x1c)
+    .maxstack  3
+    .locals init (valuetype LargeStruct V_0)
+    IL_0000:  ldloca.s   V_0
+    IL_0002:  ldc.i4.1
+    IL_0003:  conv.i8
+    IL_0004:  ldc.i4.s   44
+    IL_0006:  conv.i8
+    IL_0007:  call       instance void LargeStruct::.ctor(int64,
+                                                          int64)
+    IL_000c:  ldarg.0
+    IL_000d:  ldc.i4.1
+    IL_000e:  add
+    IL_000f:  dup
+    IL_0010:  starg.s    count
+    IL_0012:  ldloc.0
+    IL_0013:  ldarg.1
+    IL_0014:  tail.
+    IL_0016:  call       valuetype LargeStruct Test::A(int32,
+                                                       valuetype LargeStruct,
+                                                       valuetype LargeStruct)
+    IL_001b:  ret
+  } // end of method Test::B
+
+} // end of class Test
+
diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.ilproj b/tests/src/JIT/Regression/JitBlue/GitHub_5164/GitHub_5164.ilproj
new file mode 100644 (file)
index 0000000..b5d5ee9
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT  .0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <PropertyGroup>
+    <DebugType>None</DebugType>
+    <Optimize>True</Optimize>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="GitHub_5164.il" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup> 
+</Project>
index af0741e..441f334 100644 (file)
 .assembly extern mscorlib
 {
 }
-.assembly extern Microsoft.VisualBasic
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         
-  .ver 7:0:0:0
-}
-.assembly extern System
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
-.assembly extern System.Data
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
-.assembly extern System.Xml
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
 .assembly ConsoleApplication2
 {
 
@@ -64,7 +44,6 @@
   .class private auto ansi sealed Module1
          extends [mscorlib]System.Object
   {
-    .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) 
     .method public static int32  Main() cil managed
     {
       .entrypoint
@@ -93,7 +72,7 @@
       IL_0027:  nop
       IL_0028:  nop
       IL_0029:  nop
-               ldc.i4 100
+                ldc.i4     100
       IL_002a:  ret
     } 
 
index fddf631..e4ada33 100644 (file)
 .assembly extern mscorlib
 {
 }
-.assembly extern Microsoft.VisualBasic
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         
-  .ver 7:0:0:0
-}
-.assembly extern System
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
-.assembly extern System.Data
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
-.assembly extern System.Xml
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
-  .ver 1:0:2411:0
-}
 .assembly CByte7a
 {
 
@@ -64,7 +44,6 @@
   .class private auto ansi sealed Module1
          extends [mscorlib]System.Object
   {
-    .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) 
     .method public static int32 Main() cil managed
     {
       .entrypoint
@@ -87,7 +66,7 @@
       IL_0012:  nop
       IL_0013:  nop
       IL_0014:  ldc.i4 100
-               ret
+                ret
     } 
 
   } 
index f639703..581e5be 100644 (file)
@@ -5,8 +5,11 @@ using System;
 using System.Collections.Generic;
 using System.Numerics;
 
-namespace VectorMathTests
+internal partial class VectorTest
 {
+    private const int Pass = 100;
+    private const int Fail = -1;
+
     class Program
     {          
         const float EPS = Single.Epsilon * 5;
@@ -70,9 +73,20 @@ namespace VectorMathTests
 
         static int Main(string[] args)
         {
+            int returnVal = Pass;
+            
             if (Vector2Ctors() != 100 || Vector3Ctors() != 100 || Vector4Ctors() != 100)
-                return 0;
-            return 100;
+            {
+                returnVal = Fail;
+            }
+
+            JitLog jitLog = new JitLog();
+            if (!jitLog.Check("System.Numerics.Vector2:.ctor(float,float)")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector3:.ctor(float,float,float)")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector4:.ctor(float,float,float,float)")) returnVal = Fail;
+            jitLog.Dispose();
+
+            return returnVal;
         }
     }
 }
index 4fe8970..6a2b6b9 100644 (file)
@@ -38,6 +38,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Ctors.cs" />
+    <Compile Include="VectorUtil.cs" />
   </ItemGroup>
   <!--  <PropertyGroup>
     <ProjectJson>$(JitPackagesConfigFileDirectory)threading+thread\project.json</ProjectJson>
index 488946d..6cc9bde 100644 (file)
@@ -38,6 +38,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Ctors.cs" />
+    <Compile Include="VectorUtil.cs" />
   </ItemGroup>
   <!--  <PropertyGroup>
     <ProjectJson>$(JitPackagesConfigFileDirectory)threading+thread\project.json</ProjectJson>
index 10ef289..64a7bde 100644 (file)
@@ -81,6 +81,22 @@ internal partial class VectorTest
         if (Vector2Test.VectorAbs() != Pass) returnVal = Fail;
         if (VectorAbsTest<ushort>.VectorAbs((ushort)0xffff, (ushort)0xffff) != Pass) returnVal = Fail;
         if (VectorAbsTest<byte>.VectorAbs((byte)0xff, (byte)0xff) != Pass) returnVal = Fail;
+        if (VectorAbsTest<uint>.VectorAbs(0x41000000u, 0x41000000u) != Pass) returnVal = Fail;
+        if (VectorAbsTest<ulong>.VectorAbs(0x4100000000000000ul, 0x4100000000000000ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("Abs", "Single")) returnVal = Fail;
+        if (!jitLog.Check("Abs", "Double")) returnVal = Fail;
+        // Abs is not an intrinsic for Int32 and Int64, but IS for UInt32 and UInt64
+        if (!jitLog.Check("System.Numerics.Vector4:Abs")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:Abs")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:Abs")) returnVal = Fail;
+        if (!jitLog.Check("Abs", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("Abs", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("Abs", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("Abs", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index d3dd305..eeaf163 100644 (file)
@@ -86,6 +86,23 @@ internal partial class VectorTest
         if (VectorAddTest<sbyte>.VectorAdd(-1, -2, (sbyte)(-1 - 2)) != Pass) returnVal = Fail;
         if (VectorAddTest<uint>.VectorAdd(0x41000000u, 0x42000000u, 0x41000000u + 0x42000000u) != Pass) returnVal = Fail;
         if (VectorAddTest<ulong>.VectorAdd(0x4100000000000000ul, 0x4200000000000000ul, 0x4100000000000000ul + 0x4200000000000000ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("op_Addition", "Single")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "Double")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:op_Addition")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:op_Addition")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:op_Addition")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("op_Addition", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 8c8c1ec..9d1417a 100644 (file)
@@ -159,6 +159,41 @@ internal partial class VectorTest
             if (VectorArrayTest<sbyte>.VectorArray(1) != Pass) returnVal = Fail;
             if (VectorArrayTest<uint>.VectorArray(1) != Pass) returnVal = Fail;
             if (VectorArrayTest<ulong>.VectorArray(1ul) != Pass) returnVal = Fail;
+
+            JitLog jitLog = new JitLog();
+            if (!jitLog.Check("get_Item", "Single")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[Single][System.Single]:.ctor(float)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "Double")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[Double][System.Double]:.ctor(double)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "Int32")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[Int32][System.Int32]:.ctor(int)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "Int64")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[Int64][System.Int64]:.ctor(long)")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector4:.ctor(float)")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector3:.ctor(float)")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector2:.ctor(float)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "UInt16")) returnVal = Fail;
+            // We are not currently recognizing the Vector<UInt16> constructor.
+            if (!Vector.IsHardwareAccelerated)
+                if (!jitLog.Check("System.Numerics.Vector`1[UInt16][System.UInt16]:.ctor(char)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "Byte")) returnVal = Fail;
+            // We are not currently recognizing the Vector<Byte> constructor.
+            if (!Vector.IsHardwareAccelerated)
+                if (!jitLog.Check("System.Numerics.Vector`1[Byte][System.Byte]:.ctor(ubyte)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "Int16")) returnVal = Fail;
+            // We are not currently recognizing the Vector<Int16> constructor.
+            if (!Vector.IsHardwareAccelerated)
+                if (!jitLog.Check("System.Numerics.Vector`1[Int16][System.Int16]:.ctor(short)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "SByte")) returnVal = Fail;
+            // We are not currently recognizing the Vector<SByte> constructor.
+            if (!Vector.IsHardwareAccelerated)
+                if (!jitLog.Check("System.Numerics.Vector`1[SByte][System.SByte]:.ctor(byte)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "UInt32")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[UInt32][System.UInt32]:.ctor(int)")) returnVal = Fail;
+            if (!jitLog.Check("get_Item", "UInt64")) returnVal = Fail;
+            if (!jitLog.Check("System.Numerics.Vector`1[UInt64][System.UInt64]:.ctor(long)")) returnVal = Fail;
+            jitLog.Dispose();
+
         }
         catch (ArgumentException ex)
         {
index 85ebd4a..154e1e7 100644 (file)
@@ -143,6 +143,30 @@ internal partial class VectorTest
         if (VectorArrayInitTest<uint>.VectorArrayInit(17, random) == Fail) returnVal = Fail;
         if (VectorArrayInitTest<ulong>.VectorArrayInit(12, random) == Fail) returnVal = Fail;
         if (VectorArrayInitTest<ulong>.VectorArrayInit(17, random) == Fail) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check(".ctor(ref)", "Single")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Single")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "Double")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Double")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "Int32")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Int32")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "Int64")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Int64")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "Byte")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Byte")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "Int16")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "Int16")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "SByte")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "SByte")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref)", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check(".ctor(ref,int)", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index b141cfd..3a931fb 100644 (file)
@@ -144,6 +144,30 @@ internal partial class VectorTest
         if (VectorCopyToArrayTest<uint>.VectorCopyToArray(17, random) == Fail) returnVal = Fail;
         if (VectorCopyToArrayTest<ulong>.VectorCopyToArray(12, random) == Fail) returnVal = Fail;
         if (VectorCopyToArrayTest<ulong>.VectorCopyToArray(17, random) == Fail) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("CopyTo(ref)", "Single")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Single")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "Double")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Double")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref)", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("CopyTo(ref,int)", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 031a7d8..fcc4f79 100644 (file)
@@ -107,6 +107,16 @@ internal partial class VectorTest
         if (VectorMulTest<sbyte>.VectorDiv(6, -3, -2) != Pass) returnVal = Fail;
         if (VectorMulTest<uint>.VectorDiv(6u, 3u, 2u) != Pass) returnVal = Fail;
         if (VectorMulTest<ulong>.VectorDiv(8ul, 2ul, 4ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        // Division is only recognized as an intrinsic for floating point element types.
+        if (!jitLog.Check("op_Division", "Single")) returnVal = Fail;
+        if (!jitLog.Check("op_Division", "Double")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:op_Division")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:op_Division")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:op_Division")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 95a2e92..2efe79e 100644 (file)
@@ -111,6 +111,16 @@ internal partial class VectorTest
         if (VectorDotTest<sbyte>.VectorDot(3, 2, (sbyte)(6 * Vector<sbyte>.Count)) != Pass) returnVal = Fail;
         if (VectorDotTest<uint>.VectorDot(3u, 2u, (uint)(6 * Vector<uint>.Count)) != Pass) returnVal = Fail;
         if (VectorDotTest<ulong>.VectorDot(3ul, 2ul, 6ul * (ulong)Vector<ulong>.Count) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        // Dot is only recognized as an intrinsic for floating point element types.
+        if (!jitLog.Check("Dot", "Single")) returnVal = Fail;
+        if (!jitLog.Check("Dot", "Double")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:Dot")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:Dot")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:Dot")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 2e9cb25..a61ce81 100644 (file)
@@ -173,6 +173,36 @@ internal partial class VectorTest
         if (VectorGetTest<sbyte>.VectorGet(101, 1) == Fail) returnVal = Fail;
         if (VectorGetTest<sbyte>.VectorGet(-100, 1) == Fail) returnVal = Fail;
         if (VectorGetTest<sbyte>.VectorGetIndexerOutOfRange(-100, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<uint>.VectorGet(101, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<uint>.VectorGet(100, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<uint>.VectorGetIndexerOutOfRange(100, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<ulong>.VectorGet(101, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<ulong>.VectorGet(100, 1) == Fail) returnVal = Fail;
+        if (VectorGetTest<ulong>.VectorGetIndexerOutOfRange(100, 1) == Fail) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("get_Item", "Double")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Double")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "Single")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Single")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("get_Item", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("get_Count", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 1807885..c0930b6 100644 (file)
@@ -104,6 +104,13 @@ internal partial class VectorTest
         int returnVal = Pass;
 
         if (VectorInitNTest.VectorInitN(0.5f, -0.5f, 0f, 1.0f) == Fail) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("System.Numerics.Vector2:.ctor(float,float)")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:.ctor(float,float,float)")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:.ctor(float,float,float,float)")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 11133b8..f6237e6 100644 (file)
@@ -87,6 +87,23 @@ internal partial class VectorTest
         if (VectorMaxTest<sbyte>.VectorMax(-2, 3, 3) != Pass) returnVal = Fail;
         if (VectorMaxTest<uint>.VectorMax(0x80000000u, 0x40000000u, 0x80000000u) != Pass) returnVal = Fail;
         if (VectorMaxTest<ulong>.VectorMax(2ul, 3ul, 3ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("Max", "Single")) returnVal = Fail;
+        if (!jitLog.Check("Max", "Double")) returnVal = Fail;
+        if (!jitLog.Check("Max", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("Max", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:Max")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:Max")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:Max")) returnVal = Fail;
+        if (!jitLog.Check("Max", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("Max", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("Max", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("Max", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("Max", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("Max", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index c67f122..8757eba 100644 (file)
@@ -86,6 +86,23 @@ internal partial class VectorTest
         if (VectorMinTest<sbyte>.VectorMin(-2, 3, -2) != Pass) returnVal = Fail;
         if (VectorMinTest<uint>.VectorMin(0x80000000u, 0x40000000u, 0x40000000u) != Pass) returnVal = Fail;
         if (VectorMinTest<ulong>.VectorMin(2ul, 3ul, 2ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        if (!jitLog.Check("Min", "Single")) returnVal = Fail;
+        if (!jitLog.Check("Min", "Double")) returnVal = Fail;
+        if (!jitLog.Check("Min", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("Min", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:Min")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:Min")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:Min")) returnVal = Fail;
+        if (!jitLog.Check("Min", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("Min", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("Min", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("Min", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("Min", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("Min", "UInt64")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index e191f25..64698ad 100644 (file)
@@ -119,6 +119,18 @@ internal partial class VectorTest
             returnVal = Fail;
         if (VectorMulTest<ulong>.VectorMul(2ul, 3ul, 2ul * 3ul, (2ul * 3ul) * (2ul * 3ul), (3ul * 3ul)) != Pass)
             returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+        // Multiply is supported only for float, double, int and short
+        if (!jitLog.Check("op_Multiply", "Single")) returnVal = Fail;
+        if (!jitLog.Check("op_Multiply", "Double")) returnVal = Fail;
+        if (!jitLog.Check("op_Multiply", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector4:op_Multiply")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector3:op_Multiply")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector2:op_Multiply")) returnVal = Fail;
+        if (!jitLog.Check("op_Multiply", "Int16")) returnVal = Fail;
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index 70342f3..dc5c2a9 100644 (file)
@@ -155,6 +155,128 @@ internal partial class VectorTest
         if (VectorRelopTest<sbyte>.VectorRelOp(-2, -3) != Pass) returnVal = Fail;
         if (VectorRelopTest<uint>.VectorRelOp(3u, 2u) != Pass) returnVal = Fail;
         if (VectorRelopTest<ulong>.VectorRelOp(3ul, 2ul) != Pass) returnVal = Fail;
+
+        JitLog jitLog = new JitLog();
+
+        // ConditionalSelect, LessThanOrEqual and GreaterThanOrEqual are defined
+        // on the Vector type, so the overloads can't be distinguished.
+        // 
+        if (!jitLog.Check("System.Numerics.Vector:ConditionalSelect(struct,struct,struct):struct")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector:LessThanOrEqual(struct,struct):struct")) returnVal = Fail;
+        if (!jitLog.Check("System.Numerics.Vector:GreaterThanOrEqual(struct,struct):struct")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Single")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Single")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Single")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Single")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Single")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Single")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Single")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Single")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Double")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Double")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Double")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Double")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Double")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Double")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Double")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Double")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int32")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Int32")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Int32")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int64")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Int64")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Int64")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt16")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "UInt16")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "UInt16")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Byte")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Byte")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Byte")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int16")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "Int16")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "Int16")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "SByte")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "SByte")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "SByte")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt32")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "UInt32")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "UInt32")) returnVal = Fail;
+
+        if (!jitLog.Check("Equals", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("LessThan", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("op_BitwiseAnd", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("op_ExclusiveOr", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("GreaterThan", "UInt64")) returnVal = Fail;
+        // This relies on an implementation detail - i.e. that the One and Zero property are implemented
+        // in the library by GetOneValue and GetZeroValue, respectively.
+        if (!jitLog.Check("GetOneValue", "UInt64")) returnVal = Fail;
+        if (!jitLog.Check("GetZeroValue", "UInt64")) returnVal = Fail;
+
+        jitLog.Dispose();
+
         return returnVal;
     }
 }
index a84e0c3..d1b669d 100644 (file)
@@ -5,6 +5,7 @@
 
 using System;
 using System.Numerics;
+using System.IO;
 
 internal partial class VectorTest
 {
@@ -212,4 +213,141 @@ internal partial class VectorTest
         }
         return result;
     }
+
+}
+
+class JitLog : IDisposable
+{
+    FileStream      fileStream;
+    bool            simdIntrinsicsSupported;
+
+    private static String GetLogFileName()
+    {
+        String jitLogFileName = Environment.GetEnvironmentVariable("COMPlus_JitFuncInfoLogFile");
+        return jitLogFileName;
+    }
+
+    public JitLog()
+    {
+        fileStream = null;
+        simdIntrinsicsSupported = Vector.IsHardwareAccelerated;
+        String jitLogFileName = GetLogFileName();
+        if (jitLogFileName == null)
+        {
+            Console.WriteLine("No JitLogFile");
+            return;
+        }
+        if (!File.Exists(jitLogFileName))
+        {
+            Console.WriteLine("JitLogFile " + jitLogFileName + " not found.");
+            return;
+        }
+        File.Copy(jitLogFileName, "Temp.log", true);
+        fileStream = new FileStream("Temp.log", FileMode.Open, FileAccess.Read, FileShare.Read);
+    }
+
+    public void Dispose()
+    {
+        if (fileStream != null)
+        {
+            fileStream.Dispose();
+        }
+    }
+    public bool IsEnabled()
+    {
+        return (fileStream != null);
+    }
+
+    //------------------------------------------------------------------------
+    // Check: Check to see whether 'method' was recognized as an intrinsic by the JIT.
+    //
+    // Arguments:
+    //    method - The method name, as a string
+    //
+    // Return Value:
+    //    If the JitLog is not enabled (either the environment variable is not set,
+    //    or the file was not found, e.g. if the JIT doesn't support it):
+    //     - Returns true
+    //    If SIMD intrinsics are enabled:
+    //     - Returns true if the method was NOT compiled, otherwise false
+    //    Else (if SIMD intrinsics are NOT enabled):
+    //     - Returns true.
+    //       Note that it might be useful to return false if the method was not compiled,
+    //       but it will not be logged as compiled if it is inlined.
+    //
+    // Assumptions:
+    //    The JitLog constructor queries Vector.IsHardwareAccelerated to determine
+    //    if SIMD intrinsics are enabled, and depends on its correctness.
+    //
+    // Notes:
+    //    It searches for the string verbatim. If 'method' is not fully qualified
+    //    or its signature is not provided, it may result in false matches.
+    //
+    // Example:
+    //    CheckJitLog("System.Numerics.Vector4:op_Addition(struct,struct):struct");
+    //
+    public bool Check(String method)
+    {
+        // Console.WriteLine("Checking for " + method + ":");
+        if (!IsEnabled())
+        {
+            Console.WriteLine("JitLog not enabled.");
+            return true;
+        }
+        try
+        {
+            fileStream.Position = 0;
+            StreamReader reader = new StreamReader(fileStream);
+            bool methodFound = false;
+            while ((reader.Peek() >= 0) && (methodFound == false))
+            {
+                String s = reader.ReadLine();
+                if (s.IndexOf(method) != -1)
+                {
+                    methodFound = true;
+                }
+            }
+            if (simdIntrinsicsSupported && methodFound)
+            {
+                Console.WriteLine("Method " + method + " was compiled but should not have been\n");
+                return false;
+            }
+            // Useful when developing / debugging just to be sure that we reached here:
+            // Console.WriteLine(method + ((methodFound) ? " WAS COMPILED" : " WAS NOT COMPILED"));
+            return true;
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine("Error checking JitLogFile: " + e.Message);
+            return false;
+        }
+    }
+
+    // Check: Check to see Vector<'elementType'>:'method' was recognized as an
+    //        intrinsic by the JIT.
+    //
+    // Arguments:
+    //    method - The method name, without its containing type (which is Vector<T>)
+    //    elementType - The type with which Vector<T> is instantiated.
+    //
+    // Return Value:
+    //    See the other overload, above.
+    //
+    // Assumptions:
+    //    The JitLog constructor queries Vector.IsHardwareAccelerated to determine
+    //    if SIMD intrinsics are enabled, and depends on its correctness.
+    //
+    // Notes:
+    //    It constructs the search string based on the way generic types are currently
+    //    dumped by the CLR. If the signature is not provided for the method, it
+    //    may result in false matches.
+    //
+    // Example:
+    //    CheckJitLog("op_Addition(struct,struct):struct", "Single");
+    //
+    public bool Check(String method, String elementType)
+    {
+        String checkString = "System.Numerics.Vector`1[" + elementType + "][System." + elementType + "]:" + method;
+        return Check(checkString);
+    }
 }
diff --git a/tests/src/JIT/SIMD/dir.props b/tests/src/JIT/SIMD/dir.props
new file mode 100644 (file)
index 0000000..1ddaf2f
--- /dev/null
@@ -0,0 +1,21 @@
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\dir.props" />
+
+  <PropertyGroup>
+    <CLRTestBatchPreCommands>
+      <![CDATA[
+$(CLRTestBatchPreCommands)
+set COMPlus_JitFuncInfoLogFile=SIMD.log
+if EXIST SIMD.log (del SIMD.log)
+]]>
+    </CLRTestBatchPreCommands>
+    <BashCLRTestPreCommands>
+      <![CDATA[
+$(BashCLRTestPreCommands)
+export COMPlus_JitFuncInfoLogFile=SIMD.log
+rm -f SIMD.log
+]]>
+    </BashCLRTestPreCommands>
+  </PropertyGroup>
+
+</Project>
index e126d13..42239af 100644 (file)
@@ -9,7 +9,9 @@
     "System.Runtime.Extensions": "4.0.10",
     "System.Runtime.InteropServices": "4.1.0-rc3-24117-00",
     "System.Threading": "4.0.10",
-    "System.Threading.Thread": "4.0.0-rc3-24117-00"
+    "System.Threading.Thread": "4.0.0-rc3-24117-00",
+    "System.IO": "4.0.10",
+    "System.IO.FileSystem": "4.0.1-rc3-24117-00",
   },
   "frameworks": {
     "dnxcore50": {}
index ff31224..eda2d79 100644 (file)
@@ -14,6 +14,7 @@
     "System.Reflection.TypeExtensions": "4.1.0-rc3-24117-00",
     "System.Runtime": "4.1.0-rc3-24117-00",
     "System.Runtime.Extensions": "4.0.10",
+    "System.Runtime.CompilerServices.Unsafe": "4.0.0-rc3-24117-00",
     "System.Runtime.InteropServices": "4.1.0-rc3-24117-00"
   },
   "frameworks": {
diff --git a/tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.cs b/tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.cs
new file mode 100644 (file)
index 0000000..3771bdf
--- /dev/null
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.CompilerServices;
+
+class Test 
+{
+    static int SIZE = 100;
+
+    public static unsafe int Main()
+    {
+        byte* source = stackalloc byte[SIZE];
+        byte* dest   = stackalloc byte[SIZE];
+
+        for (int i = 0; i < SIZE; i++)
+        {
+            source[i] = (byte)(i % 255);
+            dest[i] = 0;
+        }
+
+        Unsafe.CopyBlock(dest, source, (uint) SIZE);
+
+        bool result = true;
+
+        for (int i = 0; i < SIZE; i++)
+        {
+            result &= (source[i] == dest[i]);
+        }
+
+        return (result ? 100 : -1);
+    }
+}
diff --git a/tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.csproj b/tests/src/JIT/opt/Inline/tests/UnsafeBlockCopy.csproj
new file mode 100644 (file)
index 0000000..d2df19d
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT  .0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <PropertyGroup>
+    <DebugType>PdbOnly</DebugType>
+    <Optimize>True</Optimize>
+    <NoLogo>True</NoLogo>
+    <NoStandardLib>True</NoStandardLib>
+    <Noconfig>True</Noconfig>
+    <DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="UnsafeBlockCopy.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="$(JitPackagesConfigFileDirectory)extra\project.json" />
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <PropertyGroup>
+    <ProjectJson>$(JitPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+    <ProjectLockJson>$(JitPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+  </PropertyGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup> 
+</Project>
index 78bf1b2..eb2eddf 100644 (file)
@@ -32,6 +32,7 @@
     <NoLogo>True</NoLogo>
     <NoStandardLib>True</NoStandardLib>
     <Noconfig>True</Noconfig>
+    <Optimize>True</Optimize>
     <JitOptimizationSensitive>True</JitOptimizationSensitive>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
     <DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep.il b/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep.il
new file mode 100644 (file)
index 0000000..ced74aa
--- /dev/null
@@ -0,0 +1,322 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+.assembly extern mscorlib { }
+.assembly extern MyDep2 { }
+
+.assembly MyDep
+{
+       .ver 1:0:0:0
+}
+
+
+.class extern forwarder MyDep2.Enclosing1   { .assembly extern MyDep2 }
+.class extern Nested1                       { .class extern MyDep2.Enclosing1 }
+.class extern SubNested1                    { .class extern MyDep2.Enclosing1/Nested1 }
+.class extern SubNested2                    { .class extern MyDep2.Enclosing1/Nested1 }
+.class extern Nested2                       { .class extern MyDep2.Enclosing1 }
+.class extern SubNested1                    { .class extern MyDep2.Enclosing1/Nested2 }
+.class extern SubNested2                    { .class extern MyDep2.Enclosing1/Nested2 }
+.class extern forwarder MyDep2.Enclosing2   { .assembly extern MyDep2 }
+.class extern Nested1                       { .class extern MyDep2.Enclosing2 }
+.class extern SubNested1                    { .class extern MyDep2.Enclosing2/Nested1 }
+.class extern SubNested2                    { .class extern MyDep2.Enclosing2/Nested1 }
+.class extern Nested2                       { .class extern MyDep2.Enclosing2 }
+.class extern SubNested1                    { .class extern MyDep2.Enclosing2/Nested2 }
+.class extern SubNested2                    { .class extern MyDep2.Enclosing2/Nested2 }
+
+
+.class extern forwarder MyDep3.Enclosing1   { .assembly extern MyDep2 }
+.class extern Nested1                       { .class extern MyDep3.Enclosing1 }
+.class extern SubNested1                    { .class extern MyDep3.Enclosing1/Nested1 }
+.class extern SubNested2                    { .class extern MyDep3.Enclosing1/Nested1 }
+.class extern Nested2                       { .class extern MyDep3.Enclosing1 }
+.class extern SubNested1                    { .class extern MyDep3.Enclosing1/Nested2 }
+.class extern SubNested2                    { .class extern MyDep3.Enclosing1/Nested2 }
+.class extern forwarder MyDep3.Enclosing2   { .assembly extern MyDep2 }
+.class extern Nested1                       { .class extern MyDep3.Enclosing2 }
+.class extern SubNested1                    { .class extern MyDep3.Enclosing2/Nested1 }
+.class extern SubNested2                    { .class extern MyDep3.Enclosing2/Nested1 }
+.class extern Nested2                       { .class extern MyDep3.Enclosing2 }
+.class extern SubNested1                    { .class extern MyDep3.Enclosing2/Nested2 }
+.class extern SubNested2                    { .class extern MyDep3.Enclosing2/Nested2 }
+
+
+.class public auto ansi beforefieldinit MyDep.Enclosing1
+    extends [mscorlib]System.Object
+{
+    // Nested Types
+    .class nested public auto ansi beforefieldinit Nested1
+        extends [mscorlib]System.Object
+    {
+        // Nested Types
+        .class nested public auto ansi beforefieldinit SubNested1
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested1::.ctor
+
+        } // end of class SubNested1
+
+        .class nested public auto ansi beforefieldinit SubNested2
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested2::.ctor
+
+        } // end of class SubNested2
+
+
+        // Methods
+        .method public hidebysig specialname rtspecialname 
+            instance void .ctor () cil managed 
+        {
+            // Method begins at RVA 0x2050
+            // Code size 8 (0x8)
+            .maxstack 8
+
+            IL_0000: ldarg.0
+            IL_0001: call instance void [mscorlib]System.Object::.ctor()
+            IL_0006: nop
+            IL_0007: ret
+        } // end of method Nested1::.ctor
+
+    } // end of class Nested1
+
+    .class nested public auto ansi beforefieldinit Nested2
+        extends [mscorlib]System.Object
+    {
+        // Nested Types
+        .class nested public auto ansi beforefieldinit SubNested1
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested1::.ctor
+
+        } // end of class SubNested1
+
+        .class nested public auto ansi beforefieldinit SubNested2
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested2::.ctor
+
+        } // end of class SubNested2
+
+
+        // Methods
+        .method public hidebysig specialname rtspecialname 
+            instance void .ctor () cil managed 
+        {
+            // Method begins at RVA 0x2050
+            // Code size 8 (0x8)
+            .maxstack 8
+
+            IL_0000: ldarg.0
+            IL_0001: call instance void [mscorlib]System.Object::.ctor()
+            IL_0006: nop
+            IL_0007: ret
+        } // end of method Nested2::.ctor
+
+    } // end of class Nested2
+
+
+    // Methods
+    .method public hidebysig specialname rtspecialname 
+        instance void .ctor () cil managed 
+    {
+        // Method begins at RVA 0x2050
+        // Code size 8 (0x8)
+        .maxstack 8
+
+        IL_0000: ldarg.0
+        IL_0001: call instance void [mscorlib]System.Object::.ctor()
+        IL_0006: nop
+        IL_0007: ret
+    } // end of method Enclosing1::.ctor
+
+} // end of class MyDep.Enclosing1
+
+.class public auto ansi beforefieldinit MyDep.Enclosing2
+    extends [mscorlib]System.Object
+{
+    // Nested Types
+    .class nested public auto ansi beforefieldinit Nested1
+        extends [mscorlib]System.Object
+    {
+        // Nested Types
+        .class nested public auto ansi beforefieldinit SubNested1
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested1::.ctor
+
+        } // end of class SubNested1
+
+        .class nested public auto ansi beforefieldinit SubNested2
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested2::.ctor
+
+        } // end of class SubNested2
+
+
+        // Methods
+        .method public hidebysig specialname rtspecialname 
+            instance void .ctor () cil managed 
+        {
+            // Method begins at RVA 0x2050
+            // Code size 8 (0x8)
+            .maxstack 8
+
+            IL_0000: ldarg.0
+            IL_0001: call instance void [mscorlib]System.Object::.ctor()
+            IL_0006: nop
+            IL_0007: ret
+        } // end of method Nested1::.ctor
+
+    } // end of class Nested1
+
+    .class nested public auto ansi beforefieldinit Nested2
+        extends [mscorlib]System.Object
+    {
+        // Nested Types
+        .class nested public auto ansi beforefieldinit SubNested1
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested1::.ctor
+
+        } // end of class SubNested1
+
+        .class nested public auto ansi beforefieldinit SubNested2
+            extends [mscorlib]System.Object
+        {
+            // Methods
+            .method public hidebysig specialname rtspecialname 
+                instance void .ctor () cil managed 
+            {
+                // Method begins at RVA 0x2050
+                // Code size 8 (0x8)
+                .maxstack 8
+
+                IL_0000: ldarg.0
+                IL_0001: call instance void [mscorlib]System.Object::.ctor()
+                IL_0006: nop
+                IL_0007: ret
+            } // end of method SubNested2::.ctor
+
+        } // end of class SubNested2
+
+
+        // Methods
+        .method public hidebysig specialname rtspecialname 
+            instance void .ctor () cil managed 
+        {
+            // Method begins at RVA 0x2050
+            // Code size 8 (0x8)
+            .maxstack 8
+
+            IL_0000: ldarg.0
+            IL_0001: call instance void [mscorlib]System.Object::.ctor()
+            IL_0006: nop
+            IL_0007: ret
+        } // end of method Nested2::.ctor
+
+    } // end of class Nested2
+
+
+    // Methods
+    .method public hidebysig specialname rtspecialname 
+        instance void .ctor () cil managed 
+    {
+        // Method begins at RVA 0x2050
+        // Code size 8 (0x8)
+        .maxstack 8
+
+        IL_0000: ldarg.0
+        IL_0001: call instance void [mscorlib]System.Object::.ctor()
+        IL_0006: nop
+        IL_0007: ret
+    } // end of method Enclosing2::.ctor
+
+} // end of class MyDep.Enclosing2
@@ -2,8 +2,7 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
-    <AssemblyName>RMV-4-1-6d-two</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <AssemblyName>MyDep</AssemblyName>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
@@ -11,9 +10,9 @@
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
+    <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
+    <OutputType>Library</OutputType>
+    <CLRTestKind>BuildOnly</CLRTestKind>
     <CLRTestPriority>0</CLRTestPriority>
   </PropertyGroup>
 
   </ItemGroup>
 
   <ItemGroup>
-    <Compile Include="RMV-4-1-6d-two.il" />
+    <Compile Include="MyDep.il" />
   </ItemGroup>
 
   <ItemGroup>
     <None Include="app.config" />
   </ItemGroup>
+  
+  <PropertyGroup>
+    <Optimize>True</Optimize>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <ProjectReference Include="MyDep2.csproj" />
+  </ItemGroup>
 
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep2.cs b/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep2.cs
new file mode 100644 (file)
index 0000000..d29616e
--- /dev/null
@@ -0,0 +1,42 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.CompilerServices;
+
+[assembly:TypeForwardedToAttribute(typeof(MyDep3.Enclosing1))]
+[assembly:TypeForwardedToAttribute(typeof(MyDep3.Enclosing2))]
+
+namespace MyDep2
+{
+    public class Enclosing1
+    {
+        public class Nested1
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+
+        public class Nested2
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+    }
+
+    public class Enclosing2
+    {
+        public class Nested1
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+
+        public class Nested2
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+    }
+}
@@ -2,7 +2,7 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
-    <AssemblyName>RMV-4-1-6b</AssemblyName>
+    <AssemblyName>MyDep2</AssemblyName>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <SchemaVersion>2.0</SchemaVersion>
@@ -11,9 +11,9 @@
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
+    <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
+    <OutputType>Library</OutputType>
+    <CLRTestKind>BuildOnly</CLRTestKind>
     <CLRTestPriority>0</CLRTestPriority>
   </PropertyGroup>
 
   </ItemGroup>
 
   <ItemGroup>
-    <Compile Include="RMV-4-1-6b.il" />
+    <Compile Include="MyDep2.cs" />
   </ItemGroup>
 
   <ItemGroup>
     <None Include="app.config" />
+    <None Include="project.json" />
+  </ItemGroup>
+  
+  <ItemGroup>
+    <ProjectReference Include="MyDep3.csproj" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep3.cs b/tests/src/Loader/classloader/TypeForwarding/UnitTest/MyDep3.cs
new file mode 100644 (file)
index 0000000..a1fcb98
--- /dev/null
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.CompilerServices;
+
+namespace MyDep3
+{
+    public class Enclosing1
+    {
+        public class Nested1
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+
+        public class Nested2
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+    }
+
+    public class Enclosing2
+    {
+        public class Nested1
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+
+        public class Nested2
+        {
+            public class SubNested1 { }
+            public class SubNested2 { }
+        }
+    }
+}
@@ -2,7 +2,7 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
-    <AssemblyName>RMV-4-CA</AssemblyName>
+    <AssemblyName>MyDep3</AssemblyName>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <SchemaVersion>2.0</SchemaVersion>
@@ -11,7 +11,7 @@
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
+    <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <OutputType>Library</OutputType>
     <CLRTestKind>BuildOnly</CLRTestKind>
     <CLRTestPriority>0</CLRTestPriority>
   </ItemGroup>
 
   <ItemGroup>
-    <Compile Include="RMV-4-CA.il" />
+    <Compile Include="MyDep3.cs" />
   </ItemGroup>
 
   <ItemGroup>
     <None Include="app.config" />
+    <None Include="project.json" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/UnitTest.il b/tests/src/Loader/classloader/TypeForwarding/UnitTest/UnitTest.il
new file mode 100644 (file)
index 0000000..22d5d6f
--- /dev/null
@@ -0,0 +1,186 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+.assembly extern mscorlib { } 
+
+.assembly extern MyDep
+{
+  .ver 1:0:0:0
+}
+
+.assembly UnitTest { }
+
+
+
+.class public auto ansi beforefieldinit Program
+       extends [mscorlib]System.Object
+{
+  .method public hidebysig static int32  Main(string[] args) cil managed noinlining
+  {
+    .entrypoint
+    // Code size       410 (0x19a)
+    .maxstack  3
+    .locals init ([0] int32 V_0)
+    IL_0000:  nop
+    IL_0001:  nop
+    IL_0002:  newobj     instance void [MyDep]MyDep.Enclosing1::.ctor()
+    IL_0007:  pop
+    IL_0008:  ldstr      "MyDep.Enclosing2, MyDep, Version=1.0.0.0, Culture="
+    + "neutral, PublicKeyToken=null"
+    IL_000d:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0012:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0017:  pop
+    IL_0018:  newobj     instance void [MyDep]MyDep.Enclosing1/Nested1/SubNested1::.ctor()
+    IL_001d:  pop
+    IL_001e:  ldstr      "MyDep.Enclosing1+Nested1+SubNested2, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0023:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0028:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_002d:  pop
+    IL_002e:  newobj     instance void [MyDep]MyDep.Enclosing1/Nested2/SubNested1::.ctor()
+    IL_0033:  pop
+    IL_0034:  ldstr      "MyDep.Enclosing1+Nested2+SubNested2, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0039:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_003e:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0043:  pop
+    IL_0044:  ldstr      "MyDep.Enclosing2+Nested1+SubNested1, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0049:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_004e:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0053:  pop
+    IL_0054:  ldstr      "MyDEP.EnclosING2+NesTED1+SubNesTED2, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0059:  ldc.i4.1
+    IL_005a:  ldc.i4.1
+    IL_005b:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string,
+                                                                                                bool,
+                                                                                                bool)
+    IL_0060:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0065:  pop
+    IL_0066:  ldstr      "MyDep.Enclosing2+Nested2+SubNested1, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_006b:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0070:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0075:  pop
+    IL_0076:  ldstr      "MyDep.Enclosing2+Nested2+SubNested2, MyDep, Versio"
+    + "n=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_007b:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0080:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0085:  pop
+    IL_0086:  nop
+    IL_0087:  nop
+    IL_0088:  newobj     instance void [MyDep]MyDep2.Enclosing1::.ctor()
+    IL_008d:  pop
+    IL_008e:  ldstr      "MyDep2.Enclosing2, MyDep, Version=1.0.0.0, Culture"
+    + "=neutral, PublicKeyToken=null"
+    IL_0093:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0098:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_009d:  pop
+    IL_009e:  newobj     instance void [MyDep]MyDep2.Enclosing1/Nested1/SubNested1::.ctor()
+    IL_00a3:  pop
+    IL_00a4:  ldstr      "MyDep2.Enclosing1+Nested1+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_00a9:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_00ae:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_00b3:  pop
+    IL_00b4:  newobj     instance void [MyDep]MyDep2.Enclosing1/Nested2/SubNested1::.ctor()
+    IL_00b9:  pop
+    IL_00ba:  ldstr      "MyDep2.Enclosing1+Nested2+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_00bf:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_00c4:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_00c9:  pop
+    IL_00ca:  ldstr      "MyDep2.Enclosing2+Nested1+SubNested1, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_00cf:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_00d4:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_00d9:  pop
+    IL_00da:  ldstr      "MyDEP2.EnclosING2+NesTED1+SubNesTED2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_00df:  ldc.i4.1
+    IL_00e0:  ldc.i4.1
+    IL_00e1:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string,
+                                                                                                bool,
+                                                                                                bool)
+    IL_00e6:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_00eb:  pop
+    IL_00ec:  ldstr      "MyDep2.Enclosing2+Nested2+SubNested1, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_00f1:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_00f6:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_00fb:  pop
+    IL_00fc:  ldstr      "MyDep2.Enclosing2+Nested2+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0101:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0106:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_010b:  pop
+    IL_010c:  nop
+    IL_010d:  nop
+    IL_010e:  newobj     instance void [MyDep]MyDep3.Enclosing1::.ctor()
+    IL_0113:  pop
+    IL_0114:  ldstr      "MyDep3.Enclosing2, MyDep, Version=1.0.0.0, Culture"
+    + "=neutral, PublicKeyToken=null"
+    IL_0119:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_011e:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0123:  pop
+    IL_0124:  newobj     instance void [MyDep]MyDep3.Enclosing1/Nested1/SubNested1::.ctor()
+    IL_0129:  pop
+    IL_012a:  ldstr      "MyDep3.Enclosing1+Nested1+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_012f:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_0134:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0139:  pop
+    IL_013a:  newobj     instance void [MyDep]MyDep3.Enclosing1/Nested2/SubNested1::.ctor()
+    IL_013f:  pop
+    IL_0140:  ldstr      "MyDep3.Enclosing1+Nested2+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0145:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_014a:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_014f:  pop
+    IL_0150:  ldstr      "MyDep3.Enclosing2+Nested1+SubNested1, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0155:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_015a:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_015f:  pop
+    IL_0160:  ldstr      "MyDEP3.EnclosING2+NesTED1+SubNesTED2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0165:  ldc.i4.1
+    IL_0166:  ldc.i4.1
+    IL_0167:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string,
+                                                                                                bool,
+                                                                                                bool)
+    IL_016c:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0171:  pop
+    IL_0172:  ldstr      "MyDep3.Enclosing2+Nested2+SubNested1, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0177:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_017c:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0181:  pop
+    IL_0182:  ldstr      "MyDep3.Enclosing2+Nested2+SubNested2, MyDep, Versi"
+    + "on=1.0.0.0, Culture=neutral, PublicKeyToken=null"
+    IL_0187:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetType(string)
+    IL_018c:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
+    IL_0191:  pop
+    IL_0192:  nop
+    IL_0193:  ldc.i4.s   100
+    IL_0195:  stloc.0
+    IL_0196:  br.s       IL_0198
+
+    IL_0198:  ldloc.0
+    IL_0199:  ret
+  } // end of method Program::Main
+
+  .method public hidebysig specialname rtspecialname 
+          instance void  .ctor() cil managed
+  {
+    // Code size       8 (0x8)
+    .maxstack  8
+    IL_0000:  ldarg.0
+    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
+    IL_0006:  nop
+    IL_0007:  ret
+  } // end of method Program::.ctor
+
+}
\ No newline at end of file
@@ -2,7 +2,7 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
   <PropertyGroup>
-    <AssemblyName>RMV-4-1-6a</AssemblyName>
+    <AssemblyName>UnitTest</AssemblyName>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <SchemaVersion>2.0</SchemaVersion>
@@ -11,7 +11,7 @@
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
+    <ReferenceLocalMscorlib>false</ReferenceLocalMscorlib>
     <OutputType>Exe</OutputType>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>0</CLRTestPriority>
@@ -24,7 +24,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Compile Include="RMV-4-1-6a.il" />
+    <Compile Include="UnitTest.il" />
   </ItemGroup>
 
   <ItemGroup>
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="MyDep.ilproj" />
+    <ProjectReference Include="MyDep2.csproj" />
+    <ProjectReference Include="MyDep3.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
   </ItemGroup>
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/app.config b/tests/src/Loader/classloader/TypeForwarding/UnitTest/app.config
new file mode 100644 (file)
index 0000000..e5622f7
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version = "1.0" encoding="utf-8"?>
+<configuration>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>
diff --git a/tests/src/Loader/classloader/TypeForwarding/UnitTest/project.json b/tests/src/Loader/classloader/TypeForwarding/UnitTest/project.json
new file mode 100644 (file)
index 0000000..025841e
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "dependencies": {
+    "Microsoft.NETCore.Platforms": "1.0.1-rc3-24117-00",
+    "System.Collections": "4.0.10",
+    "System.Collections.NonGeneric": "4.0.1-rc3-24117-00",
+    "System.Collections.Specialized": "4.0.1-rc3-24117-00",
+    "System.ComponentModel": "4.0.1-rc3-24117-00",
+    "System.Console": "4.0.0-rc3-24117-00",
+    "System.Diagnostics.Process": "4.1.0-rc3-24117-00",
+    "System.Globalization": "4.0.10",
+    "System.Globalization.Calendars": "4.0.0",
+    "System.IO": "4.0.10",
+    "System.IO.FileSystem": "4.0.1-rc3-24117-00",
+    "System.IO.FileSystem.Primitives": "4.0.0",
+    "System.Linq": "4.1.0-rc3-24117-00",
+    "System.Linq.Queryable": "4.0.1-rc3-24117-00",
+    "System.Reflection": "4.1.0-rc3-24117-00",
+    "System.Reflection.Primitives": "4.0.0",
+    "System.Runtime": "4.1.0-rc3-24117-00",
+    "System.Runtime.Extensions": "4.0.10",
+    "System.Runtime.Handles": "4.0.0",
+    "System.Runtime.InteropServices": "4.1.0-rc3-24117-00",
+    "System.Runtime.Loader": "4.0.0-rc3-24117-00",
+    "System.Text.Encoding": "4.0.10",
+    "System.Threading": "4.0.10",
+    "System.Threading.Thread": "4.0.0-rc3-24117-00",
+    "System.Xml.ReaderWriter": "4.0.11-rc3-24117-00",
+    "System.Xml.XDocument": "4.0.11-rc3-24117-00",
+    "System.Xml.XmlDocument": "4.0.1-rc3-24117-00",
+    "System.Xml.XmlSerializer": "4.0.11-rc3-24117-00"
+  },
+  "frameworks": {
+    "dnxcore50": {}
+  },
+  "runtimes": {
+    "win7-x86": {},
+    "win7-x64": {},
+    "ubuntu.14.04-x64": {},
+    "osx.10.10-x64": {},
+    "centos.7-x64": {},
+    "rhel.7-x64": {},
+    "debian.8-x64": {}
+  }
+}
index 5bf015b..122c600 100644 (file)
   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
   .ver 4:0:0:0
 }
-.assembly extern Microsoft.VisualBasic
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
-  .ver 10:0:0:0
-}
-.assembly extern System.Xml.Linq
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
-  .ver 4:0:0:0
-}
-.assembly extern System
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
-  .ver 4:0:0:0
-}
-.assembly extern System.Core
-{
-  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
-  .ver 4:0:0:0
-}
-.assembly Module1
+.assembly dev10_468712
 {
   .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                              63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
@@ -47,7 +27,7 @@
   .hash algorithm 0x00008004
   .ver 0:0:0:0
 }
-.module Module1.exe
+.module dev10_468712.exe
 // MVID: {A08CCC44-9903-487B-892B-8613075988F7}
 .imagebase 0x00400000
 .file alignment 0x00000200
@@ -93,7 +73,6 @@
 
 .class private auto ansi sealed ConsoleApplicationVB.Module1 extends [mscorlib]System.Object
 {
-  .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) 
   .method public static int32  Main() cil managed
   {
     .entrypoint
index 420a5bf..3af857c 100644 (file)
            A4 08 4B CE )                                     // ..K.
   .ver 1:2:3400:0
 }
-.assembly extern Microsoft.VisualC
-{
-  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
-  .hash = (AA 0A 15 2C F5 4D 7E 6A 96 7E DE 85 1D A6 76 80   // ...,.M~j.~....v.
-           16 9B C1 DE ) 
-  .ver 8:0:1000:0
-}
 .assembly MethodImplFinal
 {
   .permissionset reqmin
@@ -97,7 +90,6 @@
 .class public auto ansi A
        extends [mscorlib]System.Object
 {
-  .custom instance void [Microsoft.VisualC]Microsoft.VisualC.MiscellaneousBitsAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) 
   .method public newslot virtual instance void 
           f() cil managed
   {
 .class public auto ansi B
        extends A
 {
-  .custom instance void [Microsoft.VisualC]Microsoft.VisualC.MiscellaneousBitsAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) 
   .method public newslot virtual final instance void 
           g() cil managed
   {
 .class public auto ansi C
        extends B
 {
-  .custom instance void [Microsoft.VisualC]Microsoft.VisualC.MiscellaneousBitsAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) 
   .method public virtual instance void  f() cil managed
   {
     // Code size       1 (0x1)
 .class public auto ansi D
        extends A
 {
-  .custom instance void [Microsoft.VisualC]Microsoft.VisualC.MiscellaneousBitsAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) 
   .method public virtual instance void  f() cil managed
   {
     // Code size       1 (0x1)
 
 // =============================================================
 
-.custom ([mscorlib]System.Runtime.CompilerServices.AssemblyAttributesGoHereSM) instance void [mscorlib]System.Security.Permissions.SecurityPermissionAttribute::.ctor(valuetype [mscorlib]System.Security.Permissions.SecurityAction) = ( 01 00 08 00 00 00 01 00 54 02 10 53 6B 69 70 56   // ........T..SkipV
-                                                                                                                                                                                                                                          65 72 69 66 69 63 61 74 69 6F 6E 01 )             // erification.
 .data D_00008030 = bytearray (
                  01 00 00 06) 
 //*********** DISASSEMBLY COMPLETE ***********************
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6a.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6a.il
deleted file mode 100644 (file)
index c199997..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Check that prolog must be 0x0001
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       .custom instance void ['RMV-4-CA']MyCA::.ctor(int32) = ( FF FF 03 00 00 00 00 00 ) 
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6b.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6b.il
deleted file mode 100644 (file)
index 37be27d..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Check that there are as many occurences of fixed arg as the constructor requires
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       .custom instance void ['RMV-4-CA']MyCA::.ctor(int32) = ( 01 00 00 00 ) 
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d-two.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d-two.il
deleted file mode 100644 (file)
index 40b565e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Checked that there must be exactly NumNamed occurences of NamedArgs
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //Creates a CA with a blob that indicates there is one named arg but doesn't contain any
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 )
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.il
deleted file mode 100644 (file)
index 8efc691..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Checked that there must be exactly NumNamed occurences of NamedArgs
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //Creates a CA with a blob that indicates there are no NamedArgs but does contain one NamedArg
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 00 00 54 08 0F 50 75 62 49 6E 73 74 50 72   // ....T..PubInstPr
-                                                      6F 70 65 72 74 79 03 00 00 00 )                   // operty....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6d.ilproj
deleted file mode 100644 (file)
index 408c97b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-1-6d</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-1-6d.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.il
deleted file mode 100644 (file)
index 98c4909..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Check that each named argument must be accessible to the caller (properties this time)
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 54 08 0F 50 72 76 49 6E 73 74 50 72   // ....T..PrvInstPr
-                                                      6F 70 65 72 74 79 03 00 00 00 )                   // operty....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e-two.ilproj
deleted file mode 100644 (file)
index 0866d4c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-1-6e-two</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-1-6e-two.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.il b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.il
deleted file mode 100644 (file)
index 187aa51..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-//Check that each named argument must be accessible to the caller
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 53 08 0C 50 72 76 49 6E 73 74 46 69   // ....S..PrvInstFi
-                                                      65 6C 64 03 00 00 00 )                            // eld....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-1-6e.ilproj
deleted file mode 100644 (file)
index 6c85a25..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-1-6e</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-1-6e.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.il b/tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.il
deleted file mode 100644 (file)
index 461e984..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that there must be NumElem occurences of val
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //CA Blob, indicates one numelem but two are present
-  .custom instance void ['RMV-4-CA']MyCA::.ctor(int32[]) = ( 01 00 01 00 00 00 01 00 00 00 02 00 00 00 00 00 )
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-2-4-two.ilproj
deleted file mode 100644 (file)
index ffd2ddf..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-2-4-two</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-2-4-two.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-2-4.il b/tests/src/Loader/classloader/rmv/il/RMV-4-2-4.il
deleted file mode 100644 (file)
index d3d1b1c..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that there must be NumElem occurences of val
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //CA Blob, indicates one numelem but none are present
-  .custom instance void ['RMV-4-CA']MyCA::.ctor(int32[]) = ( 01 00 01 00 00 00 00 00 )
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-2-4.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-2-4.ilproj
deleted file mode 100644 (file)
index acf82e2..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-2-4</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-2-4.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.il b/tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.il
deleted file mode 100644 (file)
index 1ccf50f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that if a property is specified, the name must match a property and not a field
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 54 08 0C 50 75 62 49 6E 73 74 46 69   // ....S..PubInstFi
-                                                      65 6C 64 03 00 00 00 )                            // eld....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-3-4-two.ilproj
deleted file mode 100644 (file)
index 46e379d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-3-4-two</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-3-4-two.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-4.il b/tests/src/Loader/classloader/rmv/il/RMV-4-3-4.il
deleted file mode 100644 (file)
index 2903411..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that Name must match the name of a field
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 53 08 0C 50 50 62 49 6E 73 74 46 69   // ....S..PPbInstFi
-                                                      65 6C 64 03 00 00 00 )                            // eld....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-4.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-3-4.ilproj
deleted file mode 100644 (file)
index 468ee50..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-3-4</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-3-4.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.il b/tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.il
deleted file mode 100644 (file)
index 83e1676..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that if present, NumElem must match the number of vals for NamedArgs
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //CA Blob - NumElem on the NamedArg PubInstFieldArr==1, Actual argument count==2
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 53 1D 08 0F 50 75 62 49 6E 73 74 46   // ....S...PubInstF
-                                                      69 65 6C 64 41 72 72 01 00 00 00 01 00 00 00 02 00 00 00) 
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-3-7-two.ilproj
deleted file mode 100644 (file)
index 102d23e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-3-7-two</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-3-7-two.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-7.il b/tests/src/Loader/classloader/rmv/il/RMV-4-3-7.il
deleted file mode 100644 (file)
index b9291a1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that if present, NumElem must match the number of vals for NamedArgs
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.assembly 'RMV-4-1-6a'{
-       //CA Blob - NumElem on the NamedArg PubInstFieldArr==1, Actual argument count==0
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 53 1D 08 0F 50 75 62 49 6E 73 74 46   // ....S...PubInstF
-                                                      69 65 6C 64 41 72 72 01 00 00 00 ) 
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-7.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-3-7.ilproj
deleted file mode 100644 (file)
index bc4bff3..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-3-7</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-3-7.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-8.il b/tests/src/Loader/classloader/rmv/il/RMV-4-3-8.il
deleted file mode 100644 (file)
index 4344a51..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-// Check that if NumElem is not present for a NamedArg that there must be only one occurance of val
-
-.assembly extern 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-.assembly 'RMV-4-1-6a'{
-  .custom instance void ['RMV-4-CA']MyCA::.ctor() = ( 01 00 01 00 53 08 0C 50 75 62 49 6E 73 74 46 69   // ....S..PubInstFi
-                                                      65 6C 64 03 00 00 00 01 00 00 00)                            // eld....
-}
-
-.class CMain extends [mscorlib]System.Object{
-       .method public static int32 Main(){
-               .entrypoint
-               ldstr   "FAIL - 4.1.6a - Was allowed to declare a customattribute whose prolog isn't 0x0001"
-               call    void [System.Console]System.Console::WriteLine(string)
-               ldc.i4  100
-               ret
-       }
-}
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-3-8.ilproj b/tests/src/Loader/classloader/rmv/il/RMV-4-3-8.ilproj
deleted file mode 100644 (file)
index 8b54d1d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
-  <PropertyGroup>
-    <AssemblyName>RMV-4-3-8</AssemblyName>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <ReferenceLocalMscorlib>true</ReferenceLocalMscorlib>
-    <OutputType>Exe</OutputType>
-    <CLRTestKind>BuildAndRun</CLRTestKind>
-    <CLRTestPriority>0</CLRTestPriority>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
-      <Visible>False</Visible>
-    </CodeAnalysisDependentAssemblyPaths>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="RMV-4-3-8.il" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
-  </ItemGroup>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
-</Project>
diff --git a/tests/src/Loader/classloader/rmv/il/RMV-4-CA.il b/tests/src/Loader/classloader/rmv/il/RMV-4-CA.il
deleted file mode 100644 (file)
index 8df4004..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-.assembly extern System.Console { }
-.assembly 'RMV-4-CA'{}
-.assembly extern mscorlib {}
-
-.class public MyCA extends [mscorlib]System.Attribute{
-       .field public int32 PubInstField
-       .field private int32 PrvInstField
-       .field private int32 PubInstProperty
-       .field private int32 PrvInstProperty
-       .field public int32[] PubInstFieldArr
-
-       .method public specialname void .ctor(){
-               ldarg.0
-               call    instance void [mscorlib]System.Attribute::.ctor()
-               ret
-       }
-
-       .method public specialname void .ctor(int32 argument){
-               ldarg.0
-               call    instance void [mscorlib]System.Attribute::.ctor()
-               ret
-       }
-
-       .method public specialname void .ctor(int32[] argumentarray){
-               ldarg.0
-               call    instance void [mscorlib]System.Attribute::.ctor()
-               ret
-       }
-
-       .method public static void NotTheConstuctorStat(int32){
-               ret
-       }
-
-       .method public void NotTheConstructorInst(int32){
-               ret
-       }
-
-       .property int32 PubInstProperty(){
-               .set instance void MyCA::set_PubInstProperty(int32)
-               .get instance int32 MyCA::get_PubInstProperty()
-       }
-
-       .property int32 PrvInstProperty(){
-               .set instance void MyCA::set_PrvInstProperty(int32)
-               .get instance int32 MyCA::get_PrvInstProperty()
-       }
-
-       .method public hidebysig specialname instance int32 get_PubInstProperty(){
-               ldarg.0
-               ldfld   int32 MyCA::PubInstProperty
-               ret
-       }
-       .method public hidebysig specialname instance void set_PubInstProperty(int32){
-               ldarg.0
-               ldarg.1
-               stfld   int32 MyCA::PubInstProperty
-               ret
-       }
-       .method private hidebysig specialname instance int32 get_PrvInstProperty(){
-               ldarg.0
-               ldfld   int32 MyCA::PrvInstProperty
-               ret
-       }
-       .method private hidebysig specialname instance void set_PrvInstProperty(int32){
-               ldarg.0
-               ldarg.1
-               stfld   int32 MyCA::PrvInstProperty
-               ret
-       }
-       
-}
index 069235c..8bd61b8 100644 (file)
@@ -5,7 +5,9 @@
 
 using System;
 using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using System.Text;
+using System.Threading;
 
 class Program
 {
@@ -21,6 +23,17 @@ class Program
 
     static void RunAllTests()
     {
+        RunTest1();
+        RunTest2();
+        RunTest3();
+        RunTest4();
+        RunTest5();
+        RunTest6();
+        RunTest7();
+    }
+
+    static void RunTest1()
+    {
         DateTime dt = new DateTime(1776, 7, 4);
         string dtString = dt.ToString();
         Assert.AreEqual(new GenClass1c<DateTime>(dt).ToStringEx(7), dtString + " 7");
@@ -52,31 +65,192 @@ class Program
         var gen1b = new GenClass1b<string>();
         Assert.AreEqual(gen1b.IsGenClass1a(gen1aString).ToString(), "True");
         Assert.AreEqual(gen1b.AsGenClass1a(gen1aString)?.ToString() ?? "null", gen1aString.ToString());
-#if false // not yet supported
         Assert.AreEqual(GenClass1a<string>.CallVirtual(gen1b), "GenClass1b`1[System.String].VirtualMethod");
         Assert.AreEqual(GenClass1a<string>.CallInterface(gen1b), "GenClass1b`1[System.String].InterfaceMethod1");
         Assert.AreEqual(GenClass1a<string>.CallInterface(gen1b, "Test").ToString(), "GenClass1b`1[System.String]");
-#endif
 
         NormalClass n = new NormalClass();
         Assert.AreEqual(CallGenVirtMethod<int>(n).ToString(), "GenClass1a`1[System.Int32]");
         Assert.AreEqual(CallGenVirtMethod<int>(n, 42).ToString(), "System.Int32[]");
-#if false // not yet supported
         Assert.AreEqual(CallGenVirtMethod<string>(n).ToString(), "GenClass1a`1[System.String]");
         Assert.AreEqual(CallGenVirtMethod<string>(n, "forty-two").ToString(), "System.String[]");
-#endif
     }
 
+    static void RunTest2()
+    {
+        var mi = new GenBase<MyClass0, int>();
+        var ol = new GenBase<object, long>();
+
+        // LDTOKEN OF TYPE PARAMETERS TEST
+        Assert.AreEqual(mi.GetT(), "MyClass0");
+        Assert.AreEqual(mi.GetU(), "System.Int32");
+        Assert.AreEqual(ol.GetT(), "System.Object");
+        Assert.AreEqual(ol.GetU(), "System.Int64");
+        Assert.AreEqual(mi.GetT(), "MyClass0");
+        Assert.AreEqual(mi.GetU(), "System.Int32");
+
+        Assert.AreEqual(mi.GetTArray(), "MyClass0[]");
+        Assert.AreEqual(ol.GetTArray(), "System.Object[]");
+        Assert.AreEqual(mi.GetTArray(), "MyClass0[]");
+        Assert.AreEqual(mi.GetTBasedInst(), "MyGenClass2`1[MyGenClass1`1[MyClass0]]");
+        Assert.AreEqual(ol.GetTBasedInst(), "MyGenClass2`1[MyGenClass1`1[System.Object]]");
+        Assert.AreEqual(mi.GetTBasedInst(), "MyGenClass2`1[MyGenClass1`1[MyClass0]]");
+    }
+
+    static void RunTest3()
+    {
+        var mi = new GenBase<MyClass0, int>();
+        var ol = new GenBase<object, long>();
+
+        // GENERIC INTERFACE CALL AND CASTING TEST
+        Assert.AreEqual(mi.IFaceCallTest(mi), "IFaceCallTest = IFooFunc - GenBase`2[MyClass0,System.Int32]");
+        Assert.AreEqual(ol.IFaceCallTest(ol), "IFaceCallTest = IFooFunc - GenBase`2[System.Object,System.Int64]");
+        Assert.AreEqual(mi.IFaceCallTest(mi), "IFaceCallTest = IFooFunc - GenBase`2[MyClass0,System.Int32]");
+
+        // LDTOKEN TEST
+        Assert.AreEqual(mi.LdTokenTest(), "LdTokenTest - System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]");
+        Assert.AreEqual(ol.LdTokenTest(), "LdTokenTest - System.Collections.Generic.Dictionary`2[System.Object,System.Int64]");
+        Assert.AreEqual(mi.LdTokenTest(), "LdTokenTest - System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]");
+
+        // DICTIONARY ACCESS FROM STATIC METHOD
+        Assert.AreEqual(GenBase<MyClass0, int>.StaticNonGenMethod(), "StaticNonGenMethod - System.Collections.Generic.List`1[MyClass0]");
+        Assert.AreEqual(GenBase<object, long>.StaticNonGenMethod(), "StaticNonGenMethod - System.Collections.Generic.List`1[System.Object]");
+        Assert.AreEqual(GenBase<MyClass0, int>.StaticNonGenMethod(), "StaticNonGenMethod - System.Collections.Generic.List`1[MyClass0]");
+        Assert.AreEqual(GenBase<MyClass0, int>.StaticGenMethod<Type>(), "StaticGenMethod - System.Collections.Generic.Dictionary`2[System.Type,MyClass0]");
+        Assert.AreEqual(GenBase<object, long>.StaticGenMethod<Type>(), "StaticGenMethod - System.Collections.Generic.Dictionary`2[System.Type,System.Object]");
+        Assert.AreEqual(GenBase<MyClass0, int>.StaticGenMethod<Type>(), "StaticGenMethod - System.Collections.Generic.Dictionary`2[System.Type,MyClass0]");
+
+        // NEW TEST
+        Assert.AreEqual(mi.NewTest(), "NewTest - MyClass0 - MyGenClass1`1[MyClass0] - MyClass0[] - MyClass0[,] - MyGenClass3`1[MyClass0][] - MyGenClass3`1[MyClass0][,]");
+        Assert.AreEqual(ol.NewTest(), "NewTest - System.Object - MyGenClass1`1[System.Object] - System.Object[] - System.Object[,] - MyGenClass3`1[System.Object][] - MyGenClass3`1[System.Object][,]");
+        Assert.AreEqual(mi.NewTest(), "NewTest - MyClass0 - MyGenClass1`1[MyClass0] - MyClass0[] - MyClass0[,] - MyGenClass3`1[MyClass0][] - MyGenClass3`1[MyClass0][,]");
+    }
+
+    static void RunTest4()
+    {
+        // FIELDS TEST
+        var fobj1 = new GenBase<MyIdClass0, int>();
+        var fobj2 = new GenBase<MyIdClass1, int>();
+        GenBase<MyIdClass0, int>.SetFieldsTest(fobj1, new MyIdClass0("1"), new MyIdClass0("2"), new MyIdClass0("3"), 1, 2, 3);
+        GenBase<MyIdClass1, int>.SetFieldsTest(fobj2, new MyIdClass1("1"), new MyIdClass1("2"), new MyIdClass1("3"), 1, 2, 3);
+
+        GenBase<MyIdClass0, int>.GetFieldsTest(fobj1, "MyIdClass0=1", "MyIdClass0=2", "MyIdClass0=3", 1, 2, 3);
+        GenBase<MyIdClass1, int>.GetFieldsTest(fobj2, "MyIdClass1=1", "MyIdClass1=2", "MyIdClass1=3", 1, 2, 3);
+
+        Thread t = new Thread(new ThreadStart(() =>
+        {
+            GenBase<MyIdClass0, int>.SetFieldsTest(fobj1, new MyIdClass0("11"), new MyIdClass0("22"), new MyIdClass0("33"), 11, 22, 33);
+            GenBase<MyIdClass1, int>.SetFieldsTest(fobj2, new MyIdClass1("11"), new MyIdClass1("22"), new MyIdClass1("33"), 11, 22, 33);
+
+            GenBase<MyIdClass0, int>.GetFieldsTest(fobj1, "MyIdClass0=11", "MyIdClass0=22", "MyIdClass0=33", 11, 22, 33);
+            GenBase<MyIdClass1, int>.GetFieldsTest(fobj2, "MyIdClass1=11", "MyIdClass1=22", "MyIdClass1=33", 11, 22, 33);
+        }));
+        t.Start();
+        t.Join();
+
+        GenBase<MyIdClass0, int>.GetFieldsTest(fobj1, "MyIdClass0=11", "MyIdClass0=22", "MyIdClass0=3", 11, 22, 3);
+        GenBase<MyIdClass1, int>.GetFieldsTest(fobj2, "MyIdClass1=11", "MyIdClass1=22", "MyIdClass1=3", 11, 22, 3);
+    }
+
+    static void RunTest5()
+    {
+        // DELEGATES TEST
+        var fobj1 = new GenBase<MyIdClass0, int>();
+        var fobj2 = new GenBase<MyIdClass1, int>();
+
+        Func<MyIdClass0, int, string>[] del1 = fobj1.GetDelegateTest();
+        Func<MyIdClass1, int, string>[] del2 = fobj2.GetDelegateTest();
+        Assert.AreEqual(del1[0](new MyIdClass0("1"), 1), "InstanceDelMethod(GenBase`2[MyIdClass0,System.Int32] - MyIdClass0=1 - 1)");
+        Assert.AreEqual(del1[1](new MyIdClass0("2"), 2), "StaticDelMethod(MyIdClass0=2 - 2)");
+        Assert.AreEqual(del2[0](new MyIdClass1("3"), 3), "InstanceDelMethod(GenBase`2[MyIdClass1,System.Int32] - MyIdClass1=3 - 3)");
+        Assert.AreEqual(del2[1](new MyIdClass1("4"), 4), "StaticDelMethod(MyIdClass1=4 - 4)");
+        Assert.AreEqual(del1[0](new MyIdClass0("5"), 5), "InstanceDelMethod(GenBase`2[MyIdClass0,System.Int32] - MyIdClass0=5 - 5)");
+        Assert.AreEqual(del1[1](new MyIdClass0("6"), 6), "StaticDelMethod(MyIdClass0=6 - 6)");
+    }
+
+    static void RunTest6()
+    {
+        // BOXING AND NULLABLE TEST
+        var mi = new GenBase<MyClass0, int>();
+        var ol = new GenBase<object, long>();
+
+        Assert.AreEqual(mi.BoxingAndNullableTest(
+            new MyGenClass1<KeyValuePair<MyClass0, int>>(),
+            new MyGenStruct1<Dictionary<MyClass0, int>>(),
+            new MyGenStruct1<Dictionary<MyClass0, int>>()),
+            "BoxingAndNullableTest - GenBase`2[MyClass0,System.Int32]::(MyGenClass1`1[System.Collections.Generic.KeyValuePair`2[MyClass0,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]])");
+        Assert.AreEqual(ol.BoxingAndNullableTest(
+            new MyGenClass1<KeyValuePair<object, long>>(),
+            new MyGenStruct1<Dictionary<object, long>>(),
+            new MyGenStruct1<Dictionary<object, long>>()),
+            "BoxingAndNullableTest - GenBase`2[System.Object,System.Int64]::(MyGenClass1`1[System.Collections.Generic.KeyValuePair`2[System.Object,System.Int64]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[System.Object,System.Int64]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[System.Object,System.Int64]])");
+    }
+
+    static void RunTest7()
+    {
+        // GENERIC METHOD TEST
+
+        Base b = new Base();
+        var obj1 = new GenBase<MyClass1, int>();
+        var obj2 = new GenBase<MyClass2, long>();
+
+        // LDTOKEN OF TYPE PARAMETERS TEST
+        Assert.AreEqual(b.GetT<string>().ToString(), "System.String");
+        Assert.AreEqual(b.GetT<object>().ToString(), "System.Object");
+        Assert.AreEqual(b.GetTArray<string>().ToString(), "System.String[]");
+        Assert.AreEqual(b.GetTArray<object>().ToString(), "System.Object[]");
+        Assert.AreEqual(b.GetTBasedInst<string>().ToString(), "MyGenClass2`1[MyGenClass1`1[System.String]]");
+        Assert.AreEqual(b.GetTBasedInst<object>().ToString(), "MyGenClass2`1[MyGenClass1`1[System.Object]]");
+
+        Assert.AreEqual(b.GetT<MyClass1, int>(), "MyClass1");
+        Assert.AreEqual(b.GetU<MyClass1, int>(), "System.Int32");
+        Assert.AreEqual(b.GetT<MyClass2, long>(), "MyClass2");
+        Assert.AreEqual(b.GetU<MyClass2, long>(), "System.Int64");
+
+        // GENERIC INTERFACE CALL AND CASTING TEST
+        Assert.AreEqual(b.IFaceCallTest<MyClass1, int>(obj1), "IFaceCallTest = IFooFunc - GenBase`2[MyClass1,System.Int32]");
+        Assert.AreEqual(b.IFaceCallTest<MyClass2, long>(obj2), "IFaceCallTest = IFooFunc - GenBase`2[MyClass2,System.Int64]");
+
+        // LDTOKEN TEST
+        Assert.AreEqual(b.LdTokenTest<MyClass1, int>(), "System.Collections.Generic.Dictionary`2[MyClass1,System.Int32]");
+        Assert.AreEqual(b.LdTokenTest<MyClass2, long>(), "System.Collections.Generic.Dictionary`2[MyClass2,System.Int64]");
+
+        // DICTIONARY ACCESS FROM STATIC METHOD
+        Assert.AreEqual(Base.StaticGenMethod<float, MyClass1>(), "StaticGenMethod - System.Collections.Generic.Dictionary`2[MyClass1,System.Single]");
+        Assert.AreEqual(Base.StaticGenMethod<float, MyClass2>(), "StaticGenMethod - System.Collections.Generic.Dictionary`2[MyClass2,System.Single]");
+
+        // NEW TEST
+        Assert.AreEqual(b.NewTest<MyClass1, MyClass2>(),
+            "NewTest - MyClass1 - MyGenClass1`1[MyClass1] - MyClass1[] - MyClass1[,] - MyGenClass2`1[MyClass1][] - MyGenClass2`1[MyClass1][,]");
+        Assert.AreEqual(b.NewTest<MyClass2, MyClass1>(),
+            "NewTest - MyClass2 - MyGenClass1`1[MyClass2] - MyClass2[] - MyClass2[,] - MyGenClass2`1[MyClass2][] - MyGenClass2`1[MyClass2][,]");
+
+        // BOXING AND NULLABLE TEST
+        Assert.AreEqual(b.BoxingAndNullableTest<MyClass0, int>(
+            new MyGenClass1<KeyValuePair<MyClass0, int>>(),
+            new MyGenStruct1<Dictionary<MyClass0, int>>(),
+            new MyGenStruct1<Dictionary<MyClass0, int>>()),
+            "BoxingAndNullableTest - Base::(MyGenClass1`1[System.Collections.Generic.KeyValuePair`2[MyClass0,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[MyClass0,System.Int32]])");
+        Assert.AreEqual(b.BoxingAndNullableTest<object, int>(
+            new MyGenClass1<KeyValuePair<object, int>>(),
+            new MyGenStruct1<Dictionary<object, int>>(),
+            new MyGenStruct1<Dictionary<object, int>>()),
+            "BoxingAndNullableTest - Base::(MyGenClass1`1[System.Collections.Generic.KeyValuePair`2[System.Object,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[System.Object,System.Int32]] - MyGenStruct1`1[System.Collections.Generic.Dictionary`2[System.Object,System.Int32]])");
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     static string GetString<X, Y>(X x, Y y)
     {
         return string.Join(" ", x, y);
     }
 
+    [MethodImpl(MethodImplOptions.NoInlining)]
     static GenClass1a<T> CallGenVirtMethod<T>(NormalClass n)
     {
         return n.GetGenClass1a<T>();
     }
 
+    [MethodImpl(MethodImplOptions.NoInlining)]
     static IEnumerable<T> CallGenVirtMethod<T>(NormalClass n, object o)
     {
         return n.GetEnumerable<T>(o);
@@ -91,24 +265,33 @@ interface IGenInterface<T>
 
 class GenClass1a<T>
 {
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public string CreateGenClass1b()
     {
         var x = new GenClass1b<T>();
         return x.ToString();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public string CreateGenClass1bArray()
     {
         var x = new GenClass1b<T>[3];
         return x.ToString();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public static string CallVirtual(GenClass1b<T> x)
     {
         return x.VirtualMethod();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public static string CallInterface(IGenInterface<T> x)
     {
         return x.InterfaceMethod1();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public static IGenInterface<U> CallInterface<U, V>(IGenInterface<U> x, V v)
     {
         return x.InterfaceMethod2(v);
@@ -117,22 +300,31 @@ class GenClass1a<T>
 
 class GenClass1b<T> : IGenInterface<T>
 {
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public virtual string VirtualMethod()
     {
         return ToString() + ".VirtualMethod";
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public virtual string InterfaceMethod1()
     {
         return ToString() + ".InterfaceMethod1";
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public virtual IGenInterface<T> InterfaceMethod2<U>(U u)
     {
         return this;
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public bool IsGenClass1a(object o)
     {
         return o is GenClass1a<T>;
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public GenClass1a<T> AsGenClass1a(object o)
     {
         return o as GenClass1a<T>;
@@ -142,22 +334,32 @@ class GenClass1b<T> : IGenInterface<T>
 class GenClass1c<T> where T : new()
 {
     public T t;
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public GenClass1c()
     {
         t = new T();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public GenClass1c(T _t)
     {
         t = _t;
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public void SetT(object x)
     {
         t = (T)x;
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public override string ToString()
     {
         return t.ToString();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public string ToStringEx<X>(X x)
     {
         return string.Join(" ", t, x);
@@ -166,29 +368,38 @@ class GenClass1c<T> where T : new()
 
 class GenClass2<T, U>
 {
+    T t;
+    U u;
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public GenClass2(T t, U u)
     {
         this.t = t;
         this.u = u;
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public override string ToString()
     {
         return t.ToString() + " " + u.ToString();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public string ToStringEx<X, Y>(X x, Y y)
     {
         return string.Join(" ", t, u, x, y);
     }
-    T t;
-    U u;
 }
 
 class NormalClass
 {
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public virtual GenClass1a<T> GetGenClass1a<T>()
     {
         return new GenClass1a<T>();
     }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
     public virtual IEnumerable<T> GetEnumerable<T>(object o)
     {
         T[] array = new T[1];
@@ -197,6 +408,219 @@ class NormalClass
     }
 }
 
+public interface IFoo<T> { string IFooFunc(); }
+public class MyClass0 { }
+public class MyClass1 { }
+public class MyClass2 { }
+public class MyGenClass1<T> { public override string ToString() { return this.GetType().ToString(); } }
+public class MyGenClass2<T> { public override string ToString() { return this.GetType().ToString(); } }
+public class MyGenClass3<T> { public override string ToString() { return this.GetType().ToString(); } }
+public struct MyGenStruct1<T> { public override string ToString() { return this.GetType().ToString(); } }
+public class MyIdClass0 { string _id; public MyIdClass0() { } public MyIdClass0(string id) { _id = id; } public override string ToString() { return "MyIdClass0=" + _id; } }
+public class MyIdClass1 { string _id; public MyIdClass1() { } public MyIdClass1(string id) { _id = id; } public override string ToString() { return "MyIdClass1=" + _id; } }
+
+public class GenBase<T, U> : IFoo<T> where T : new()
+{
+    public T m_fieldT;
+    public U m_fieldU;
+    public static T s_fieldT;
+    public static U s_fieldU;
+    [ThreadStatic]
+    public static T st_fieldT;
+    [ThreadStatic]
+    public static U st_fieldU;
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static void SetFieldsTest(GenBase<T, U> obj, T t1, T t2, T t3, U u1, U u2, U u3)
+    {
+        obj.m_fieldT = t1;
+        GenBase<T, U>.s_fieldT = t2;
+        GenBase<T, U>.st_fieldT = t3;
+
+        obj.m_fieldU = u1;
+        GenBase<T, U>.s_fieldU = u2;
+        GenBase<T, U>.st_fieldU = u3;
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static void GetFieldsTest(GenBase<T, U> obj, string s1, string s2, string s3, U u1, U u2, U u3)
+    {
+        Assert.AreEqual(obj.m_fieldT.ToString(), s1);
+        Assert.AreEqual(GenBase<T, U>.s_fieldT.ToString(), s2);
+        Assert.AreEqual(GenBase<T, U>.st_fieldT.ToString(), s3);
+
+        Assert.AreEqual(obj.m_fieldU, u1);
+        Assert.AreEqual(GenBase<T, U>.s_fieldU, u2);
+        Assert.AreEqual(GenBase<T, U>.st_fieldU, u3);
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    // BUG BUG BUG: bad codegen when method is private
+    public string InstanceDelMethod(T t, U u)
+    {
+        return "InstanceDelMethod(" + this + " - " + t + " - " + u + ")";
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    // BUG BUG BUG: bad codegen when method is private
+    public static string StaticDelMethod(T t, U u)
+    {
+        return "StaticDelMethod(" + t + " - " + u + ")";
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public Func<T, U, string>[] GetDelegateTest()
+    {
+        Func<T, U, string> del1 = this.InstanceDelMethod;
+        Func<T, U, string> del2 = StaticDelMethod;
+        return new Func<T, U, string>[] { del1, del2 };
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string IFooFunc()
+    {
+        return "IFooFunc - " + this.ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string IFaceCallTest(object ifoo)
+    {
+        IFoo<T> i = (IFoo<T>)ifoo;
+        return "IFaceCallTest = " + i.IFooFunc();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetT()
+    {
+        return typeof(T).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetU()
+    {
+        return typeof(U).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetTArray()
+    {
+        return typeof(T[]).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetTBasedInst()
+    {
+        return typeof(MyGenClass2<MyGenClass1<T>>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string LdTokenTest()
+    {
+        return "LdTokenTest - " + typeof(Dictionary<T, U>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static string StaticNonGenMethod()
+    {
+        return "StaticNonGenMethod - " + typeof(List<T>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static string StaticGenMethod<V>()
+    {
+        return "StaticGenMethod - " + typeof(Dictionary<V, T>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string NewTest()
+    {
+        var a = new T();
+        var b = new MyGenClass1<T>();
+        var c = new T[10];
+        var d = new T[30,30];
+        var e = new MyGenClass3<T>[5];
+        var f = new MyGenClass3<T>[5,13];
+        return "NewTest - " + a + " - " + b + " - " + c + " - " + d + " - " + e + " - " + f;
+    }
+    
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string BoxingAndNullableTest(MyGenClass1<KeyValuePair<T,U>> t, MyGenStruct1<Dictionary<T,U>> u, MyGenStruct1<Dictionary<T,U>>? u2)
+    {
+        return "BoxingAndNullableTest - " + this + "::(" + t + " - " + u + " - " + u2 + ")";
+    }
+}
+
+public class Base
+{
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetT<T>()
+    {
+        return typeof(T).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetT<T, U>()
+    {
+        return typeof(T).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetU<T, U>()
+    {
+        return typeof(U).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetTArray<T>()
+    {
+        return typeof(T[]).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string GetTBasedInst<T>()
+    {
+        return typeof(MyGenClass2<MyGenClass1<T>>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string IFaceCallTest<T, U>(object ifoo)
+    {
+        IFoo<T> i = (IFoo<T>)ifoo;
+        return "IFaceCallTest = " + i.IFooFunc();
+    }
+
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string LdTokenTest<T, U>()
+    {
+        return typeof(Dictionary<T, U>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static string StaticGenMethod<T, U>()
+    {
+        return "StaticGenMethod - " + typeof(Dictionary<U, T>).ToString();
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string NewTest<T, U>() where T : new()
+    {
+        var a = new T();
+        var b = new MyGenClass1<T>();
+        var c = new T[10];
+        var d = new T[30, 30];
+        var e = new MyGenClass2<T>[5];
+        var f = new MyGenClass2<T>[5, 13];
+        return "NewTest - " + a + " - " + b + " - " + c + " - " + d + " - " + e + " - " + f;
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public string BoxingAndNullableTest<T, U>(MyGenClass1<KeyValuePair<T, U>> t, MyGenStruct1<Dictionary<T, U>> u, MyGenStruct1<Dictionary<T, U>>? u2)
+    {
+        return "BoxingAndNullableTest - " + this + "::(" + t + " - " + u + " - " + u2 + ")";
+    }
+}
+
 public static class Assert
 {
     public static bool HasAssertFired;
index 18a21f9..6436a59 100644 (file)
@@ -15,7 +15,6 @@
     <OutputType>Exe</OutputType>
     <CLRTestKind>BuildAndRun</CLRTestKind>
     <CLRTestPriority>0</CLRTestPriority>
-    <ZapRequire>1</ZapRequire>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/tests/src/readytorun/genericsload/app.config b/tests/src/readytorun/genericsload/app.config
new file mode 100644 (file)
index 0000000..7f13fbc
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>
\ No newline at end of file
diff --git a/tests/src/readytorun/genericsload/callgenericctor.cs b/tests/src/readytorun/genericsload/callgenericctor.cs
new file mode 100644 (file)
index 0000000..05e16af
--- /dev/null
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+
+using System;
+using System.Runtime.CompilerServices;
+
+class Foo<T>
+{
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    internal void M()
+    {
+        new GenClass<T>();
+    }
+}
+
+class Program
+{
+    static int Main()
+    {
+        try
+        {
+            new Foo<string>().M();
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine("FAIL");
+            return 101;
+        }
+
+        Console.WriteLine("PASS");
+        return 100;
+    }
+}
diff --git a/tests/src/readytorun/genericsload/callgenericctor.csproj b/tests/src/readytorun/genericsload/callgenericctor.csproj
new file mode 100644 (file)
index 0000000..f3b7648
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7DECC55A-B584-4456-83BA-6C42A5B3B3CB}</ProjectGuid>
+    <OutputType>exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <CLRTestKind>BuildAndRun</CLRTestKind>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <DefineConstants>$(DefineConstants);STATIC;CORECLR</DefineConstants>
+    <ZapRequire>1</ZapRequire>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="genericslib.ilproj">
+       <Project>{F74F55A1-DFCF-4C7C-B462-E96E1D0BB667}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="callgenericctor.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="project.json" />
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <PropertyGroup>
+    <CLRTestBatchPreCommands><![CDATA[
+$(CLRTestBatchPreCommands)
+%Core_Root%\crossgen /readytorun /platform_assemblies_paths %Core_Root%%3B%25CD% /out genericslib.ni.dll genericslib.dll
+%Core_Root%\crossgen /readytorun /platform_assemblies_paths %Core_Root%%3B%25CD% /out callgenericctor.ni.exe callgenericctor.exe
+]]></CLRTestBatchPreCommands>
+  <BashCLRTestPreCommands><![CDATA[
+$(BashCLRTestPreCommands)
+$CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out genericslib.ni.dll genericslib.dll
+$CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out callgenericctor.ni.exe callgenericctor.exe
+]]></BashCLRTestPreCommands>
+  </PropertyGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
diff --git a/tests/src/readytorun/genericsload/genericslib.il b/tests/src/readytorun/genericsload/genericslib.il
new file mode 100644 (file)
index 0000000..fdc2f40
--- /dev/null
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+
+.assembly genericslib { }
+.module genericslib.dll
+
+.assembly extern mscorlib { }
+
+// A module constructor that sets GenClass`1<string>::StaticField to true.
+.method assembly specialname rtspecialname static 
+          void  .cctor() cil managed
+{
+    ldc.i4.1
+    stsfld     bool class GenClass`1<string>::StaticField
+    ret
+}
+
+.class public auto ansi beforefieldinit GenClass`1<T>
+       extends [mscorlib]System.Object
+{
+    .field static public bool StaticField
+
+    /*
+    public GenClass()
+    {
+        if (!StaticField)
+            throw new System.Exception();
+    }
+    */
+    .method public hidebysig specialname rtspecialname 
+            instance void  .ctor() cil managed
+    {
+        ldarg.0
+        call       instance void [mscorlib]System.Object::.ctor()
+
+        ldsfld     bool class GenClass`1<!T>::StaticField
+        brtrue.s   OK
+
+        newobj     instance void [mscorlib]System.Exception::.ctor()
+        throw
+
+    OK: ret
+    }
+
+    /*
+    public static bool StaticMethod()
+    {
+        return StaticField;
+    }
+    */
+    .method public hidebysig static bool StaticMethod() cil managed
+    {
+        ldsfld     bool class GenClass`1<!T>::StaticField
+        ret
+    }
+}
@@ -7,13 +7,14 @@
     <AssemblyName>$(MSBuildProjectName)</AssemblyName>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
-    <OutputType>Exe</OutputType>
+    <OutputType>library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <CLRTestKind>SharedLibrary</CLRTestKind>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     </CodeAnalysisDependentAssemblyPaths>
   </ItemGroup>
   <PropertyGroup>
-    
+
   </PropertyGroup>
   <ItemGroup>
-    <Compile Include="b05623.il" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="app.config" />
+    <Compile Include="genericslib.il" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -40,4 +38,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup> 
-</Project>
\ No newline at end of file
+</Project>
diff --git a/tests/src/readytorun/genericsload/project.json b/tests/src/readytorun/genericsload/project.json
new file mode 100644 (file)
index 0000000..da49daf
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "dependencies": {
+    "Microsoft.NETCore.Platforms": "1.0.1-rc3-24117-00",
+    "System.Collections": "4.0.10",
+    "System.Collections.NonGeneric": "4.0.1-rc3-24117-00",
+    "System.Collections.Specialized": "4.0.1-rc3-24117-00",
+    "System.ComponentModel": "4.0.1-rc3-24117-00",
+    "System.Console": "4.0.0-rc3-24117-00",
+    "System.Diagnostics.Process": "4.1.0-rc3-24117-00",
+    "System.Globalization": "4.0.10",
+    "System.Globalization.Calendars": "4.0.0",
+    "System.IO": "4.0.10",
+    "System.IO.FileSystem": "4.0.1-rc3-24117-00",
+    "System.IO.FileSystem.Primitives": "4.0.0",
+    "System.Linq": "4.1.0-rc3-24117-00",
+    "System.Linq.Queryable": "4.0.1-rc3-24117-00",
+    "System.Reflection": "4.1.0-rc3-24117-00",
+    "System.Reflection.Primitives": "4.0.0",
+    "System.Runtime": "4.1.0-rc3-24117-00",
+    "System.Runtime.Extensions": "4.0.10",
+    "System.Runtime.Handles": "4.0.0",
+    "System.Runtime.InteropServices": "4.1.0-rc3-24117-00",
+    "System.Runtime.InteropServices.RuntimeInformation": "4.0.0-rc3-24117-00",
+    "System.Runtime.Loader": "4.0.0-rc3-24117-00",
+    "System.Text.Encoding": "4.0.10",
+    "System.Threading": "4.0.10",
+    "System.Xml.ReaderWriter": "4.0.11-rc3-24117-00",
+    "System.Xml.XDocument": "4.0.11-rc3-24117-00",
+    "System.Xml.XmlDocument": "4.0.1-rc3-24117-00",
+    "System.Xml.XmlSerializer": "4.0.11-rc3-24117-00"
+  },
+  "frameworks": {
+    "dnxcore50": {}
+  },
+  "runtimes": {
+    "win7-x86": {},
+    "win7-x64": {},
+    "ubuntu.14.04-x64": {},
+    "osx.10.10-x64": {},
+    "centos.7-x64": {},
+    "rhel.7-x64": {},
+    "debian.8-x64": {}
+  }
+}
diff --git a/tests/src/readytorun/genericsload/usegenericfield.cs b/tests/src/readytorun/genericsload/usegenericfield.cs
new file mode 100644 (file)
index 0000000..770334c
--- /dev/null
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+
+using System;
+using System.Runtime.CompilerServices;
+
+class Foo<T>
+{
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    internal bool M()
+    {
+        return GenClass<T>.StaticField;
+    }
+}
+
+class Program
+{
+    static int Main()
+    {
+        try
+        {
+            if (!new Foo<string>().M())
+            {
+                Console.WriteLine("FAIL - bad result");
+                return 102;
+            }
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine("FAIL - exception caught");
+            return 101;
+        }
+
+        Console.WriteLine("PASS");
+        return 100;
+    }
+}
diff --git a/tests/src/readytorun/genericsload/usegenericfield.csproj b/tests/src/readytorun/genericsload/usegenericfield.csproj
new file mode 100644 (file)
index 0000000..ae24a27
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7DECC55A-B584-4456-83BA-6C42A5B3B3CB}</ProjectGuid>
+    <OutputType>exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <CLRTestKind>BuildAndRun</CLRTestKind>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <DefineConstants>$(DefineConstants);STATIC;CORECLR</DefineConstants>
+    <ZapRequire>1</ZapRequire>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="genericslib.ilproj">
+       <Project>{F74F55A1-DFCF-4C7C-B462-E96E1D0BB667}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="usegenericfield.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="project.json" />
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <PropertyGroup>
+    <CLRTestBatchPreCommands><![CDATA[
+$(CLRTestBatchPreCommands)
+%Core_Root%\crossgen /readytorun /platform_assemblies_paths %Core_Root%%3B%25CD% /out genericslib.ni.dll genericslib.dll
+%Core_Root%\crossgen /readytorun /platform_assemblies_paths %Core_Root%%3B%25CD% /out usegenericfield.ni.exe usegenericfield.exe
+]]></CLRTestBatchPreCommands>
+  <BashCLRTestPreCommands><![CDATA[
+$(BashCLRTestPreCommands)
+$CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out genericslib.ni.dll genericslib.dll
+$CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out usegenericfield.ni.exe usegenericfield.exe
+]]></BashCLRTestPreCommands>
+  </PropertyGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+</Project>
index 70157bc..b01702f 100644 (file)
@@ -203,6 +203,30 @@ class Program
         }
     }
 
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    static void TestGenericNonVirtualMethod()
+    {
+        var c = new MyChildGeneric<string>();
+        Assert.AreEqual(CallGeneric(c), "MyGeneric.NonVirtualMethod");
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    static string CallGeneric<T>(MyGeneric<T, T> g)
+    {
+        return g.NonVirtualMethod();
+    }
+
+    static void TestGenericOverStruct()
+    {
+        var o1 = new MyGeneric<String, MyGrowingStruct>();
+        Assert.AreEqual(o1.GenericVirtualMethod < MyChangingStruct, IEnumerable<Program>>(),
+            "System.StringMyGrowingStructMyChangingStructSystem.Collections.Generic.IEnumerable`1[Program]");
+
+        var o2 = new MyChildGeneric<MyChangingStruct>();
+        Assert.AreEqual(o2.MovedToBaseClass<MyGrowingStruct>(), typeof(List<MyGrowingStruct>).ToString());
+        Assert.AreEqual(o2.ChangedToVirtual<MyGrowingStruct>(), typeof(List<MyGrowingStruct>).ToString());
+    }
+
     static void TestInstanceFields()
     {
         var t = new InstanceFieldTest2();
@@ -375,6 +399,9 @@ class Program
 
         TestGenericVirtualMethod();
         TestMovedGenericVirtualMethod();
+        TestGenericNonVirtualMethod();
+
+        TestGenericOverStruct();
 
         TestInstanceFields();
 
index 7aa6029..8da9bc2 100644 (file)
@@ -51,7 +51,7 @@ COPY /Y ..\testv1\test\test.dll test.dll
 ]]></CLRTestBatchPreCommands>
   <BashCLRTestPreCommands><![CDATA[
 $(BashCLRTestPreCommands)
-rm test.dll
+rm -f test.dll
 cp ../testv1/test/test.dll test.dll
 $CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out test.ni.dll test.dll
 $CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out mainv1.ni.exe mainv1.exe
index 809ee64..19f16b3 100644 (file)
@@ -51,10 +51,10 @@ COPY /Y ..\testv2\test\test.dll test.dll
 ]]></CLRTestBatchPreCommands>
   <BashCLRTestPreCommands><![CDATA[
 $(BashCLRTestPreCommands)
-rm test.dll
+rm -f test.dll
 cp ../testv1/test/test.dll test.dll
 $CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out mainv2.ni.exe mainv2.exe
-rm test.dll
+rm -f test.dll
 cp ../testv2/test/test.dll test.dll
 $CORE_ROOT/crossgen -readytorun -platform_assemblies_paths $CORE_ROOT:`pwd` -out test.ni.dll test.dll
 
index cee30e9..d559e05 100644 (file)
@@ -25,6 +25,7 @@
     "System.Runtime.Loader": "4.0.0-rc3-24117-00",
     "System.Text.Encoding": "4.0.10",
     "System.Threading": "4.0.10",
+    "System.Threading.Thread": "4.0.0-rc3-24117-00",
     "System.Xml.ReaderWriter": "4.0.11-rc3-24117-00",
     "System.Xml.XDocument": "4.0.11-rc3-24117-00",
     "System.Xml.XmlDocument": "4.0.1-rc3-24117-00",
index 7e14398..39afbd2 100644 (file)
@@ -255,6 +255,11 @@ public class MyGeneric<T,U>
         return typeof(List<W>).ToString();
     }
 #endif
+
+    public string NonVirtualMethod()
+    {
+        return "MyGeneric.NonVirtualMethod";
+    }
 }
 
 public class MyChildGeneric<T> : MyGeneric<T,T>
index 8e28953..3413786 100644 (file)
@@ -1,5 +1,5 @@
-baseservices/exceptions/regressions/V1/SEH/VJ/UnmanagedToManaged/UnmanagedToManaged.sh
 baseservices/exceptions/regressions/Dev11/147911/test147911/test147911.sh
+baseservices/exceptions/regressions/V1/SEH/VJ/UnmanagedToManaged/UnmanagedToManaged.sh
 baseservices/threading/commitstackonlyasneeded/DefaultStackCommit/DefaultStackCommit.sh
 baseservices/threading/interlocked/compareexchange/compareexchangetneg/compareexchangetneg.sh
 baseservices/threading/monitor/pulse/monitorpulse02/monitorpulse02.sh
@@ -132,10 +132,18 @@ CoreMangLib/cti/system/uint16/UInt16ToString4/UInt16ToString4.sh
 CoreMangLib/cti/system/uint32/UInt32ToString2/UInt32ToString2.sh
 CoreMangLib/system/collections/generic/hashset/Regression_Dev10_609271/Regression_Dev10_609271.sh
 CoreMangLib/system/collections/generic/hashset/Regression_Dev10_624201/Regression_Dev10_624201.sh
+Interop/MarshalAPI/GetNativeVariantForObject/GetNativeVariantForObject/GetNativeVariantForObject.sh
+Interop/MarshalAPI/GetObjectForNativeVariant/GetObjectForNativeVariant/GetObjectForNativeVariant.sh
+Interop/MarshalAPI/GetObjectsForNativeVariants/GetObjectsForNativeVariants/GetObjectsForNativeVariants.sh
+Interop/MarshalAPI/IUnknown/IUnknownTest/IUnknownTest.sh
 JIT/Directed/coverage/oldtests/callipinvoke/callipinvoke.sh JIT/Directed/coverage/oldtests/Desktop/callipinvoke_il_d/callipinvoke_il_d.sh
 JIT/Directed/coverage/oldtests/Desktop/callipinvoke_il_r/callipinvoke_il_r.sh
 JIT/Directed/IL/PInvokeTail/PInvokeTail/PInvokeTail.sh
 JIT/Directed/IL/PInvokeTail/TailWinApi/TailWinApi.sh
+JIT/Directed/intrinsic/interlocked/rva_rvastatic1/rva_rvastatic1.sh
+JIT/Directed/intrinsic/interlocked/rva_rvastatic2/rva_rvastatic2.sh
+JIT/Directed/intrinsic/interlocked/rva_rvastatic3/rva_rvastatic3.sh
+JIT/Directed/intrinsic/interlocked/rva_rvastatic4/rva_rvastatic4.sh
 JIT/Directed/pinvoke/calli_excep/calli_excep.sh
 JIT/Directed/pinvoke/jump/jump.sh
 JIT/Directed/pinvoke/sin/sin.sh
@@ -146,6 +154,13 @@ JIT/Directed/PREFIX/unaligned/1/arglist/arglist.sh
 JIT/Directed/PREFIX/unaligned/2/arglist/arglist.sh
 JIT/Directed/PREFIX/unaligned/4/arglist/arglist.sh
 JIT/Directed/PREFIX/volatile/1/arglist/arglist.sh
+JIT/Directed/RVAInit/extended/extended.sh
+JIT/Directed/RVAInit/overlap/overlap.sh
+JIT/Directed/rvastatics/rvastatic1/rvastatic1.sh
+JIT/Directed/rvastatics/rvastatic2/rvastatic2.sh
+JIT/Directed/rvastatics/rvastatic3/rvastatic3.sh
+JIT/Directed/rvastatics/rvastatic4/rvastatic4.sh
+JIT/Directed/rvastatics/rvastatic5/rvastatic5.sh
 JIT/Directed/UnrollLoop/loop2_cs_d/loop2_cs_d.sh
 JIT/Directed/UnrollLoop/loop2_cs_do/loop2_cs_do.sh
 JIT/Directed/UnrollLoop/loop2_cs_r/loop2_cs_r.sh
@@ -214,6 +229,8 @@ JIT/jit64/mcc/interop/mcc_i85/mcc_i85.sh
 JIT/jit64/mcc/interop/mcc_i86/mcc_i86.sh
 JIT/jit64/mcc/interop/mcc_i87/mcc_i87.sh
 JIT/jit64/regress/vsw/286991/test/test.sh
+JIT/Methodical/cctor/misc/global_il_d/global_il_d.sh
+JIT/Methodical/cctor/misc/global_il_r/global_il_r.sh
 JIT/Methodical/cctor/xassem/xprecise3_cs_d/xprecise3_cs_d.sh
 JIT/Methodical/cctor/xassem/xprecise3_cs_do/xprecise3_cs_do.sh
 JIT/Methodical/cctor/xassem/xprecise3_cs_r/xprecise3_cs_r.sh
@@ -291,6 +308,10 @@ JIT/Methodical/explicit/coverage/seq_short_1_d/seq_short_1_d.sh
 JIT/Methodical/explicit/coverage/seq_short_1_r/seq_short_1_r.sh
 JIT/Methodical/explicit/coverage/seq_val_1_d/seq_val_1_d.sh
 JIT/Methodical/explicit/coverage/seq_val_1_r/seq_val_1_r.sh
+JIT/Methodical/tailcall/_il_dbgpointer/_il_dbgpointer.sh
+JIT/Methodical/tailcall/_il_dbgpointer_i/_il_dbgpointer_i.sh
+JIT/Methodical/tailcall/_il_relpointer/_il_relpointer.sh
+JIT/Methodical/tailcall/_il_relpointer_i/_il_relpointer_i.sh
 JIT/Methodical/varargs/callconv/gc_ctor_il_d/gc_ctor_il_d.sh
 JIT/Methodical/varargs/callconv/gc_ctor_il_r/gc_ctor_il_r.sh
 JIT/Methodical/varargs/callconv/val_ctor_il_d/val_ctor_il_d.sh
@@ -316,21 +337,20 @@ JIT/Regression/CLR-x86-JIT/V1-M11-Beta1/b35784/b35784/b35784.sh
 JIT/Regression/CLR-x86-JIT/V1-M11-Beta1/b36472/b36472/b36472.sh
 JIT/Regression/CLR-x86-JIT/V1-M11-Beta1/b37598/b37598/b37598.sh
 JIT/Regression/CLR-x86-JIT/V1-M11-Beta1/b46867/b46867/b46867.sh
+JIT/Regression/CLR-x86-JIT/V1-M11-Beta1/b49644/b49644/b49644.sh
 JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b31745/b31745/b31745.sh
 JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b31746/b31746/b31746.sh
 JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b41852/b41852/b41852.sh
 JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b79250/b79250/b79250.sh
 JIT/Regression/CLR-x86-JIT/V1-M13-RTM/b88793/b88793/b88793.sh
 JIT/Regression/CLR-x86-JIT/V1-M13-RTM/b91248/b91248/b91248.sh
+JIT/Regression/CLR-x86-JIT/V1.2-Beta1/b102637/b102637/b102637.sh
 JIT/Regression/CLR-x86-JIT/V1.2-M01/b07493/b07493/b07493.sh
+JIT/Regression/CLR-x86-JIT/V2.0-Beta2/b409748/b409748/b409748.sh
 JIT/Regression/CLR-x86-JIT/V2.0-Beta2/b427411/Desktop/b427411/b427411.sh
-JIT/Regression/VS-ia64-JIT/V1.2-M02/b12011/b12011/b12011.sh
 JIT/Regression/VS-ia64-JIT/V1.2-M01/b15632/b15632/b15632.sh
-JIT/Regression/CLR-x86-JIT/V2.0-Beta2/b409748/b409748/b409748.sh
+JIT/Regression/VS-ia64-JIT/V1.2-M02/b12011/b12011/b12011.sh
+JIT/Regression/VS-ia64-JIT/V2.0-Beta2/b410474/b410474/b410474.sh
 JIT/Regression/VS-ia64-JIT/V2.0-RTM/b286991/b286991/b286991.sh
 managed/Compilation/Compilation/Compilation.sh
 Regressions/coreclr/0584/Test584/Test584.sh
-Interop/MarshalAPI/IUnknown/IUnknownTest/IUnknownTest.sh
-Interop/MarshalAPI/GetNativeVariantForObject/GetNativeVariantForObject/GetNativeVariantForObject.sh
-Interop/MarshalAPI/GetObjectForNativeVariant/GetObjectForNativeVariant/GetObjectForNativeVariant.sh
-Interop/MarshalAPI/GetObjectsForNativeVariants/GetObjectsForNativeVariants/GetObjectsForNativeVariants.sh
index 733ecb4..097d803 100644 (file)
         <ExcludeList Include="$(XunitTestBinBase)\JIT\opt\Tailcall\TailcallVerifyWithPrefix\TailcallVerifyWithPrefix.cmd">
              <Issue>needs triage</Issue>
         </ExcludeList>
+        <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\Dev11\Dev11_468598\Test_HndIndex_10_Plain\Test_HndIndex_10_Plain.cmd">
+            <Issue>5286</Issue>
+        </ExcludeList>
+        <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\Dev11\Dev11_468598\Test_HndIndex_10_Reordered\Test_HndIndex_10_Reordered.cmd">
+            <Issue>5286</Issue>
+        </ExcludeList>
+        <ExcludeList Include="$(XunitTestBinBase)\JIT\Performance\CodeQuality\Math\Functions\Functions\Functions.cmd">
+            <Issue>5430</Issue>
+        </ExcludeList>
     </ItemGroup>
 </Project>