-1.0.25-prerelease-00419-02
+1.0.25-prerelease-00429-01
.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
============
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
*(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
+```
+
--- /dev/null
+# 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.
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.
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
=================
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
===================
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.
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:
+++ /dev/null
-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.
+++ /dev/null
-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.
+++ /dev/null
-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.
+++ /dev/null
-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.
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
-----|-------------|------|-------|---------------|-------
## 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
-----|-------------|------|-------|---------------|-------
`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
-1.0.0-beta-002173
\ No newline at end of file
+1.0.0-preview2-002733
\ No newline at end of file
|**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)|
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"
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
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.
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
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
/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
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
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^)
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
}
# 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
}
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
}
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
__ClangMinorVersion=0
__MSBuildPath=$__ProjectRoot/Tools/MSBuild.exe
__NuGetPath="$__PackagesDir/NuGet.exe"
-__DistroName=""
+__DistroRid=""
__cmakeargs=""
__OfficialBuildIdArg=
__SkipGenerateVersion=0
fi
# init the distro name
-initDistroName
+initDistroRid
# Set the remaining variables based upon the determined build configuration
__BinDir="$__RootBinDir/Product/$__BuildOS.$__BuildArch.$__BuildType"
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)
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)
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)
<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>
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
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
}
__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
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
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..."
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
}
}
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
}
}
}
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':
// 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') {
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"
def runjitstressregsStr = ''
def runjitmioptsStr = ''
def runjitforcerelocsStr = ''
+ def gcstressStr = ''
+ def runtestArguments = ''
if (scenario == 'r2r' ||
scenario == 'pri1r2r' ||
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
// 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"
}
}
}
// 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) {
}
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"
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' &&
// 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'){
def runjitstressregsStr = ''
def runjitmioptsStr = ''
def runjitforcerelocsStr = ''
+ def gcstressStr = ''
if (scenario == 'r2r' ||
scenario == 'pri1r2r' ||
runjitforcerelocsStr = '--jitforcerelocs'
}
}
+ if (scenario == 'gcstress15_pri1r2r')
+ {
+ gcstressStr = '--gcstresslevel=0xF'
+ }
if (isLongGc(scenario)) {
// Long GC tests behave very poorly when they are not
--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}""")
}
}
}
-<?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>
<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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
<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>
--- /dev/null
+<?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>
-<?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>
<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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
<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>
--- /dev/null
+<?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>
-<?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>
<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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
<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>
--- /dev/null
+<?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>
-<?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>
<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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
<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>
--- /dev/null
+<?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>
<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" />
--- /dev/null
+<?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>
{
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);
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");
#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);
HRESULT AssemblyBinder::BindUsingHostAssemblyResolver (/* in */ INT_PTR pManagedAssemblyLoadContextToBindWithin,
/* in */ AssemblyName *pAssemblyName,
/* in */ IAssemblyName *pIAssemblyName,
+ /* in */ CLRPrivBinderCoreCLR *pTPABinder,
/* out */ Assembly **ppAssembly)
{
HRESULT hr = E_FAIL;
_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);
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))
// 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.
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:;
}
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.
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,
}
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:
}
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:
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 );
include_directories("../inc")
set(FLOAT_SOURCES
- floatnative.cpp
+ floatdouble.cpp
+ floatsingle.cpp
)
if(CLR_CMAKE_PLATFORM_UNIX)
</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" />
--- /dev/null
+// 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
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+++ /dev/null
-// 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_)
-
-
+++ /dev/null
-// 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
--- /dev/null
+// 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
+///
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////
+++ /dev/null
-// 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_
--- /dev/null
+// 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_
--- /dev/null
+// 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_
// 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);
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(
// 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)
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)
{
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.
{
unlink(m_inPipeName);
unlink(m_outPipeName);
- PAL_CleanupTargetProcess(m_id, m_disambiguationKey);
}
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();
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.
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
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;
}
// 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>
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
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)
_add_executable(ilasm
${ILASM_SOURCES}
+ ${ILASM_RESOURCES}
)
set(ILASM_LINK_LIBRARIES
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
add_definitions(-DFEATURE_CORECLR)
add_definitions(-DFX_VFT=VFT_DLL)
+add_definitions(-DFX_VER_INTERNALNAME_STR=ildasmrc.dll)
+
set(ILDASM_RESOURCES
../dasm.rc
)
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)
#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();
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,
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, )
#include "winnls.h"
#include "check.h"
#include "safemath.h"
+#include "new.hpp"
#ifdef PAL_STDCPP_COMPAT
#include <type_traits>
#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")
#define CoreLibNameLen 8
#define CoreLibSatelliteName_A "mscorlib.resources"
#define CoreLibSatelliteNameLen 18
+#define LegacyCoreLibName_A "mscorlib"
#endif // defined(FEATURE_CORECLR)
class StringArrayList;
#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.
//
add_definitions(-DARM_SOFTFP)
endif (ARM_SOFTFP)
+if(WIN32)
+ set(JIT_RESOURCES Native.rc)
+endif(WIN32)
+
set( JIT_SOURCES
alloc.cpp
assertionprop.cpp
${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)
--- /dev/null
+DllMain
+PAL_RegisterModule
+PAL_UnregisterModule
{
// 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
}
// 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();
oper == GT_AND ||
oper == GT_OR ||
oper == GT_XOR);
-
+
GenTreePtr op1 = treeNode->gtGetOp1();
GenTreePtr op2 = treeNode->gtGetOp2();
instruction ins = genGetInsForOper(treeNode->OperGet(), targetType);
// 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);
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
{
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
emitJumpKind jmpEqual = genJumpKindForOper(GT_EQ, CK_SIGNED);
genJumpToThrowHlpBlk(jmpEqual, SCK_DIV_BY_ZERO);
}
- genCodeForBinary(treeNode);
+ genCodeForBinary(treeNode);
}
}
}
case GT_ADD:
case GT_SUB:
case GT_MUL:
+ genConsumeOperands(treeNode->AsOp());
genCodeForBinary(treeNode);
break;
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]);
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;
// 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());
// 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);
}
}
// 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.
// 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;
}
}
-#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))
#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
}
(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
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);
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);
}
#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_
//------------------------------------------------------------------------
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);
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);
#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;
{
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,
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();
genDefineTempLabel(esp_check);
}
+#endif
}
/* Are we supposed to pop the arguments? */
{
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;
//------------------------------------------------------------------------
// 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.
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)
#endif // !defined(_TARGET_64BIT_)
case GT_ADD:
case GT_SUB:
+ genConsumeOperands(treeNode->AsOp());
genCodeForBinary(treeNode);
break;
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
#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_
}
}
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
}
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
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
}
#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).
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;
}
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();
{
return isBackFilled;
}
+#ifdef DEBUG
+ void Dump();
+#endif
};
typedef struct fgArgTabEntry * fgArgTabEntryPtr;
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; }
+
};
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.
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".
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
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);
GenTreePtr newobjThis,
int prefixFlags,
CORINFO_CALL_INFO* callInfo,
- IL_OFFSETX ilOffset = BAD_IL_OFFSET);
+ IL_OFFSET rawILOffset);
bool impMethodInfo_hasRetBuffArg(CORINFO_METHOD_INFO * methInfo);
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
void fgSetBlockOrder (BasicBlock * block);
-#if FEATURE_STACK_FP_X87
- bool fgFPstLvlRedo;
- void fgComputeFPlvls (GenTreePtr tree);
-#endif // FEATURE_STACK_FP_X87
-
//------------------------- Morphing --------------------------------------
unsigned fgPtrArgCntCur;
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
}
#ifdef DEBUG
- bool optConfigDisableCSE(bool lexicalCSE);
+ bool optConfigDisableCSE();
bool optConfigDisableCSE2();
#endif
void optOptimizeCSEs();
// 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()
// 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
/*****************************************************************************
*
- * 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
*/
codeGen->genResetFPstkLevel();
/* Sometimes we need to redo the FP level computation */
- fgFPstLvlRedo = false;
+ gtFPstLvlRedo = false;
#endif // FEATURE_STACK_FP_X87
#ifdef DEBUG
/* 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
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
#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
#pragma warning(pop)
-#endif // DEBUG || FEATURE_JIT_METHOD_PERF
+#endif // defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF) || defined(FEATURE_SIMD)
/*****************************************************************************/
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.
}
-#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
-
/*****************************************************************************/
/*****************************************************************************/
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;
#endif
-#if defined(_TARGET_ARM_) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+#if defined(FEATURE_HFA) || defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
/*********************************************************************************
*
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)
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
{
}
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.
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.
// empty
}
-#if defined(_TARGET_ARM_)
+#if defined(FEATURE_HFA)
noway_assert(!varTypeIsStruct(comma) ||
comma->gtOper != GT_RET_EXPR ||
(!comp->IsHfa(comma->gtRetExpr.gtRetClsHnd)));
(!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;
}
// 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;
#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]);
* 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.
*/
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;
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;
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 */
costEx += 4;
}
#endif // _TARGET_X86_
-
-#endif // !LONG_MATH_REGPARAM
}
break;
#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;
#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;
#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
+
/*****************************************************************************
*
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
// 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
{
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";
{
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);
}
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
// 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();
// 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()
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)
return gtNewHelperCallNode( CORINFO_HELP_VIRTUAL_FUNC_PTR, TYP_I_IMPL, GTF_EXCEPT, helpArgs);
}
-
+
/*****************************************************************************
*
* Build and import a box node
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)
#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;
// 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;
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);
}
}
}
+
+#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);
}
// 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
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())
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)
}
return impAssignMultiRegTypeToVar(op, retClsHnd);
}
-#endif //_TARGET_ARM_
+#endif // FEATURE_MULTIREG_RET && FEATURE_HFA
REDO_RETURN_NODE:
// adjust the type away from struct to integral
//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;
// 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;
}
#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;
case CEE_CPBLK:
- assert(!compIsForInlining());
-
if (tiVerificationNeeded)
Verify(false, "bad opcode");
op3 = impPopStack().val; // Size
}
}
-#if defined(_TARGET_ARM_)
+#ifdef _TARGET_ARM_
/**************************************************************************************
*
* When assigning a vararg call src to a HFA lcl dest, mark that we cannot promote the
{
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
}
}
}
-#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));
return ret;
}
-#endif // FEATURE_MULTIREG_RET
+#endif // FEATURE_MULTIREG_RET
// do import for a return
// returns false if inlining was aborted
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();
// 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)
{
{
#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
}
}
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);
}
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);
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,
// 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)
// 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.
// Set the policy
const bool isPrejitRoot = true;
- m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, nullptr, isPrejitRoot);
+ m_Policy = InlinePolicy::GetPolicy(m_RootCompiler, isPrejitRoot);
}
//------------------------------------------------------------------------
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)
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;
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;
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;
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)
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() {}
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;
// particular call for inlining.
InlineResult(Compiler* compiler,
GenTreeCall* call,
- InlineContext* inlineContext,
+ GenTreeStmt* stmt,
const char* description);
// Construct a new InlineResult to evaluate a particular
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
{
//
// 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.
if (useReplayPolicy)
{
- return new (compiler, CMK_Inlining) ReplayPolicy(compiler, inlineContext, isPrejitRoot);
+ return new (compiler, CMK_Inlining) ReplayPolicy(compiler, isPrejitRoot);
}
// Optionally install the SizePolicy.
//
// 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)
unsigned contextHash =
m_RootCompiler->info.compCompHnd->getMethodHash(
context->GetCallee());
+ unsigned contextOffset = (unsigned) context->GetOffset();
- return FindInline(contextToken, contextHash);
+ return FindInline(contextToken, contextHash, contextOffset);
}
//------------------------------------------------------------------------
// 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
// 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;
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;
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;
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;
}
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;
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)
//=============================================================================
#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
#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)
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;
// 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;
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);
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;
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;
#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;
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
#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);
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
{
}
}
-#ifdef _TARGET_ARM_
- if (varDsc->lvIsHfaRegArg)
+ if (varDsc->lvIsHfaRegArg())
{
- if (varDsc->lvHfaTypeIsFloat)
+ if (varDsc->lvHfaTypeIsFloat())
{
printf(" (enregistered HFA: float) ");
}
printf(" (enregistered HFA: double)");
}
}
-#endif // _TARGET_ARM_
if (varDsc->lvDoNotEnregister)
{
}
else
{
+#ifdef DEBUG
+ compiler->gtDispTree(argNode);
+#endif
noway_assert(!"Unsupported TYP_STRUCT arg kind");
}
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)
{
#endif
);
-#ifdef _TARGET_ARM_
- if (argDsc->lvIsHfaRegArg)
+ if (argDsc->lvIsHfaRegArg())
{
isFloat = true;
}
-#endif // _TARGET_ARM_
if (isFloat)
{
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;
// 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
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)
{
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;
#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_)
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;
// 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_)
#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)
#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
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;
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.
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
}
#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;
#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);
#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)
{
// 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
{
#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_
}
// 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).
{
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;
// 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
#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_
// 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.
// 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)
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);
}
}
}
-
- // 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)
// 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
#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
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;
fp->node = lcl;
JITDUMP("did not have to make outgoing copy for V%2d", varNum);
- varDsc->lvRefCnt = 0;
return;
}
- else
- {
- varDsc->lvRefCnt = 0;
- }
}
}
}
if (!callHasRetBuffArg && varTypeIsStruct(call))
{
-#ifdef _TARGET_ARM_
+#ifdef FEATURE_HFA
if (call->gtCall.IsVarargs() || !IsHfa(call))
#endif
{
}
}
-#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)
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)
{
case GT_MUL:
#ifndef _TARGET_64BIT_
-#if !LONG_MATH_REGPARAM
if (typ == TYP_LONG)
{
/* For (long)int1 * (long)int2, we dont actually do the
assert(tree->gtIsValid64RsltMul());
}
}
-#endif // !LONG_MATH_REGPARAM
#endif // !_TARGET_64BIT_
break;
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))
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))
{
}
#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)
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;
/*****************************************************************************
*
* 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()
{
#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
// 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
// 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
if (verbose)
printf("\n*************** In optOptimizeValnumCSEs()\n");
- if (optConfigDisableCSE(false))
+ if (optConfigDisableCSE())
return; // Disabled by JitNoCSE
#endif
// 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();
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;
}
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
{
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] =
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)
{
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);
{
break;
}
- assert(!regState->rsIsFloat);
+ assert(regState->rsIsFloat == false);
regState->rsCalleeRegArgMaskLiveIn |= genRegMask(nextArgReg);
}
}
}
-#endif // _TARGET_ARM_
+#endif // FEATURE_MULTIREG_ARGS
return inArgReg;
}
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());
#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
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
{
#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
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
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
/*****************************************************************************/
-#define VALNUM_CSE_ENABLED 1
-
-/*****************************************************************************/
-
#if defined(_TARGET_X86_)
#define CPU_LOAD_STORE_ARCH 0
#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
#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
#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
#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
#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
#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
#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 };
#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
#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, \
#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
#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
#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
#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
};
#endif
-#if defined(DEBUG) || defined(FEATURE_JIT_METHOD_PERF)
/*****************************************************************************/
const char * varTypeName(var_types vt)
return varTypeNames[vt];
}
-#endif // DEBUG || FEATURE_JIT_METHOD_PERF
#if defined(DEBUG) || defined(LATE_DISASM)
/*****************************************************************************
// 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);
}
static unsigned __int64 convertDoubleToUInt64(double d);
- static double round(double d);
+ static double round(double x);
};
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;
<!-- 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>
<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>
<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 -->
--- /dev/null
+{
+ "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
<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)" />
<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)" />
<!-- 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>
<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>
+[assembly:System.Runtime.CompilerServices.InternalsVisibleTo("System.Runtime.WindowsRuntime, PublicKey=00000000000000000400000000000000")]
+
namespace Microsoft.Win32.SafeHandles
{
[System.Security.SecurityCriticalAttribute]
}
namespace System
{
+ [System.Runtime.InteropServices.ComVisible(true)]
+ public interface ICloneable
+ {
+ object Clone();
+ }
+
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class AccessViolationException : System.SystemException
{
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)]
}
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
{
}
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
{
}
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
{
}
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
{
}
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
[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
}
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
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
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
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)]
}
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
{
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)]
[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
{
}
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
{
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) { }
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
<ErrorReport>prompt</ErrorReport>
<Optimize Condition="'$(Optimize)' == ''">true</Optimize>
- <GenerateNativeVersionInfo Condition="'$(OsEnvironment)'=='Windows_NT'">true</GenerateNativeVersionInfo>
<CLSCompliant>true</CLSCompliant>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
// 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);
// 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
// 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]
#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>
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);
// 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
};
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");
{
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)
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;
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)]
[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.
[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.
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;
{
// 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)
// 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.
// 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.
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()
{
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);
}
}
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);
// 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
{
// 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
{
// 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;
}
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());
{
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)
{
{
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);
}
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);
/// 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.
{
get
{
- var props = m_contingentProperties;
+ var props = Volatile.Read(ref m_contingentProperties);
return (props == null) ? default(CancellationToken) : props.m_cancellationToken;
}
}
{
get
{
- var contingentProps = EnsureContingentPropertiesInitialized(needsProtection: true);
+ var contingentProps = EnsureContingentPropertiesInitialized();
if (contingentProps.m_completionEvent == null)
{
bool wasCompleted = IsCompleted;
{
get
{
- var props = m_contingentProperties;
+ var props = Volatile.Read(ref m_contingentProperties);
return props != null ? props.m_completionCountdown - 1 : 0;
}
}
{
get
{
- var props = m_contingentProperties;
+ var props = Volatile.Read(ref m_contingentProperties);
return (props != null) && (props.m_exceptionsHolder != null) && (props.m_exceptionsHolder.ContainsFaultList);
}
}
}
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
}
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
}
}
// 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.
//
// 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);
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>
/// </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;
}
}
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) ||
// 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();
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).
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)
// 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
/// <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.
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
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();
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);
//
// 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))
{
// 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
#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)
#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;
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
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
typedef struct _IMAGE_ARM_RUNTIME_FUNCTION_ENTRY {
DWORD BeginAddress;
+ DWORD EndAddress;
union {
DWORD UnwindData;
struct {
#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
}
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
// 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)
// 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
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
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
#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
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>
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) {
Module Name:
- finite.cpp
+ math.cpp
Abstract:
- Implementation of _finite function (Windows specific runtime function).
+ Implementation of math family functions.
#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:
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;
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;
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;
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;
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;
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)
{
}
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;
PALIMPORT LONG __cdecl PAL_labs(LONG l)
{
long lRet;
-
PERF_ENTRY(labs);
ENTRY("labs (l=%ld)\n", 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.
}
/*++
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;
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;
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)
*
* 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;
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
{
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.
}
}
+
/*++
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)
#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);
#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);
#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
#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
#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
#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>
#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 \
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:
#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])
{
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_
#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;
#include <sys/types.h>
#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
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);
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));
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
{
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;
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)
{
&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;
}
}
- //
- // 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);
&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
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);
SharedMemoryHelpers::CopyString(lockFilePath, 0, SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH);
if (created)
{
- SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath);
+ SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath, true /* isGlobalLockAcquired */);
}
// Create the session directory
lockFilePathCharCount = id->AppendSessionDirectoryName(lockFilePath, lockFilePathCharCount);
if (created)
{
- SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath);
+ SharedMemoryHelpers::EnsureDirectoryExists(lockFilePath, true /* isGlobalLockAcquired */);
autoCleanup.m_lockFilePath = lockFilePath;
autoCleanup.m_sessionDirectoryPathCharCount = lockFilePathCharCount;
}
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)
#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"
#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>
StartupHelperThread(
LPVOID p);
+static
+BOOL
+GetProcessIdDisambiguationKey(
+ IN DWORD processId,
+ OUT UINT64 *disambiguationKey);
+
//
// Helper memory page used by the FlushProcessWriteBuffers
//
#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;
// 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;
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.
// 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),
m_threadId(0),
m_threadHandle(NULL),
m_processId(dwProcessId),
- m_startupSem(SEM_FAILED)
+ m_startupSem(SEM_FAILED),
+ m_continueSem(SEM_FAILED)
{
}
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);
{
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
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);
{
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)
{
}
}
+ //
+ // 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)
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.
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)
{
}
// 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;
{
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
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).
#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
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:
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;
}
{
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);
- }
}
/*++
=======================================
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
add_subdirectory(exit)
add_subdirectory(exp)
add_subdirectory(fabs)
+add_subdirectory(fabsf)
add_subdirectory(fclose)
add_subdirectory(feof)
add_subdirectory(ferror)
add_subdirectory(fgets)
add_subdirectory(floor)
add_subdirectory(fmod)
+add_subdirectory(fmodf)
add_subdirectory(fopen)
add_subdirectory(fprintf)
add_subdirectory(fputs)
add_subdirectory(memmove)
add_subdirectory(memset)
add_subdirectory(modf)
+add_subdirectory(modff)
add_subdirectory(pow)
add_subdirectory(printf)
add_subdirectory(qsort)
add_subdirectory(_wsplitpath)
add_subdirectory(_wtoi)
add_subdirectory(__iscsym)
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
** of floating point numbers (NaN, -Infinity, Infinity,
** finite nonzero, unnormalized, 0, and -0)
**
-**
**==========================================================================*/
-
#include <palsuite.h>
/*
*/
+#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;
}
-
-
-
-
-
-
-
-
-
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).
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
** 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;
}
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
= 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.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
= 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.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
Description
= Passes a series of values to the atan() function,
= checking each for the expected result.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
** 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;
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
** 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;
}
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
** 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;
}
-
-
Description
= Passes to cos() a series of angle value, checking that
= each one return the correct value.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to cosh() a series of angle value, checking that
= each one return to correct value.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-add_subdirectory(test2)
-add_subdirectory(test3)
-
**
** 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;
}
+++ /dev/null
-// 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;
-}
+++ /dev/null
-// 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;
-}
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to fabs() a series of values, checking that
= each one return to correct value.
-
-
-
--- /dev/null
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
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
--- /dev/null
+// 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;
+}
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.
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
// 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to floor() a series of value, checking that
= each one return to correct value.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to fmod() a series of values, checking that
= each one return to correct value.
-
-
-
--- /dev/null
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
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
--- /dev/null
+// 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;
+}
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.
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
// 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;
= 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.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
--- /dev/null
+cmake_minimum_required(VERSION 2.8.12.2)
+
+add_subdirectory(test1)
+
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
--- /dev/null
+// 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;
+}
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.
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-add_subdirectory(test2)
-add_subdirectory(test3)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-// 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;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-# 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.
-
+++ /dev/null
-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
-)
+++ /dev/null
-// 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;
-}
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to sin() a series of angle value, checking that
= each one return to correct value.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to sinh() a series of angle value, checking that
= each one return to correct value.
-
-
-
**
**===================================================================*/
-/* 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to tan() a series of angle value, checking that
= each one return to correct value.
-
-
-
cmake_minimum_required(VERSION 2.8.12.2)
add_subdirectory(test1)
-
**
** 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;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
Description
= Passes to tanh() a series of angle value, checking that
= each one return to correct value.
-
-
-
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
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
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
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
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
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
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
#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);
{ \
if (!(expression)) \
{ \
- if (!isParent) \
+ if (!g_isParent) \
{ \
Trace("Child process: "); \
} \
} \
} 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};
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;
}
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)
{
// 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];
{
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)
{
// '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];
{
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);
bool NameTests()
{
+ const char *testName = "NameTests";
+
AutoCloseMutexHandle m;
char name[MaxPathSize];
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.
{
}
// 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);
}
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
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);
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
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());
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;
{
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
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
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
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;
{
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;
{
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);
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;
{
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
}
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;
{
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);
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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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;
}
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;
}
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();
{
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)
{
// 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);
<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>
#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)
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)
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
; 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
; 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
; 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
}
// 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
{
GCPROTECT_BEGIN(_gcRefs);
+ ICLRPrivAssembly *pAssemblyBindingContext = NULL;
+
// Prepare to invoke System.Runtime.Loader.AssemblyLoadContext.Resolve method.
//
// First, initialize an assembly spec for the requested assembly
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
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();
// 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();
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
+
;
;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;
; 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
}
// 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();
{
// <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;
+ }
}
}
}
{
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)
GetAppDomain()->ToCompilationDomain()->SetTargetImage(m_image, this);
+ m_methodCompileLimit = pModule->GetMDImport()->GetCountWithTokenKind(mdtMethodDef) * 10;
+
#ifdef FEATURE_FULL_NGEN
m_fSpeculativeTriage = FALSE;
m_fDictionariesPopulated = FALSE;
if (pEntry->fScheduled)
return;
- m_uncompiledMethods.Append(pMD);
+ AppendUncompiledMethod(pMD);
}
else
{
}
// Add it to the set of uncompiled methods
- m_uncompiledMethods.Append(pMD);
+ AppendUncompiledMethod(pMD);
}
//
// 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;
}
}
#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];
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);
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);
+ }
}
}
}
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
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)
}
#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));
}
{
// 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();
#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
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);
}
}
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
{
// 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)
{
#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]) +
return((SLOT)(base + (SSIZE_T)displacement));
}
- if (instrPtr[0] == 0xFF) {
+ if (instrPtr[0] == 0xFF) { // Indirect Absolute Near
_ASSERTE(regs);
// 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_
}
// 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:
}
}
+// 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;
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
th = th.GetMethodTable()->GetMethodTableMatchingParentClass(declaringType.AsMethodTable());
}
+ th.GetMethodTable()->EnsureInstanceActive();
+
result = (CORINFO_GENERIC_HANDLE)th.AsPtr();
break;
}
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;
DWORD fieldIndex;
IfFailThrow(ptr.GetData(&fieldIndex));
+ th.AsMethodTable()->EnsureInstanceActive();
+
result = (CORINFO_GENERIC_HANDLE)th.AsMethodTable()->GetFieldDescByIndex(fieldIndex);
break;
}
// 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);
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
#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"
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)
// 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);
}
}
CONTRACTL
{
GC_NOTRIGGER;
- THROWS;
+ NOTHROW;
SO_INTOLERANT;
SUPPORTS_DAC;
PRECONDITION(!m_availableTypesHashtable.IsNull());
// 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;
}
#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
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
int GetVersionResilientTypeHashCode(TypeHandle type);
-int GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token);
+bool GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedType token, int * pdwHashCode);
int GetVersionResilientMethodHashCode(MethodDesc *pMD);
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(
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
set __msbuildCleanBuildArgs=
set __msbuildExtraArgs=
set __verbosity=normal
-set __GCStressLevel=0
:Arg_Loop
if "%1" == "" goto ArgsDone
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)
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
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
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.
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.
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
:: 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
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
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'
function precompile_overlay_assemblies {
if [ $doCrossgen == 1 ]; then
-
+
local overlayDir=$CORE_ROOT
-
+
filesToPrecompile=$(ls -trh $overlayDir/*.dll)
for fileToPrecompile in ${filesToPrecompile}
do
$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
done
else
echo Skipping crossgen of FX assemblies.
- fi
+ fi
}
function copy_test_native_bin_to_test_root {
declare -a scriptFilePaths
declare -a outputFilePaths
declare -a processIds
+declare -a testStartTimes
function finish_test {
wait ${processIds[$nextProcessIndex]}
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++
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"
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
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" &
coverageOutputDir=
testEnv=
playlistFile=
+showTime=
+noLFConversion=
((disableEventLogging = 0))
((serverGC = 0))
((disableEventLogging = 1))
;;
--runcrossgentests)
- ((RunCrossGenTests = 1))
+ export RunCrossGen=1
;;
--sequential)
((maxProcesses = 1))
--test-env=*)
testEnv=${i#*=}
;;
+ --gcstresslevel=*)
+ export COMPlus_GCStress=${i#*=}
+ ;;
+ --show-time)
+ showTime=ON
+ ;;
+ --no-lf-conversion)
+ noLFConversion=ON
+ ;;
*)
echo "Unknown switch: $i"
print_usage
export COMPlus_EnableEventLog=1
fi
-if ((RunCrossGenTests == 1)); then
- export RunCrossGen=1
-fi
export CORECLR_SERVER_GC="$serverGC"
if [ -z "$testRootDir" ]; 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
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
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%"
packageName='runtime.'$rid'.Microsoft.NETCore.CoreDisTools'
echo { \
\"dependencies\": { \
- \"$packageName\": \"1.0.1-prerelease-00001\" \
+ \"$packageName\": \"1.0.1-prerelease-*\" \
}, \
\"frameworks\": { \"dnxcore50\": { } } \
} > $jsonFilePath
-->
<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)">
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)
-->
<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)">
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)
{
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);
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;
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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 -->
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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 -->
<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>
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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 -->
<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' ">
<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 -->
<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' ">
<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 -->
<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' ">
<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' ">
<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 -->
<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 -->
<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 -->
<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>
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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' ">
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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' ">
<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' ">
<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' ">
<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 -->
<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 -->
<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 -->
<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 -->
<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' ">
<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' ">
<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 -->
<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 -->
<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>
<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>
<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 -->
<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 -->
<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 -->
<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 -->
<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 -->
<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' ">
<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' ">
<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' ">
<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' ">
<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>
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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>
<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>
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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 -->
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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>
<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' ">
<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 -->
<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 -->
<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' ">
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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>
<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>
<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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</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>
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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 -->
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
<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' ">
--- /dev/null
+// 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}");
+ }
+ }
+ }
+
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
--- /dev/null
+// 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");
+
+ // ****************************************************************
+ }
+ }
+}
--- /dev/null
+<?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
--- /dev/null
+// 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;
+ }
+}
--- /dev/null
+// 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}");
+ }
+ }
+ }
+}
<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>
<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>
<NoLogo>True</NoLogo>
<NoStandardLib>True</NoStandardLib>
<Noconfig>True</Noconfig>
+ <Optimize>True</Optimize>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<JitOptimizationSensitive>True</JitOptimizationSensitive>
<DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
+++ /dev/null
-// 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
--- /dev/null
+// 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
+
--- /dev/null
+<?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>
.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
{
.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
IL_0027: nop
IL_0028: nop
IL_0029: nop
- ldc.i4 100
+ ldc.i4 100
IL_002a: ret
}
.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
{
.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
IL_0012: nop
IL_0013: nop
IL_0014: ldc.i4 100
- ret
+ ret
}
}
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;
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;
}
}
}
</ItemGroup>
<ItemGroup>
<Compile Include="Ctors.cs" />
+ <Compile Include="VectorUtil.cs" />
</ItemGroup>
<!-- <PropertyGroup>
<ProjectJson>$(JitPackagesConfigFileDirectory)threading+thread\project.json</ProjectJson>
</ItemGroup>
<ItemGroup>
<Compile Include="Ctors.cs" />
+ <Compile Include="VectorUtil.cs" />
</ItemGroup>
<!-- <PropertyGroup>
<ProjectJson>$(JitPackagesConfigFileDirectory)threading+thread\project.json</ProjectJson>
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;
}
}
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;
}
}
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)
{
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
using System;
using System.Numerics;
+using System.IO;
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);
+ }
}
--- /dev/null
+<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>
"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": {}
"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": {
--- /dev/null
+// 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);
+ }
+}
--- /dev/null
+<?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>
<NoLogo>True</NoLogo>
<NoStandardLib>True</NoStandardLib>
<Noconfig>True</Noconfig>
+ <Optimize>True</Optimize>
<JitOptimizationSensitive>True</JitOptimizationSensitive>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
--- /dev/null
+// 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
<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>
<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}" />
--- /dev/null
+// 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 { }
+ }
+ }
+}
<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>
<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>
--- /dev/null
+// 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 { }
+ }
+ }
+}
<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>
<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>
--- /dev/null
+// 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
<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>
<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>
</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" />
--- /dev/null
+<?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>
--- /dev/null
+{
+ "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": {}
+ }
+}
.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.
.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
.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
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
.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 ***********************
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-}
+++ /dev/null
-<?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>
+++ /dev/null
-// 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
- }
-
-}
using System;
using System.Collections.Generic;
+using System.Runtime.CompilerServices;
using System.Text;
+using System.Threading;
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");
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);
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);
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>;
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);
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];
}
}
+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;
<OutputType>Exe</OutputType>
<CLRTestKind>BuildAndRun</CLRTestKind>
<CLRTestPriority>0</CLRTestPriority>
- <ZapRequire>1</ZapRequire>
</PropertyGroup>
<ItemGroup>
--- /dev/null
+<?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
--- /dev/null
+// 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;
+ }
+}
--- /dev/null
+<?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>
--- /dev/null
+// 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
+ }
+}
<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}" />
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
<PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
</PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
--- /dev/null
+{
+ "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": {}
+ }
+}
--- /dev/null
+// 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;
+ }
+}
--- /dev/null
+<?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>
}
}
+ [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();
TestGenericVirtualMethod();
TestMovedGenericVirtualMethod();
+ TestGenericNonVirtualMethod();
+
+ TestGenericOverStruct();
TestInstanceFields();
]]></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
]]></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
"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",
return typeof(List<W>).ToString();
}
#endif
+
+ public string NonVirtualMethod()
+ {
+ return "MyGeneric.NonVirtualMethod";
+ }
}
public class MyChildGeneric<T> : MyGeneric<T,T>
-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
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
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
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
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
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
<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>