Merge pull request #10727 from hqueue/typo/doc_ryujit
authorAditya Mandaleeka <adityamandaleeka@users.noreply.github.com>
Wed, 5 Apr 2017 21:38:39 +0000 (14:38 -0700)
committerGitHub <noreply@github.com>
Wed, 5 Apr 2017 21:38:39 +0000 (14:38 -0700)
Fix class name in ryujit-overview.md

125 files changed:
CMakeLists.txt
Documentation/design-docs/eh-writethru.md [new file with mode: 0644]
Documentation/workflow/OfficalAndDailyBuilds.md
README.md
build.cmd
netci.groovy
perf.groovy
src/.nuget/Microsoft.NETCore.Jit/runtime.Windows_NT.Microsoft.NETCore.Jit.props
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/runtime.Linux.Microsoft.NETCore.Runtime.CoreCLR.props
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/runtime.Windows_NT.Microsoft.NETCore.Runtime.CoreCLR.props
src/.nuget/dir.targets
src/classlibnative/bcltype/system.cpp
src/classlibnative/bcltype/system.h
src/debug/di/process.cpp
src/gc/env/gcenv.ee.h
src/gc/gc.cpp
src/gc/gc.h
src/gc/gcenv.ee.standalone.inl
src/gc/gcinterface.ee.h
src/gc/sample/gcenv.ee.cpp
src/inc/corhdr.h
src/inc/corinfo.h
src/inc/corjit.h
src/inc/crosscomp.h
src/inc/daccess.h
src/inc/eventtracebase.h
src/inc/legacyactivationshim.h [deleted file]
src/inc/legacyactivationshimdelayload.h [deleted file]
src/inc/winwrap.h
src/jit/CMakeLists.txt
src/jit/_typeinfo.h
src/jit/codegenarm.cpp
src/jit/codegenarm64.cpp
src/jit/codegencommon.cpp
src/jit/codegenlegacy.cpp
src/jit/compatjit/.gitmirror [deleted file]
src/jit/compatjit/CMakeLists.txt [deleted file]
src/jit/compiler.cpp
src/jit/compiler.h
src/jit/flowgraph.cpp
src/jit/importer.cpp
src/jit/jit.h
src/jit/jitee.h
src/jit/lsraarm.cpp
src/jit/protononjit/CMakeLists.txt
src/md/compiler/mdvalidator.cpp
src/mscorlib/System.Private.CoreLib.csproj
src/mscorlib/shared/Interop/Windows/Interop.Errors.cs
src/mscorlib/src/Microsoft/Win32/RegistryKey.cs
src/mscorlib/src/Microsoft/Win32/Win32Native.cs
src/mscorlib/src/System/AppDomainSetup.cs
src/mscorlib/src/System/Diagnostics/Debug.Unix.cs
src/mscorlib/src/System/Diagnostics/Debug.Windows.cs
src/mscorlib/src/System/Diagnostics/Debug.cs
src/mscorlib/src/System/Diagnostics/Eventing/EventSource.cs
src/mscorlib/src/System/Environment.cs
src/mscorlib/src/System/Guid.cs
src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs
src/mscorlib/src/System/Security/Util/URLString.cs [deleted file]
src/pal/inc/pal.h
src/pal/inc/palprivate.h
src/pal/src/CMakeLists.txt
src/pal/src/arch/i386/exceptionhelper.S
src/pal/src/misc/environ.cpp
src/pal/src/misc/errorstrings.cpp
src/pal/src/misc/version.cpp [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExA/CMakeLists.txt [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/CMakeLists.txt [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/test.cpp [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/testinfo.dat [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExW/CMakeLists.txt [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/CMakeLists.txt [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/test.cpp [deleted file]
src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/testinfo.dat [deleted file]
src/pal/tests/palsuite/paltestlist_to_be_reviewed.txt
src/pal/tools/gen-buildsys-clang.sh
src/unwinder/i386/unwinder_i386.cpp
src/utilcode/CMakeLists.txt
src/vm/arm64/asmhelpers.asm
src/vm/baseassemblyspec.cpp
src/vm/ceemain.cpp
src/vm/codeman.cpp
src/vm/domainfile.cpp
src/vm/ecalllist.h
src/vm/eetwain.cpp
src/vm/eventtrace.cpp
src/vm/gcenv.ee.cpp
src/vm/gcenv.ee.h
src/vm/gdbjit.cpp
src/vm/i386/asmhelpers.S
src/vm/jitinterface.cpp
src/vm/prestub.cpp
src/vm/readytoruninfo.cpp
src/vm/tieredcompilation.cpp
src/zap/zapcode.cpp
tests/arm64/Tests.lst
tests/scripts/arm64_post_build.py
tests/scripts/build_illink.cmd
tests/scripts/build_illink.sh
tests/scripts/lst_creator.py
tests/src/AllTestProjects.sln
tests/src/CLRTest.Execute.Bash.targets
tests/src/Interop/SizeConst/SizeConstTest.csproj
tests/src/JIT/CodeGenBringUpTests/LocallocB_N.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocB_N.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.csproj [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.cs [new file with mode: 0644]
tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.csproj [new file with mode: 0644]
tests/src/JIT/opt/Tailcall/TailcallVerifyWithPrefix.il
tests/src/baseservices/compilerservices/dynamicobjectproperties/testapis.cs

index 6327a14..4aad5a0 100644 (file)
@@ -104,7 +104,7 @@ else (WIN32)
     else (CMAKE_SYSTEM_NAME STREQUAL Darwin)
 
       # Ensure that objcopy is present
-      if (DEFINED ENV{CROSSCOMPILE} AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
+      if (CLR_UNIX_CROSS_BUILD AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
         if (CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
           find_program(OBJCOPY ${TOOLCHAIN}-objcopy)
         elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
@@ -164,15 +164,12 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux)
     endif()
     set(CLR_CMAKE_PLATFORM_LINUX 1)
 
-    # Detect Alpine Linux
-    SET(OS_RELEASE_FILENAME "/etc/os-release")
-    if (EXISTS ${OS_RELEASE_FILENAME})
-        file(READ ${OS_RELEASE_FILENAME} OS_RELEASE)
-        string(FIND "${OS_RELEASE}" "ID=alpine" CLR_CMAKE_PLATFORM_ALPINE_LINUX)
-        if(CLR_CMAKE_PLATFORM_ALPINE_LINUX EQUAL -1)
-            unset(CLR_CMAKE_PLATFORM_ALPINE_LINUX)
-        endif(CLR_CMAKE_PLATFORM_ALPINE_LINUX EQUAL -1)
-    endif(EXISTS ${OS_RELEASE_FILENAME})
+    # Detect Linux ID
+    if(DEFINED CLR_CMAKE_LINUX_ID)
+        if(CLR_CMAKE_LINUX_ID STREQUAL alpine)
+            set(CLR_CMAKE_PLATFORM_ALPINE_LINUX 1)
+        endif()
+    endif(DEFINED CLR_CMAKE_LINUX_ID)
 endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
 
 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
diff --git a/Documentation/design-docs/eh-writethru.md b/Documentation/design-docs/eh-writethru.md
new file mode 100644 (file)
index 0000000..0afa5a7
--- /dev/null
@@ -0,0 +1,378 @@
+# Exception Handling Write Through Optimization.
+
+Write through is an optimization done on local variables that live across exception handling flow like a handler, filter, or finally so that they can be enregistered - treated as a register candidate - throughout a method.  For each variable live across one of these constructs, the minimum requirement is that a store to the variables location on the stack is placed between a reaching definition and any point of control flow leading to the handler, as well as a load between any return from a filter or finally and an upward exposed use.  Conceptually this maintains the value of the variable on the stack across the exceptional flow which would kill any live registers.  This transformation splits a local variable into multiple enregisterable compiler temporaries backed by the local variable on the stack. For local vars that additionally have appearances within a eh construct, a load from the stack local is inserted to a temp that will be enregistered within the handler.
+
+## Motivation
+
+Historically the JIT has not done this transformation because exception handling was rare and thus the transformation was not worth the compile time.  Additionally it was easy to make the recomendation to users to remove EH from performance critical methods since they had control of where the EH appeared.  Neither of these points remain true as we increase our focus on cloud workloads.  The use of non-blocking async calls are common in performance critical paths for these workloads and async injects exception handling constructs to implement the feature.  This in combination with the long standing use of EH in 'foreach' and 'using' statements means that we are seeing EH constructs that are difficult for the user to manage or remove high in the profile (Techempower on Kestrel is a good example).  Given these cloud workloads doing the transformation would be a clear benefit.
+
+## Design
+
+The goal of the design is to preserve the constraints listed above - i.e. preserve a correct value on the stack for any local var that crosses an EH edge in the flow graph. To ensure that the broad set of global optimizations can act on the IR shape produced by this transformation and that phase ordering issues do not block enregistration opportunities the write through phase will be staged just prior to SSA build after morph and it will do a full walk of the IR rewriting appearances to proxies as well as inserting reloads at the appropriate blocks in the flow graph as indicated by EH control flow semantics. To preserve the needed values on the stack a store will also be inserted after every definition to copy the new value in the proxy back to the stack location.  This will leave non optimal number of stores (too many) but with the strategy that the more expensive analysis to eliminate/better place stores will be staged as a global optimization in a higher compilation tier.
+
+### Throughput
+
+To identify EH crossing local vars global liveness is necessary.  This comes at the significant cost of the liveness analysis.  To mitigate this the write through phase is staged immediately before SSA build for the global optimizer.  Since the typical case is that there is no EH, the liveness analysis in write through can be reused directly by SSA build.  For the case where EH local vars are present liveness today must be rebuilt for SSA since new local vars have been added, but incremental update to the RyuJIT liveness analysis can be implemented (worklist based live analysis) to improve the throughput.  Additionally the write through transformation does a full IR walk - also expensive - to replace EH local var appearances with proxies and insert transfers to and from the stack for EH flow, given this initial implementations may need to be staged as part of AOT (crossgen) compiles until tiering can move the more expensive analysis out of the startup path.
+
+### Algorithm
+On the IR directly before SSA build:
+- Run global liveness to identify local vars that cross EH boundaries (as a byproduct of this these local vars are marked "do not enregister")
+- Foreach EH local var create a new local var "proxy" that can be enregisterd.
+- Iterate each block in the flow graph doing the following:
+  * Foreach tree in block do a post order traversal and
+    - Replace all appearances of EH local vars with the defined proxy
+    - Insert a copy of proxy definition back to the EH local var (on the stack)
+  * If EH handler entry block insert reloads from EH local var to proxy at block head
+  * If finally or filter exit, insert reloads from EH local var to proxy at successor block heads
+- For method entry block, insert reloads from parameter EH local vars to proxies
+
+At end no proxy should be live across EH flow and all value updates will be written back to the stack location.
+
+## Next steps
+
+The initial prototype that produced the example bellow is currently being improved to make it production ready.  At the same time a more extensive suite of example tests are being developed. 
+
+- [X] Proof of concept prototype.
+- [ ] Production implementation of WriteThru phase.
+- [ ] Suite of optimization examples/regression tests.
+- [ ] Testing
+   * [ ] Full CI test pass.
+   * [ ] JIT benchmark diffs.
+   * [ ] Kestrel techempower numbers.
+
+## Example
+
+The following is a simple example that shows enregistration for a local var live, and modified, through a catch.
+
+#### Source code snippet
+
+```
+class Enreg01
+{
+    int val;
+    double dist;
+
+    public Enreg01(int x) {
+        val = x;
+        dist = (double)x;
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public int foo(ref double d) { return (int)d; }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public int Run()
+    {
+        int sum = val;
+
+        try {
+            TryValue(97);
+        }
+        catch (ValueException e)
+        {
+            Console.WriteLine("Catching {0}", Convert.ToString(e.x));
+            sum += val + e.x;
+            foo(ref dist);
+            sum += val;
+        }
+
+        return sum;
+    }
+
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public int TryValue(int y) 
+    {
+        if (y == 97) 
+        {
+            Console.WriteLine("Throwing 97");
+            throw new ValueException(97);
+        }
+        else
+        {
+            return y;
+        }
+    }
+}
+```
+#### Post WriteThru GenTree nodes for Run() method
+
+The Run() contains the catch and is the only method the EH WriteThru modifies.
+
+```
+Creating enregisterable proxies:
+lvaGrabTemp returning 8 (V08 tmp5) (a long lifetime temp) called for  Add proxy for EH Write Thru..
+Creating proxy V08 for local var V00
+
+lvaGrabTemp returning 9 (V09 tmp6) (a long lifetime temp) called for  Add proxy for EH Write Thru..
+Creating proxy V09 for local var V01
+
+Trees after EH Write Thru
+
+---------------------------------------------------------------------------------------------------------------------------
+BBnum         descAddr ref try hnd preds           weight   [IL range]      [jump]      [EH region]         [flags]
+---------------------------------------------------------------------------------------------------------------------------
+BB01 [00000263A1C161B8]  1                              1   [000..007)                                     i label target 
+BB02 [00000263A1C162D0]  1  0    BB01                   1   [007..012)                 T0      try { }     keep i try label gcsafe 
+BB03 [00000263A1C16500]  2       BB02,BB04              1   [050..052)        (return)                     i label target gcsafe 
+++++ funclets follow
+BB04 [00000263A1C163E8]  0     0                        0   [012..050)-> BB03 ( cret )    H0 F catch { }   keep i rare label target gcsafe flet 
+-------------------------------------------------------------------------------------------------------------------------------------
+
+------------ BB01 [000..007), preds={} succs={BB02}
+
+***** BB01, stmt 1
+     (  3,  3) [000123] ------------             *  stmtExpr  void  (IL   ???...  ???)
+N001 (  3,  2) [000120] ------------             |  /--*  lclVar    ref    V00 this         
+N003 (  3,  3) [000122] -A------R---             \--*  =         ref   
+N002 (  1,  1) [000121] D------N----                \--*  lclVar    ref    V08 tmp5         
+
+***** BB01, stmt 2
+     ( 17, 13) [000005] ------------             *  stmtExpr  void  (IL 0x000...0x006)
+N007 (  3,  2) [000097] ------------             |     /--*  lclVar    int    V09 tmp6         
+N009 (  7,  5) [000098] -A------R---             |  /--*  =         int   
+N008 (  3,  2) [000096] D------N----             |  |  \--*  lclVar    int    V01 loc0         
+N010 ( 17, 13) [000099] -A-XG-------             \--*  comma     void  
+N004 (  6,  5) [000002] ---XG-------                |  /--*  indir     int   
+N002 (  1,  1) [000059] ------------                |  |  |  /--*  const     long   16 field offset Fseq[val]
+N003 (  4,  3) [000060] -------N----                |  |  \--*  +         byref 
+N001 (  3,  2) [000001] ------------                |  |     \--*  lclVar    ref    V08 tmp5         
+N006 ( 10,  8) [000004] -A-XG---R---                \--*  =         int   
+N005 (  3,  2) [000003] D------N----                   \--*  lclVar    int    V09 tmp6         
+
+------------ BB02 [007..012), preds={BB01} succs={BB03}
+
+***** BB02, stmt 3
+     ( 16, 10) [000013] ------------             *  stmtExpr  void  (IL 0x007...0x00F)
+N008 ( 16, 10) [000011] --C-G-------             \--*  call      int    Enreg01.TryIncrement
+N004 (  1,  1) [000009] ------------ this in rcx    +--*  lclVar    ref    V08 tmp5         
+N005 (  1,  1) [000010] ------------ arg1 in rdx    \--*  const     int    97
+
+------------ BB03 [050..052) (return), preds={BB02,BB04} succs={}
+
+***** BB03, stmt 4
+     (  3,  3) [000119] ------------             *  stmtExpr  void  (IL   ???...  ???)
+N001 (  3,  2) [000116] ------------             |  /--*  lclVar    int    V01 loc0         
+N003 (  3,  3) [000118] -A------R---             \--*  =         int   
+N002 (  1,  1) [000117] D------N----                \--*  lclVar    int    V09 tmp6         
+
+***** BB03, stmt 5
+     (  4,  3) [000017] ------------             *  stmtExpr  void  (IL 0x050...0x051)
+N002 (  4,  3) [000016] ------------             \--*  return    int   
+N001 (  3,  2) [000015] ------------                \--*  lclVar    int    V09 tmp6         
+
+------------ BB04 [012..050) -> BB03 (cret), preds={} succs={BB03}
+
+***** BB04, stmt 6
+     (  5,  4) [000021] ------------             *  stmtExpr  void  (IL 0x012...0x012)
+N001 (  1,  1) [000007] -----O------             |  /--*  catchArg  ref   
+N003 (  5,  4) [000020] -A---O--R---             \--*  =         ref   
+N002 (  3,  2) [000019] D------N----                \--*  lclVar    ref    V03 tmp0         
+
+***** BB04, stmt 7
+     (  3,  3) [000111] ------------             *  stmtExpr  void  (IL   ???...  ???)
+N001 (  3,  2) [000108] ------------             |  /--*  lclVar    ref    V00 this         
+N003 (  3,  3) [000110] -A------R---             \--*  =         ref   
+N002 (  1,  1) [000109] D------N----                \--*  lclVar    ref    V08 tmp5         
+
+***** BB04, stmt 8
+     (  3,  3) [000115] ------------             *  stmtExpr  void  (IL   ???...  ???)
+N001 (  3,  2) [000112] ------------             |  /--*  lclVar    int    V01 loc0         
+N003 (  3,  3) [000114] -A------R---             \--*  =         int   
+N002 (  1,  1) [000113] D------N----                \--*  lclVar    int    V09 tmp6         
+
+***** BB04, stmt 9
+     ( 59, 43) [000034] ------------             *  stmtExpr  void  (IL 0x013...0x037)
+N021 ( 59, 43) [000031] --CXG-------             \--*  call      void   System.Console.WriteLine
+N002 (  5, 12) [000066] ----G-------                |  /--*  indir     ref   
+N001 (  3, 10) [000065] ------------                |  |  \--*  const(h)  long   0xB3963070 "Catching {0}"
+N004 (  9, 15) [000076] -A--G---R-L- arg0 SETUP     +--*  =         ref   
+N003 (  3,  2) [000075] D------N----                |  \--*  lclVar    ref    V05 tmp2         
+N012 ( 20, 14) [000029] --CXG-------                |  /--*  call      ref    System.Convert.ToString
+N010 (  6,  8) [000028] ---XG------- arg0 in rcx    |  |  \--*  indir     int   
+N008 (  1,  4) [000067] ------------                |  |     |  /--*  const     long   140 field offset Fseq[x]
+N009 (  4,  6) [000068] -------N----                |  |     \--*  +         byref 
+N007 (  3,  2) [000027] ------------                |  |        \--*  lclVar    ref    V03 tmp0         
+N014 ( 24, 17) [000072] -ACXG---R-L- arg1 SETUP     +--*  =         ref   
+N013 (  3,  2) [000071] D------N----                |  \--*  lclVar    ref    V04 tmp1         
+N017 (  3,  2) [000073] ------------ arg1 in rdx    +--*  lclVar    ref    V04 tmp1          (last use)
+N018 (  3,  2) [000077] ------------ arg0 in rcx    \--*  lclVar    ref    V05 tmp2          (last use)
+
+***** BB04, stmt 10
+     ( 18, 19) [000044] ------------             *  stmtExpr  void  (IL 0x028...  ???)
+N014 (  1,  1) [000101] ------------             |     /--*  lclVar    int    V09 tmp6         
+N016 (  5,  4) [000102] -A------R---             |  /--*  =         int   
+N015 (  3,  2) [000100] D------N----             |  |  \--*  lclVar    int    V01 loc0         
+N017 ( 18, 19) [000103] -A-XG-------             \--*  comma     void  
+N010 (  6,  8) [000039] ---XG-------                |     /--*  indir     int   
+N008 (  1,  4) [000081] ------------                |     |  |  /--*  const     long   140 field offset Fseq[x]
+N009 (  4,  6) [000082] -------N----                |     |  \--*  +         byref 
+N007 (  3,  2) [000038] ------------                |     |     \--*  lclVar    ref    V03 tmp0          (last use)
+N011 ( 13, 15) [000041] ---XG-------                |  /--*  +         int   
+N005 (  4,  4) [000037] ---XG-------                |  |  |  /--*  indir     int   
+N003 (  1,  1) [000079] ------------                |  |  |  |  |  /--*  const     long   16 field offset Fseq[val]
+N004 (  2,  2) [000080] -------N----                |  |  |  |  \--*  +         byref 
+N002 (  1,  1) [000036] ------------                |  |  |  |     \--*  lclVar    ref    V08 tmp5         
+N006 (  6,  6) [000040] ---XG-------                |  |  \--*  +         int   
+N001 (  1,  1) [000035] ------------                |  |     \--*  lclVar    int    V09 tmp6         
+N013 ( 13, 15) [000043] -A-XG---R---                \--*  =         int   
+N012 (  1,  1) [000042] D------N----                   \--*  lclVar    int    V09 tmp6         
+
+***** BB04, stmt 11
+     ( 20, 14) [000051] ------------             *  stmtExpr  void  (IL 0x038...0x044)
+N013 ( 20, 14) [000049] --CXGO------             \--*  call      int    Enreg01.foo
+N007 (  1,  1) [000086] ------------                |     /--*  const     long   8 field offset Fseq[dist]
+N008 (  3,  3) [000087] ------------                |  /--*  +         byref 
+N006 (  1,  1) [000085] ------------                |  |  \--*  lclVar    ref    V08 tmp5         
+N009 (  5,  5) [000088] ---XGO-N---- arg1 in rdx    +--*  comma     byref 
+N005 (  2,  2) [000084] ---X-O-N----                |  \--*  nullcheck byte  
+N004 (  1,  1) [000083] ------------                |     \--*  lclVar    ref    V08 tmp5         
+N010 (  1,  1) [000045] ------------ this in rcx    \--*  lclVar    ref    V08 tmp5         
+
+***** BB04, stmt 12
+     ( 11, 10) [000058] ------------             *  stmtExpr  void  (IL 0x045...0x04D)
+N009 (  1,  1) [000105] ------------             |     /--*  lclVar    int    V09 tmp6         
+N011 (  5,  4) [000106] -A------R---             |  /--*  =         int   
+N010 (  3,  2) [000104] D------N----             |  |  \--*  lclVar    int    V01 loc0         
+N012 ( 11, 10) [000107] -A-XG-------             \--*  comma     void  
+N005 (  4,  4) [000054] ---XG-------                |     /--*  indir     int   
+N003 (  1,  1) [000094] ------------                |     |  |  /--*  const     long   16 field offset Fseq[val]
+N004 (  2,  2) [000095] -------N----                |     |  \--*  +         byref 
+N002 (  1,  1) [000053] ------------                |     |     \--*  lclVar    ref    V08 tmp5         
+N006 (  6,  6) [000055] ---XG-------                |  /--*  +         int   
+N001 (  1,  1) [000052] ------------                |  |  \--*  lclVar    int    V09 tmp6         
+N008 (  6,  6) [000057] -A-XG---R---                \--*  =         int   
+N007 (  1,  1) [000056] D------N----                   \--*  lclVar    int    V09 tmp6         
+
+```
+
+#### Post register allocation and code generation code
+
+```diff
+--- base.asmdmp        2017-03-28 20:40:36.000000000 -0700
++++ wt.asmdmp  2017-03-28 20:41:11.000000000 -0700
+@@ -1,78 +1,85 @@
+ *************** After end code gen, before unwindEmit()
+-G_M16307_IG01:        ; func=00, offs=000000H, size=0014H, gcVars=0000000000000000 {}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref, nogc <-- Prolog IG
++G_M16307_IG01:        ; func=00, offs=000000H, size=0017H, gcVars=0000000000000000 {}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref, nogc <-- Prolog IG
+ push     rbp
++push     r14
+ push     rdi
+ push     rsi
++push     rbx
+ sub      rsp, 48
+-lea      rbp, [rsp+40H]
+-mov      qword ptr [V07 rbp-20H], rsp
++lea      rbp, [rsp+50H]
++mov      qword ptr [V07 rbp-30H], rsp
+ mov      gword ptr [V00 rbp+10H], rcx
+-G_M16307_IG02:        ; offs=000014H, size=000AH, gcVars=0000000000000001 {V00}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref
++G_M16307_IG02:        ; offs=000017H, size=000AH, gcVars=0000000000000001 {V00}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref
+-mov      rcx, gword ptr [V00 rbp+10H]
+-mov      ecx, dword ptr [rcx+16]
+-mov      dword ptr [V01 rbp-14H], ecx
++mov      rsi, gword ptr [V00 rbp+10H]
++mov      edi, dword ptr [rsi+16]
++mov      dword ptr [V01 rbp-24H], edi
+-G_M16307_IG03:        ; offs=00001EH, size=000FH, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, byref
++G_M16307_IG03:        ; offs=000021H, size=000EH, gcrefRegs=00000040 {rsi}, byrefRegs=00000000 {}, byref
+-mov      rcx, gword ptr [V00 rbp+10H]
++mov      rcx, rsi     ; Elided reload in try region
+ mov      edx, 97
+ call     Enreg01:TryIncrement(int):int:this
+ nop      
+-G_M16307_IG04:        ; offs=00002DH, size=0003H, gcVars=0000000000000000 {}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref
++G_M16307_IG04:        ; offs=00002FH, size=0005H, gcVars=0000000000000000 {}, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, gcvars, byref
+-mov      eax, dword ptr [V01 rbp-14H]
++mov      edi, dword ptr [V01 rbp-24H]
++mov      eax, edi
+-G_M16307_IG05:        ; offs=000030H, size=0008H, epilog, nogc, emitadd
++G_M16307_IG05:        ; offs=000034H, size=000BH, epilog, nogc, emitadd
+-lea      rsp, [rbp-10H]
++lea      rsp, [rbp-20H]
++pop      rbx
+ pop      rsi
+ pop      rdi
++pop      r14
+ pop      rbp
+ ret      
+-G_M16307_IG06:        ; func=01, offs=000038H, size=0014H, gcrefRegs=00000004 {rdx}, byrefRegs=00000000 {}, byref, funclet prolog, nogc
++G_M16307_IG06:        ; func=01, offs=00003FH, size=0017H, gcrefRegs=00000004 {rdx}, byrefRegs=00000000 {}, byref, funclet prolog, nogc
+ push     rbp
++push     r14 
+ push     rdi
+ push     rsi
++push     rbx 
+ sub      rsp, 48
+ mov      rbp, qword ptr [rcx+32]
+ mov      qword ptr [rsp+20H], rbp
+-lea      rbp, [rbp+40H]
++lea      rbp, [rbp+50H]
+-G_M16307_IG07:        ; offs=00004CH, size=005EH, gcVars=0000000000000001 {V00}, gcrefRegs=00000004 {rdx}, byrefRegs=00000000 {}, gcvars, byref, isz
++G_M16307_IG07:        ; offs=000056H, size=0054H, gcVars=0000000000000001 {V00}, gcrefRegs=00000004 {rdx}, byrefRegs=00000000 {}, gcvars, byref, isz
+ mov      rsi, rdx
+-mov      rcx, 0x18A3C473070
+-mov      rdi, gword ptr [rcx]
++mov      rcx, gword ptr [V00 rbp+10H]        ; Reload of proxy register
++mov      rdi, rcx                            ; Missed peep
++mov      ecx, dword ptr [V01 rbp-24H]        ; Reload of proxy register
++mov      ebx, ecx                            ; Missed peep
++mov      rcx, 0x263B3963070
++mov      r14, gword ptr [rcx]                ; Missed addressing mode
+ mov      ecx, dword ptr [rsi+140]
+ call     System.Convert:ToString(int):ref
+ mov      rdx, rax
+-mov      rcx, rdi
++mov      rcx, r14
+ call     System.Console:WriteLine(ref,ref)
+-mov      edx, dword ptr [V01 rbp-14H]        ; Elided stack access
+-mov      rcx, gword ptr [V00 rbp+10H]        ; Elided stack access
+-add      edx, dword ptr [rcx+16]
+-add      edx, dword ptr [rsi+140]
+-mov      dword ptr [V01 rbp-14H], edx        ; Elided stack access
+-mov      rdx, gword ptr [V00 rbp+10H]        ; Elided stack access
+-add      rdx, 8
+-mov      rcx, gword ptr [V00 rbp+10H]        ; Elided stack access
++add      ebx, dword ptr [rdi+16]
++add      ebx, dword ptr [rsi+140]
++lea      rdx, bword ptr [rdi+8]
++mov      rcx, rdi
+ call     Enreg01:foo(byref):int:this
+-mov      eax, dword ptr [V01 rbp-14H]        ; Elided stack access
+-mov      rdx, gword ptr [V00 rbp+10H]        ; Elided stack access
+-add      eax, dword ptr [rdx+16]
+-mov      dword ptr [V01 rbp-14H], eax        ; Elided stack access
++add      ebx, dword ptr [rdi+16]
++mov      dword ptr [V01 rbp-24H], ebx        ; Store of proxy register
+ lea      rax, G_M16307_IG04
+-G_M16307_IG08:        ; offs=0000AAH, size=0008H, funclet epilog, nogc, emitadd
++G_M16307_IG08:        ; offs=0000AAH, size=000BH, funclet epilog, nogc, emitadd
+ add      rsp, 48
++pop      rbx
+ pop      rsi
+ pop      rdi
++pop      r14
+ pop      rbp
+ ret 
+
+```
+
+Summary of diff:
+replaced 6 loads and 2 stores with 2 loads, 1 store, 2 push, 2 pop.
+
+
index 3b5d3b9..322fc82 100644 (file)
@@ -72,7 +72,6 @@ something affecting all builds).
 |**openSUSE 42.1**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_opensuse42.1.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_opensuse42.1)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_opensuse42.1.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_opensuse42.1)|
 |**OS X 10.12**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_osx.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_osx)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_osx.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_osx)|
 |**Red Hat 7.2**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_rhel7.2.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_rhel7.2)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_rhel7.2.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_rhel7.2)|
-|**Fedora 23**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_fedora23.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_fedora23)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_fedora23.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_fedora23)|
 |**Ubuntu 14.04**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_ubuntu.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_ubuntu)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_ubuntu.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_ubuntu)|
 |**Ubuntu 16.04**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_ubuntu16.04.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_ubuntu16.04)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_ubuntu16.04.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_ubuntu16.04)|
 |**Ubuntu 16.10**|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/debug_ubuntu16.10.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/debug_ubuntu16.10)|[![x64 status](https://img.shields.io/jenkins/s/https/ci.dot.net/job/dotnet_coreclr/job/master/release_ubuntu16.10.svg?label=x64)](http://ci.dot.net/job/dotnet_coreclr/job/master/job/release_ubuntu16.10)|
index 6683a16..21dd9f7 100644 (file)
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ which is a system to package, distribute and version software components.  See [
 for more information on Nuget.   For now it is enough to know Nuget is a system that
 bundles components into `*.nupkg` files (which are ZIP archives) and these packages can be 'published' 
 either through a local file system path or by a URL (e.g. https://www.nuget.org/).   There are then tools 
-(e.g. Nuget.exe, Visual Studio, dotnet.exe) that based on a configuration file (project.json) know 
+(e.g. Nuget.exe, Visual Studio, dotnet.exe) that based on a configuration file (.csproj) know 
 how to search these publishing locations and pull down consistent set of packages for the 
 application.   
 
index 859eac7..904bb02 100644 (file)
--- a/build.cmd
+++ b/build.cmd
@@ -75,7 +75,7 @@ set __BuildArchArm64=0
 set __BuildTypeDebug=0
 set __BuildTypeChecked=0
 set __BuildTypeRelease=0
-set __BuildJit32="-DBUILD_JIT32=0"
+set __BuildJit32=0
 set __BuildStandaloneGC="-DFEATURE_STANDALONE_GC=0"
 
 set __PgoInstrument=0
@@ -142,7 +142,7 @@ if /i "%1" == "skiptests"           (set __BuildTests=0&set processedArgs=!proce
 if /i "%1" == "skipbuildpackages"   (set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "skiprestoreoptdata"  (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "usenmakemakefiles"   (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set __BuildNativeCoreLib=0&set __BuildCoreLib=0&set __BuildTests=0&set __BuildPackages=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "buildjit32"          (set __BuildJit32="-DBUILD_JIT32=1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "buildjit32"          (set __BuildJit32=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "pgoinstrument"       (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "ibcinstrument"       (set __IbcTuning=/Tuning&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "toolset_dir"         (set __ToolsetDir=%2&set __PassThroughArgs=%__PassThroughArgs% %2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
@@ -318,7 +318,7 @@ if %__BuildNative% EQU 1 (
 
     pushd "%__IntermediatesDir%"
     set __ExtraCmakeArgs=!___SDKVersion! "-DCLR_CMAKE_TARGET_OS=%__BuildOs%" "-DCLR_CMAKE_PACKAGES_DIR=%__PackagesDir%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_VERSION=%__PgoOptDataVersion%"
-    call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% %__BuildJit32% %__BuildStandaloneGC% !__ExtraCmakeArgs!
+    call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" "%__ProjectDir%" %__VSVersion% %__BuildArch% "-DBUILD_JIT32=%__BuildJit32%" %__BuildStandaloneGC% !__ExtraCmakeArgs!
        @if defined _echo @echo on
     popd
 :SkipConfigure
@@ -430,6 +430,10 @@ if %__BuildCoreLib% EQU 1 (
                set __nugetBuildArgs=-buildNugetPackage=true
        )
 
+    set PackageCompatJit=
+    if "%__BuildJit32%" == "1" (
+        set PackageCompatJit=1
+    )
     @call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\build.proj -MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr! !__nugetBuildArgs! %__RunArgs% !__ExtraBuildArgs! %__UnprocessedBuildArgs%
     if not !errorlevel! == 0 (
         echo %__MsgPrefix%Error: System.Private.CoreLib build failed. Refer to the build log files for details:
index c67ce6a..4f8867b 100755 (executable)
@@ -20,7 +20,6 @@ def static getOSGroup(def os) {
         'Ubuntu16.04': 'Linux',
         'Ubuntu16.10': 'Linux',
         'Debian8.4':'Linux',
-        'Fedora23':'Linux',
         'OSX10.12':'OSX',
         'Windows_NT':'Windows_NT',
         'FreeBSD':'FreeBSD',
@@ -51,8 +50,7 @@ class Constants {
                'RHEL7.2',
                'Ubuntu16.04',
                'Ubuntu16.10',
-               'Tizen',
-               'Fedora23']
+               'Tizen']
 
     def static crossList = ['Ubuntu', 'OSX10.12', 'CentOS7.1', 'RHEL7.2', 'Debian8.4']
 
@@ -140,15 +138,12 @@ class Constants {
     def static configurationList = ['Debug', 'Checked', 'Release']
 
     // This is the set of architectures
-    def static architectureList = ['arm', 'arm64', 'x64', 'x86', 'x86compatjit']
+    def static architectureList = ['arm', 'arm64', 'x64', 'x86']
 }
 
 def static setMachineAffinity(def job, def os, def architecture) {
     if (architecture == 'arm64' && os == 'Windows_NT') {
-        // For cross compilation
-        job.with {
-            label('arm64')
-        }
+        Utilities.setMachineAffinity(job, os, 'latest-arm64');
     } else if (architecture == 'arm64' && os == 'Ubuntu') {
         Utilities.setMachineAffinity(job, os, 'arm-cross-latest');
     } else if ((architecture == 'arm') && (os == 'Ubuntu' || os == 'Ubuntu16.04' || os == 'Tizen')) {
@@ -344,9 +339,6 @@ def static getJobName(def configuration, def architecture, def os, def scenario,
         case 'x86':
             baseName = architecture.toLowerCase() + '_' + configuration.toLowerCase() + '_' + os.toLowerCase()
             break
-        case 'x86compatjit':
-            baseName = 'x86_compatjit_' + configuration.toLowerCase() + '_' + os.toLowerCase()
-            break
         default:
             println("Unknown architecture: ${architecture}");
             assert false
@@ -363,7 +355,6 @@ def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def
             switch (architecture) {
                 case 'x64':
                 case 'x86':
-                case 'x86compatjit':
                     if (architecture == 'x86' && os == 'Ubuntu') {
                         Utilities.addPeriodicTrigger(job, '@daily')
                     }
@@ -426,7 +417,7 @@ def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def
                     }
                 }
                 // For x86, only add per-commit jobs for Windows
-                else if (architecture == 'x86' || architecture == 'x86compatjit') {
+                else if (architecture == 'x86') {
                     if (os == 'Windows_NT') {
                         Utilities.addGithubPushTrigger(job)
                     }
@@ -472,7 +463,7 @@ def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def
                     }
                 }
                 // For x86, only add per-commit jobs for Windows
-                else if (architecture == 'x86' || architecture == 'x86compatjit') {
+                else if (architecture == 'x86') {
                     if (os == 'Windows_NT') {
                         Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
                     }
@@ -610,9 +601,11 @@ def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def
 
         case 'illink':
             // Testing on other operating systems TBD
-            assert (os == 'Windows_NT')
+            assert (os == 'Windows_NT' || os == 'Ubuntu')
             if (architecture == 'x64' || architecture == 'x86') {
-                Utilities.addPeriodicTrigger(job, '@daily')
+                if (configuration == 'Checked') {
+                    Utilities.addPeriodicTrigger(job, '@daily')
+                }
             }
            break
 
@@ -685,7 +678,6 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
                     // Distinguish with the other architectures (arm and x86)
                     Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} Build", "(?i).*test\\W+${os}\\W+${architecture}.*")
                     break
-                case 'Fedora23':
                 case 'Ubuntu16.10':
                 case 'OpenSUSE42.1':
                     assert !isFlowJob
@@ -693,6 +685,11 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
                     Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} Build", "(?i).*test\\W+${os}\\W+.*")
                     break
                 case 'Ubuntu':
+                    if (scenario == 'illink') {
+                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} via ILLink", "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}\\W+${scenario}.*")
+                        break
+                    }
+                    // fall through
                 case 'OSX10.12':
                     // Triggers on the non-flow jobs aren't necessary here
                     // Corefx testing uses non-flow jobs.
@@ -1263,145 +1260,6 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
             }
             break
         // editor brace matching: }
-        case 'x86compatjit': // editor brace matching: {
-            assert (os == 'Windows_NT')
-            def arch = 'x86'
-            def jit = 'compatjit'
-            switch (scenario) {
-                case 'default':
-                    if (configuration == 'Checked') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} Build and Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}.*")
-                    }
-                    break
-                case 'pri1':
-                    if (configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} Priority 1 Build and Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+Priority 1 Build and Test.*")
-                    }
-                    break
-                case 'ilrt':
-                    if (configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} IL RoundTrip Build and Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'r2r':
-                    if (configuration == 'Checked' || configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} R2R pri0 Build & Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'pri1r2r':
-                    if (configuration == 'Checked' || configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} R2R pri1 Build & Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'gcstress15_pri1r2r':
-                    if (configuration == 'Release' || configuration == 'Checked') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} GCStress 15 R2R pri1 Build & Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'r2r_jitstress1':
-                case 'r2r_jitstress2':
-                case 'r2r_jitstressregs1':
-                case 'r2r_jitstressregs2':
-                case 'r2r_jitstressregs3':
-                case 'r2r_jitstressregs4':
-                case 'r2r_jitstressregs8':
-                case 'r2r_jitstressregs0x10':
-                case 'r2r_jitstressregs0x80':
-                case 'r2r_jitstressregs0x1000':
-                case 'r2r_jitminopts':
-                case 'r2r_jitforcerelocs':
-                    if (configuration == 'Release' || configuration == 'Checked') {
-                        def displayStr = getR2RStressModeDisplayName(scenario)
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} ${displayStr} R2R Build & Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'longgc':
-                    if (configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} Long-Running GC Build & Test",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'gcsimulator':
-                    if (configuration == 'Release') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} GC Simulator",
-                            "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'standalone_gc':
-                    if (configuration == 'Release' || configuration == 'Checked') {
-                        Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} Standalone GC", "(?i).*test\\W+${os}\\W+${configuration}\\W+${scenario}.*")
-                    }
-                    break
-                case 'minopts':
-                case 'forcerelocs':
-                case 'jitstress1':
-                case 'jitstress2':
-                case 'jitstressregs1':
-                case 'jitstressregs2':
-                case 'jitstressregs3':
-                case 'jitstressregs4':
-                case 'jitstressregs8':
-                case 'jitstressregs0x10':
-                case 'jitstressregs0x80':
-                case 'jitstressregs0x1000':
-                case 'jitstress2_jitstressregs1':
-                case 'jitstress2_jitstressregs2':
-                case 'jitstress2_jitstressregs3':
-                case 'jitstress2_jitstressregs4':
-                case 'jitstress2_jitstressregs8':
-                case 'jitstress2_jitstressregs0x10':
-                case 'jitstress2_jitstressregs0x80':
-                case 'jitstress2_jitstressregs0x1000':
-                case 'tailcallstress':
-                case 'jitsse2only':
-                case 'gcstress0x3':
-                case 'gcstress0xc':
-                case 'zapdisable':
-                case 'heapverify1':
-                case 'gcstress0xc_zapdisable':
-                case 'gcstress0xc_zapdisable_jitstress2':
-                case 'gcstress0xc_zapdisable_heapverify1':
-                case 'gcstress0xc_jitstress1':
-                case 'gcstress0xc_jitstress2':
-                case 'gcstress0xc_minopts_heapverify1':
-                    def displayStr = getStressModeDisplayName(scenario)
-                    Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} Build and Test (Jit - ${displayStr})",
-                       "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    break
-                case 'corefx_baseline':
-                case 'corefx_minopts':
-                case 'corefx_jitstress1':
-                case 'corefx_jitstress2':
-                case 'corefx_jitstressregs1':
-                case 'corefx_jitstressregs2':
-                case 'corefx_jitstressregs3':
-                case 'corefx_jitstressregs4':
-                case 'corefx_jitstressregs8':
-                case 'corefx_jitstressregs0x10':
-                case 'corefx_jitstressregs0x80':
-                case 'corefx_jitstressregs0x1000':
-                    def displayName = ('CoreFx ' + getStressModeDisplayName(scenario)).trim()
-                    assert (os == 'Windows_NT')
-                    Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${arch} ${jit} ${configuration} Build and Test (Jit - ${displayName})",
-                       "(?i).*test\\W+${os}\\W+${arch}\\W+${jit}\\W+${configuration}\\W+${scenario}.*")
-                    break
-                case 'illink':
-                    Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} via ILLink", "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}\\W+${scenario}.*")
-                    break
-                default:
-                    println("Unknown scenario: ${os} ${arch} ${jit} ${scenario}");
-                    assert false
-                    break
-            }
-            break
-        // editor brace matching: }
         default:
             println("Unknown architecture: ${architecture}");
             assert false
@@ -1420,19 +1278,11 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
             switch (architecture) {
                 case 'x64':
                 case 'x86':
-                case 'x86compatjit':
                     def arch = architecture
                     def buildOpts = ''
 
-                    // We need to explicitly run build-test.cmd with Exclude for x86compatjit, so skip tests.
-                    if (architecture == 'x86compatjit') {
-                        arch = 'x86'
-                        buildOpts = 'compatjitcrossgen skiptests'
-                    }
-
-                    def illinkArch = (architecture == 'x86compatjit') ? 'x86' : architecture
                     if (scenario == 'illink') {
-                        buildCommands += "tests\\scripts\\build_illink.cmd clone ${illinkArch}"
+                        buildCommands += "tests\\scripts\\build_illink.cmd clone ${arch}"
                     }
 
                     if (Constants.jitStressModeScenarios.containsKey(scenario) ||
@@ -1553,7 +1403,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
 
                         if (scenario == 'illink')
                         {
-                            illinkArguments = "link %WORKSPACE%\\linker\\linker\\bin\\netcore_Relase\\netcoreapp2.0\\win10-${illinkArch}\\publish\\illink.exe"
+                            illinkArguments = "link %WORKSPACE%\\linker\\linker\\bin\\netcore_Release\\netcoreapp2.0\\win10-${arch}\\publish\\illink.exe"
                         }
 
                         runtestArguments = "${lowerConfiguration} ${arch} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${runjitdisasmStr} ${gcTestArguments} ${illinkArguments} collectdumps"
@@ -1581,11 +1431,6 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
                         else if (architecture == 'x64' || architecture == 'x86') {
                             buildCommands += "tests\\runtest.cmd ${runtestArguments}"
                         }
-                        else if (architecture == 'x86compatjit') {
-                            def testEnvLocation = "%WORKSPACE%\\tests\\x86\\compatjit_x86_testenv.cmd"
-                            buildCommands += "build-test.cmd ${runtestArguments}"
-                            buildCommands += "tests\\runtest.cmd ${runtestArguments} TestEnv ${testEnvLocation}"
-                        }
                     }
 
                     if (!enableCorefxTesting) {
@@ -1681,16 +1526,9 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
         case 'RHEL7.2':
         case 'OpenSUSE42.1':
         case 'Tizen':
-        case 'Fedora23': // editor brace matching: {
             switch (architecture) {
                 case 'x64':
                 case 'x86':
-                case 'x86compatjit':
-                    def arch = architecture
-                    if (architecture == 'x86compatjit') {
-                        arch = 'x86'
-                    }
-
                     if (architecture == 'x86' && os == 'Ubuntu') {
                         // build only, not test yet
                         buildCommands += "./tests/scripts/x86_ci_script.sh --buildConfig=${lowerConfiguration}"
@@ -1698,11 +1536,16 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
                     }
 
                     if (scenario == 'formatting') {
-                        buildCommands += "python tests/scripts/format.py -c \${WORKSPACE} -o Linux -a ${arch}"
+                        buildCommands += "python tests/scripts/format.py -c \${WORKSPACE} -o Linux -a ${architecture}"
                         Utilities.addArchival(newJob, "format.patch", "", true, false)
                         break
                     }
 
+                    if (scenario == 'illink') {
+                        assert(os == 'Ubuntu')
+                        buildCommands += "./tests/scripts/build_illink.sh --clone --arch=${architecture}"
+                    }
+
                     def standaloneGc = ''
                     if (scenario == 'standalone_gc') {
                         standaloneGc = 'buildstandalonegc'
@@ -1713,15 +1556,15 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
                         // only on supported OS platforms.
                         if (os == 'FreeBSD')
                         {
-                            buildCommands += "./build.sh skipmscorlib verbose ${lowerConfiguration} ${arch} ${standaloneGc}"
+                            buildCommands += "./build.sh skipmscorlib verbose ${lowerConfiguration} ${architecture} ${standaloneGc}"
                         }
                         else
                         {
                             def bootstrapRid = Utilities.getBoostrapPublishRid(os)
                             def bootstrapRidEnv = bootstrapRid != null ? "__PUBLISH_RID=${bootstrapRid} " : ''
-                            buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${arch} ${standaloneGc}"
+                            buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${architecture} ${standaloneGc}"
                         }
-                        buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${arch}.${configuration} \${WORKSPACE}/bin/paltestout"
+                        buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${architecture}.${configuration} \${WORKSPACE}/bin/paltestout"
 
                         // Set time out
                         setTestJobTimeOut(newJob, scenario)
@@ -1747,7 +1590,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
                         def workspaceRelativeFxRoot = "_/fx"
                         def absoluteFxRoot = "\$WORKSPACE/${workspaceRelativeFxRoot}"
 
-                        buildCommands += "python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${arch} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
+                        buildCommands += "python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
 
                         setTestJobTimeOut(newJob, scenario)
 
@@ -1864,12 +1707,6 @@ combinedScenarios.each { scenario ->
                                 return
                             }
                             break
-                        case 'x86compatjit':
-                            // Skip non-windows
-                            if (os != 'Windows_NT') {
-                                return
-                            }
-                            break
                         case 'x64':
                             // Everything implemented
                             break
@@ -1910,10 +1747,6 @@ combinedScenarios.each { scenario ->
                                 }
                                 // Windows: Everything implemented
                                 break
-                            case 'x86compatjit':
-                                // No stress modes for compatjit.dll.
-                                // (There's no technical reason we couldn't allow these.)
-                                return
                             default:
                                 return
                         }
@@ -2061,10 +1894,10 @@ combinedScenarios.each { scenario ->
                                 }
                                 break
                             case 'illink':
-                                if (os != 'Windows_NT') {
+                                if (os != 'Windows_NT' && (os != 'Ubuntu' || architecture != 'x64')) {
                                     return
                                 }
-                                if (architecture != 'x64' && architecture != 'x86' && architecture != 'x86compatjit') {
+                                if (architecture != 'x64' && architecture != 'x86') {
                                     return
                                 }
                                 if (isBuildOnly) {
@@ -2285,7 +2118,7 @@ combinedScenarios.each { scenario ->
                             case 'formatting':
                                 return
                             case 'illink':
-                                if (os != 'Windows_NT') {
+                                if (os != 'Windows_NT' && os != 'Ubuntu') {
                                     return
                                 }
                                 break
@@ -2358,6 +2191,7 @@ combinedScenarios.each { scenario ->
                     def runjitforcerelocsStr = ''
                     def runjitdisasmStr = ''
                     def gcstressStr = ''
+                    def illinkStr = ''
 
                     if (scenario == 'r2r' ||
                         scenario == 'pri1r2r' ||
@@ -2413,6 +2247,11 @@ combinedScenarios.each { scenario ->
                         runjitdisasmStr = '--jitdisasm --crossgen'
                     }
 
+                    if (scenario == 'illink')
+                    {
+                        illinkStr = '--link=\$WORKSPACE/linker/linker/bin/netcore_Release/netcoreapp2.0/ubuntu-x64/publish/illink'
+                    }
+
                     if (isLongGc(scenario)) {
                         // Long GC tests behave very poorly when they are not
                         // the only test running (many of them allocate until OOM).
@@ -2581,7 +2420,7 @@ combinedScenarios.each { scenario ->
                 --mscorlibDir=\"\${WORKSPACE}/bin/Product/${osGroup}.${architecture}.${configuration}\" \\
                 --coreFxBinDir=\"\${WORKSPACE}/bin/CoreFxBinDir\" \\
                 --limitedDumpGeneration \\
-                ${testEnvOpt} ${serverGCString} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${runjitdisasmStr} ${sequentialString} ${playlistString}""")
+                ${testEnvOpt} ${serverGCString} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${runjitdisasmStr} ${illinkStr} ${sequentialString} ${playlistString}""")
                             }
                         }
                     }
index dff136b..9c4dad0 100644 (file)
@@ -12,7 +12,6 @@ def static getOSGroup(def os) {
         'RHEL7.2': 'Linux',
         'Ubuntu16.04': 'Linux',
         'Debian8.4':'Linux',
-        'Fedora23':'Linux',
         'OSX':'OSX',
         'Windows_NT':'Windows_NT',
         'FreeBSD':'FreeBSD',
index dcc8641..c45358d 100644 (file)
@@ -2,7 +2,7 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <NativeBinary Include="$(BinDir)clrjit.dll" />
-    <NativeBinary Condition="'$(Platform)' == 'x86'" Include="$(BinDir)compatjit.dll" />
+    <NativeBinary Condition="'$(Platform)' == 'x86' and '$(PackageCompatJit)' != ''" Include="$(BinDir)compatjit.dll" />
     <CrossArchitectureSpecificNativeFileAndSymbol Include="$(BinDir)$(CrossTargetComponentFolder)\clrjit.dll" />
 
     <!-- prevent accidental inclusion in AOT projects. -->
index 85e9f5e..db8b031 100644 (file)
@@ -3,10 +3,14 @@
   <PropertyGroup>
     <_PlatformDoesNotSupportNiFiles Condition="'$(Platform)' == 'arm'">true</_PlatformDoesNotSupportNiFiles>
     <_PlatformDoesNotSupportNiFiles Condition="'$(Platform)' == 'armel'">true</_PlatformDoesNotSupportNiFiles>
+    <_PlatformDoesNotSupportNiFiles Condition="'$(Platform)' == 'x86'">true</_PlatformDoesNotSupportNiFiles>
+    <_PlatformDoesNotSupportEventTrace Condition="'$(Platform)' == 'arm'">true</_PlatformDoesNotSupportEventTrace>
+    <_PlatformDoesNotSupportEventTrace Condition="'$(Platform)' == 'armel'">true</_PlatformDoesNotSupportEventTrace>
+    <_PlatformDoesNotSupportEventTrace Condition="'$(Platform)' == 'x86'">true</_PlatformDoesNotSupportEventTrace>
   </PropertyGroup>
   <ItemGroup>
     <NativeBinary Include="$(BinDir)libcoreclr.so" />
-    <NativeBinary Condition="'$(_PlatformDoesNotSupportNiFiles)' != 'true'" Include="$(BinDir)libcoreclrtraceptprovider.so" />
+    <NativeBinary Condition="'$(_PlatformDoesNotSupportEventTrace)' != 'true'" Include="$(BinDir)libcoreclrtraceptprovider.so" />
     <NativeBinary Include="$(BinDir)libdbgshim.so" />
     <NativeBinary Include="$(BinDir)libmscordaccore.so" />
     <NativeBinary Include="$(BinDir)libmscordbi.so" />
index 9c46df9..436901e 100644 (file)
@@ -20,6 +20,7 @@
     <NativeBinary Include="$(BinDir)mscorrc.dll" />
     <NativeBinary Include="$(BinDir)sos.dll" />
     <NativeBinary Include="$(BinDir)System.Private.CoreLib.ni.dll" />
+    <NativeBinary Include="$(UniversalCRTSDKDir)Redist\ucrt\DLLs\$(BuildArch)\*.dll" Condition="'$(BuildType)'=='Release' AND '$(BuildArch)' != 'arm64'" />
     <ArchitectureSpecificLibFile Include="$(BinDir)System.Private.CoreLib.dll" />
     <ArchitectureSpecificLibFile Include="$(BinDir)SOS.NETCore.dll" />
     <ArchitectureSpecificToolFile Include="$(BinDir)crossgen.exe" />
index 6f7bae6..49e550a 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
+
+  <Target Name="VerifyVCRedist" BeforeTargets="GetSymbolPackageFiles" Condition="'$(_runtimeOSFamily)' == 'win'">
+    <Error Condition="'$(UniversalCRTSDKDir)' == ''" Text="Unable to find VC Redist binaries - check that UniversalCRTSDKDir environment variable is set" />
+  </Target>
   <!--
     Finds symbol files and injects them into the package build.
   -->
index 2767d1e..c36d2e1 100644 (file)
@@ -609,8 +609,6 @@ FCIMPL2(VOID, SystemNative::FailFastWithException, StringObject* refMessageUNSAF
 }
 FCIMPLEND
 
-
-
 FCIMPL0(FC_BOOL_RET, SystemNative::IsServerGC)
 {
     FCALL_CONTRACT;
@@ -636,95 +634,6 @@ BOOL QCALLTYPE SystemNative::WinRTSupported()
 
 #endif // FEATURE_COMINTEROP
 
-// Helper method to retrieve OS Version based on the environment.
-BOOL GetOSVersionForEnvironment(LPOSVERSIONINFO lpVersionInformation)
-{
-#ifdef FEATURE_WINDOWSPHONE
-    // Return phone version information if it is available
-    if (!g_fGetPhoneVersionInitialized)
-    {
-        HMODULE hPhoneInfo = WszLoadLibrary(W("phoneinfo.dll"));
-        if(hPhoneInfo != NULL)
-            g_pfnGetPhoneVersion = (pfnGetPhoneVersion)GetProcAddress(hPhoneInfo, "GetPhoneVersion");
-
-        g_fGetPhoneVersionInitialized = true;
-    }
-
-    if (g_pfnGetPhoneVersion!= NULL)
-        return g_pfnGetPhoneVersion(lpVersionInformation);
-#endif // FEATURE_WINDOWSPHONE
-
-    return ::GetOSVersion(lpVersionInformation);
-}
-
-
-/*
- * SystemNative::GetOSVersion - Fcall corresponding to System.Environment.GetVersion
- * It calls clr!GetOSVersion to get the real OS version even when running in 
- * app compat. Calling kernel32!GetVersionEx() directly will be shimmed and will return the
- * fake OS version. In order to avoid this the call to getVersionEx is made via mscoree.dll.
- * Mscoree.dll resides in system32 dir and is never lied about OS version.
- */
-
-FCIMPL1(FC_BOOL_RET, SystemNative::GetOSVersion, OSVERSIONINFOObject *osVer)
-{
-    FCALL_CONTRACT;
-
-    OSVERSIONINFO ver;    
-    ver.dwOSVersionInfoSize = osVer->dwOSVersionInfoSize;
-
-    BOOL ret = GetOSVersionForEnvironment(&ver);
-
-    if(ret)
-    {
-        osVer->dwMajorVersion  = ver.dwMajorVersion;
-        osVer->dwMinorVersion = ver.dwMinorVersion;
-        osVer->dwBuildNumber  = ver.dwBuildNumber;
-        osVer->dwPlatformId = ver.dwPlatformId;
-
-        HELPER_METHOD_FRAME_BEGIN_RET_1(osVer);
-        SetObjectReference((OBJECTREF*)&(osVer->szCSDVersion), StringObject::NewString(ver.szCSDVersion), GetAppDomain());
-        HELPER_METHOD_FRAME_END();
-    }
-
-    FC_RETURN_BOOL(ret);
-}
-FCIMPLEND
-
-/*
- * SystemNative::GetOSVersionEx - Fcall implementation for System.Environment.GetVersionEx
- * Similar as above except this takes OSVERSIONINFOEX structure as input
- */
-
-FCIMPL1(FC_BOOL_RET, SystemNative::GetOSVersionEx, OSVERSIONINFOEXObject *osVer)
-{
-    FCALL_CONTRACT;
-
-    OSVERSIONINFOEX ver;
-    ver.dwOSVersionInfoSize = osVer->dwOSVersionInfoSize;
-
-    BOOL ret = GetOSVersionForEnvironment((OSVERSIONINFO *)&ver);
-
-    if(ret)
-    {
-        osVer->dwMajorVersion  = ver.dwMajorVersion;
-        osVer->dwMinorVersion = ver.dwMinorVersion;
-        osVer->dwBuildNumber  = ver.dwBuildNumber;
-        osVer->dwPlatformId = ver.dwPlatformId;
-        osVer->wServicePackMajor = ver.wServicePackMajor;
-        osVer->wServicePackMinor = ver.wServicePackMinor;
-        osVer->wSuiteMask = ver.wSuiteMask;
-        osVer->wProductType = ver.wProductType;
-        osVer->wReserved = ver.wReserved;
-
-        HELPER_METHOD_FRAME_BEGIN_RET_1(osVer);
-        SetObjectReference((OBJECTREF*)&(osVer->szCSDVersion), StringObject::NewString(ver.szCSDVersion), GetAppDomain());
-        HELPER_METHOD_FRAME_END();
-    }
-
-    FC_RETURN_BOOL(ret);
-}
-FCIMPLEND
 
 
 
index 1da1058..986c55b 100644 (file)
@@ -74,9 +74,6 @@ public:
     static FCDECL0(INT64, __GetSystemTimeAsFileTime);
     static FCDECL0(UINT32, GetCurrentProcessorNumber);
     static FCDECL0(UINT32, GetTickCount);
-    static FCDECL1(FC_BOOL_RET, GetOSVersion, OSVERSIONINFOObject *osVer);
-    static FCDECL1(FC_BOOL_RET, GetOSVersionEx, OSVERSIONINFOEXObject *osVer);
-
 
     static
     void QCALLTYPE Exit(INT32 exitcode);
index 4c32641..b6d49c2 100644 (file)
@@ -4525,10 +4525,6 @@ void CordbProcess::QueueFakeConnectionEvents()
 // from the runtime controller. This represents the last amount of processing
 // the DI gets to do on an event before giving it to the user.
 //
-#ifdef _PREFAST_
-#pragma warning(push)
-#pragma warning(disable:21000) // Suppress PREFast warning about overly large function
-#endif
 void CordbProcess::DispatchRCEvent()
 {
     INTERNAL_API_ENTRY(this);
@@ -4729,6 +4725,10 @@ void CordbProcess::DbgAssertAppDomainDeleted(VMPTR_AppDomain vmAppDomainDeleted)
 //    A V2 shim can provide a proxy calllack that takes these events and queues them and 
 //    does the real dispatch to the user to emulate V2 semantics.
 //
+#ifdef _PREFAST_
+#pragma warning(push)
+#pragma warning(disable:21000) // Suppress PREFast warning about overly large function
+#endif
 void CordbProcess::RawDispatchEvent(
     DebuggerIPCEvent *          pEvent, 
     RSLockHolder *              pLockHolder,
index 8c4dfcc..e7102b0 100644 (file)
@@ -71,6 +71,7 @@ public:
 
     static void HandleFatalError(unsigned int exitCode);
     static bool ShouldFinalizeObjectForUnload(AppDomain* pDomain, Object* obj);
+    static bool EagerFinalized(Object* obj);
 };
 
 #endif // __GCENV_EE_H__
index ab8e56b..aad6ec8 100644 (file)
@@ -36269,16 +36269,11 @@ CFinalize::ScanForFinalization (promote_func* pfn, int gen, BOOL mark_only_p,
 
                     assert (method_table(obj)->HasFinalizer());
 
-#ifndef FEATURE_REDHAWK
-                    if (method_table(obj) == pWeakReferenceMT || method_table(obj)->GetCanonicalMethodTable() == pWeakReferenceOfTCanonMT)
+                    if (GCToEEInterface::EagerFinalized(obj))
                     {
-                        //destruct the handle right there.
-                        FinalizeWeakReference (obj);
                         MoveItem (i, Seg, FreeList);
                     }
-                    else
-#endif //!FEATURE_REDHAWK
-                    if ((obj->GetHeader()->GetBits()) & BIT_SBLK_FINALIZER_RUN)
+                    else if ((obj->GetHeader()->GetBits()) & BIT_SBLK_FINALIZER_RUN)
                     {
                         //remove the object because we don't want to
                         //run the finalizer
index 821b21d..8cd92fd 100644 (file)
@@ -256,12 +256,6 @@ void TouchPages(void * pStart, size_t cb);
 void updateGCShadow(Object** ptr, Object* val);
 #endif
 
-// the method table for the WeakReference class
-extern MethodTable  *pWeakReferenceMT;
-// The canonical method table for WeakReference<T>
-extern MethodTable  *pWeakReferenceOfTCanonMT;
-extern void FinalizeWeakReference(Object * obj);
-
 // The single GC heap instance, shared with the VM.
 extern IGCHeapInternal* g_theGCHeap;
 
index 328acef..13febb5 100644 (file)
@@ -219,6 +219,12 @@ ALWAYS_INLINE bool GCToEEInterface::ShouldFinalizeObjectForUnload(AppDomain* pDo
     return g_theGCToCLR->ShouldFinalizeObjectForUnload(pDomain, obj);
 }
 
+ALWAYS_INLINE bool GCToEEInterface::EagerFinalized(Object* obj)
+{
+    assert(g_theGCToCLR != nullptr);
+    return g_theGCToCLR->EagerFinalized(obj);
+}
+
 #undef ALWAYS_INLINE
 
 #endif // __GCTOENV_EE_STANDALONE_INL__
index 5c595b4..ee1b8ec 100644 (file)
@@ -142,6 +142,15 @@ public:
     // an app domain.
     virtual
     bool ShouldFinalizeObjectForUnload(AppDomain* pDomain, Object* obj) = 0;
+
+    // Offers the EE the option to finalize the given object eagerly, i.e.
+    // not on the finalizer thread but on the current thread. The
+    // EE returns true if it finalized the object eagerly and the GC does not
+    // need to do so, and false if it chose not to eagerly finalize the object
+    // and it's up to the GC to finalize it later.
+    virtual
+    bool EagerFinalized(Object* obj) = 0;
+
 };
 
 #endif // _GCINTERFACE_EE_H_
index aaca51e..392bfa1 100644 (file)
@@ -275,6 +275,12 @@ bool GCToEEInterface::ShouldFinalizeObjectForUnload(AppDomain* pDomain, Object*
     return true;
 }
 
+bool GCToEEInterface::EagerFinalized(Object* obj)
+{
+    // The sample does not finalize anything eagerly.
+    return false;
+}
+
 bool IsGCSpecialThread()
 {
     // TODO: Implement for background GC
index c194def..4b75742 100644 (file)
@@ -751,6 +751,7 @@ typedef enum CorAssemblyFlags
 
     afEnableJITcompileTracking   =  0x8000, // From "DebuggableAttribute".
     afDisableJITcompileOptimizer =  0x4000, // From "DebuggableAttribute".
+    afDebuggableAttributeMask    =  0xc000,
 
     afRetargetable          =   0x0100,     // The assembly can be retargeted (at runtime) to an
                                             //  assembly from a different publisher.
index 00c42ce..cbc4464 100644 (file)
@@ -214,11 +214,11 @@ TODO: Talk about initializing strutures before use
 #endif
 
 // Update this one
-SELECTANY const GUID JITEEVersionIdentifier = { /* 61783541-8fc0-44ce-80f7-7789b93a3309 */
-    0x61783541,
-    0x8fc0,
-    0x44ce,
-    { 0x80, 0xf7, 0x77, 0x89, 0xb9, 0x3a, 0x33, 0x09 }
+SELECTANY const GUID JITEEVersionIdentifier = { /* f00b3f49-ddd2-49be-ba43-6e49ffa66959 */
+    0xf00b3f49,
+    0xddd2,
+    0x49be,
+    { 0xba, 0x43, 0x6e, 0x49, 0xff, 0xa6, 0x69, 0x59 }
 };
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1568,6 +1568,9 @@ enum CorInfoTokenKind
 
     // token comes from CEE_NEWOBJ
     CORINFO_TOKENKIND_NewObj    = 0x200 | CORINFO_TOKENKIND_Method,
+
+    // token comes from CEE_LDVIRTFTN
+    CORINFO_TOKENKIND_Ldvirtftn = 0x400 | CORINFO_TOKENKIND_Method,
 };
 
 struct CORINFO_RESOLVED_TOKEN
index f434fee..e6d067c 100644 (file)
@@ -146,6 +146,8 @@ public:
         CORJIT_FLAG_USE_PINVOKE_HELPERS     = 36, // The JIT should use the PINVOKE_{BEGIN,END} helpers instead of emitting inline transitions
         CORJIT_FLAG_REVERSE_PINVOKE         = 37, // The JIT should insert REVERSE_PINVOKE_{ENTER,EXIT} helpers into method prolog/epilog
         CORJIT_FLAG_DESKTOP_QUIRKS          = 38, // The JIT should generate desktop-quirk-compatible code
+        CORJIT_FLAG_TIER0                   = 39, // This is the initial tier for tiered compilation which should generate code as quickly as possible
+        CORJIT_FLAG_TIER1                   = 40, // This is the final tier (for now) for tiered compilation which should generate high quality code
     };
 
     CORJIT_FLAGS()
index 494ca7c..200c343 100644 (file)
@@ -195,7 +195,7 @@ typedef union _NEON128 {
     struct {
         ULONGLONG Low;
         LONGLONG High;
-    } DUMMYSTRUCTNAME;
+    };
     double D[2];
     float S[4];
     WORD   H[8];
@@ -288,7 +288,7 @@ typedef struct _T_RUNTIME_FUNCTION {
             DWORD CR : 2;
             DWORD FrameSize : 9;
         } PackedUnwindData;
-    } DUMMYUNIONNAME;
+    };
 } T_RUNTIME_FUNCTION, *PT_RUNTIME_FUNCTION;
 
 
index 8ca9587..7d82e86 100644 (file)
@@ -2393,6 +2393,10 @@ typedef DPTR(IMAGE_TLS_DIRECTORY)   PTR_IMAGE_TLS_DIRECTORY;
 #include <xclrdata.h>
 #endif
 
+#if defined(_TARGET_X86_) && defined(FEATURE_PAL)
+typedef DPTR(struct _UNWIND_INFO)      PTR_UNWIND_INFO;
+#endif
+
 #ifdef _WIN64
 typedef DPTR(T_RUNTIME_FUNCTION) PTR_RUNTIME_FUNCTION;
 typedef DPTR(struct _UNWIND_INFO)      PTR_UNWIND_INFO;
index f773a7c..bd5ad1a 100644 (file)
@@ -154,11 +154,6 @@ public:
 
 class Object;
 #if !defined(FEATURE_PAL)
-/******************************/
-/* CLR ETW supported versions */
-/******************************/
-#define ETW_SUPPORTED_MAJORVER 5    // ETW is supported on win2k and above
-#define ETW_ENABLED_MAJORVER 6      // OS versions >= to this we enable ETW registration by default, since on XP and Windows 2003, registration is too slow.
 
 /***************************************/
 /* Tracing levels supported by CLR ETW */
@@ -201,11 +196,6 @@ struct ProfilingScanContext;
 #include <wmistr.h>
 #include <evntrace.h>
 #include <evntprov.h>
-#if !defined(DONOT_DEFINE_ETW_CALLBACK) && !defined(DACCESS_COMPILE)
-#define GetVersionEx(Version) (GetOSVersion((LPOSVERSIONINFOW)Version))
-#else
-#define GetVersionEx(Version) (WszGetVersionEx((LPOSVERSIONINFOW)Version))
-#endif // !DONOT_DEFINE_ETW_CALLBACK && !DACCESS_COMPILE
 #endif //!FEATURE_REDHAWK
 #endif //!defined(FEATURE_PAL)
 
diff --git a/src/inc/legacyactivationshim.h b/src/inc/legacyactivationshim.h
deleted file mode 100644 (file)
index 4d8eaa5..0000000
+++ /dev/null
@@ -1,1382 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// LegacyActivationShim.h
-//
-// This file allows simple migration from .NET Runtime v2 Host Activation APIs
-// to the .NET Runtime v4 Host Activation APIs through simple shim functions.
-
-#ifndef __LEGACYACTIVATIONSHIM_H__
-#define __LEGACYACTIVATIONSHIM_H__
-
-#pragma warning(push)
-#pragma warning(disable:4127) // warning C4127: conditional expression is constant
-                              // caused by IfHrFailRet's while(0) code.
-#pragma warning(disable:4917) // a GUID can only be associated with a class, interface or namespace 
-#pragma warning(disable:4191) // 'reinterpret_cast' : unsafe conversion from 'FARPROC' to 'XXX' 
-
-#ifdef _MANAGED
-// We are compiling Managed C++, switch to native code then (and store current managed/native status on the stack)
-#pragma managed(push, off)
-#endif //_MANAGED
-
-#include "mscoree.h"
-#include "metahost.h"
-
-#include "wchar.h"
-
-#include "corerror.h"
-
-// To minimize how much we perturb sources that we are included in, we make sure that
-// all macros we define/redefine are restored at the end of the header.
-#pragma push_macro("IfHrFailRet")
-#pragma push_macro("IfHrFailRetFALSE")
-#pragma push_macro("IfHrFailRetVOID")
-
-// ---IfHrFailRet------------------------------------------------------------------------------------
-#undef IfHrFailRet
-#undef IfHrFailRetFALSE
-#undef IfHrFailRetVOID
-#define IfHrFailRet(EXPR) do { hr = (EXPR); if(FAILED(hr)) { return (hr); } } while (0)
-#define IfHrFailRetFALSE(EXPR) do { HRESULT _hr_ = (EXPR); if(FAILED(_hr_)) { return false; } } while (0)
-#define IfHrFailRetVOID(EXPR) do { HRESULT _hr_ = (EXPR); if(FAILED(_hr_)) { return; } } while (0)
-
-#include "legacyactivationshimutil.h"
-
-// Use of deprecated APIs within LegacyActivationShim namespace will result in C4996 that we will
-// disable for our own use.
-#pragma warning(push)
-#pragma warning(disable:4996)
-// ---LEGACYACTIVATONSHIM NAMESPACE----------------------------------------------------------------
-namespace LegacyActivationShim
-{
-    // ---HELPERS----------------------------------------------------------------------------------
-#define GET_CLRMETAHOST(x) \
-    ICLRMetaHost *x = NULL; \
-    IfHrFailRet(Util::GetCLRMetaHost(&x))
-
-#define GET_CLRMETAHOSTPOLICY(x) \
-    ICLRMetaHostPolicy*x = NULL; \
-    IfHrFailRet(Util::GetCLRMetaHostPolicy(&x))
-
-#define GET_CLRINFO(x) \
-    ICLRRuntimeInfo *x = NULL; \
-    IfHrFailRet(Util::GetCLRRuntimeInfo(&x))
-
-#define LEGACY_API_PASS_THROUGH_STATIC(_name, _ret_type, _ret_value, _sig, _args)       \
-    {                                                                                   \
-        hr = S_OK;                                                                      \
-        _ret_value = ::_name _args;                                                     \
-    }
-
-#define LEGACY_API_PASS_THROUGH_STATIC_VOIDRET(_name, _sig, _args)                      \
-    {                                                                                   \
-        ::_name _args;                                                                  \
-    }
-
-#define LEGACY_API_PASS_THROUGH_DELAYLOAD(_name, _ret_type, _ret_value, _sig, _args)    \
-    {                                                                                   \
-        typedef _ret_type __stdcall t_FN _sig;                                          \
-        Util::MscoreeFunctor<t_FN> FN;                                                  \
-        if (SUCCEEDED(hr = FN.Init(#_name))) {                                          \
-            _ret_value = FN()_args;                                                     \
-        }                                                                               \
-    }
-
-#define LEGACY_API_PASS_THROUGH_DELAYLOAD_VOIDRET(_name, _sig, _args)                   \
-    {                                                                                   \
-        typedef void __stdcall t_FN _sig;                                               \
-        Util::MscoreeFunctor<t_FN> FN;                                                  \
-        if (SUCCEEDED(FN.Init(#_name))) {                                          \
-            FN()_args;                                                                  \
-        }                                                                               \
-    }
-
-#ifndef LEGACY_ACTIVATION_SHIM_DELAY_LOAD
-#define CALL_LEGACY_API(_name, _sig, _args)                                             \
-    LEGACY_API_PASS_THROUGH_STATIC(_name, HRESULT, hr, _sig, _args)
-#define CALL_LEGACY_API_VOIDRET(_name, _sig, _args)                                     \
-    LEGACY_API_PASS_THROUGH_STATIC_VOIDRET(_name, _sig, _args)
-#else
-#define CALL_LEGACY_API(_name, _sig, _args)                                             \
-    LEGACY_API_PASS_THROUGH_DELAYLOAD(_name, HRESULT, hr, _sig, _args)
-#define CALL_LEGACY_API_VOIDRET(_name, _sig, _args)                                     \
-    LEGACY_API_PASS_THROUGH_DELAYLOAD_VOIDRET(_name, _sig, _args)
-#endif
-
-    // ---LEGACY SHIM FUNCTIONS--------------------------------------------------------------------
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetCORSystemDirectory(
-        __out_ecount(cchBuffer) LPWSTR pBuffer, 
-        __in  DWORD  cchBuffer, 
-        __out DWORD *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            DWORD dwLengthDummy = cchBuffer;
-            if (pdwLength == NULL)
-                pdwLength = &dwLengthDummy;
-            else
-                *pdwLength = cchBuffer;
-
-            GET_CLRINFO(pInfo);
-            IfHrFailRet(pInfo->GetRuntimeDirectory(pBuffer, pdwLength));
-        }
-        else
-        {
-            CALL_LEGACY_API(GetCORSystemDirectory,
-                            (LPWSTR pBuffer, 
-                             DWORD  cchBuffer, 
-                             DWORD *pdwLength),
-                            (pBuffer,
-                             cchBuffer,
-                             pdwLength));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetCORVersion(
-        __out_ecount(cchBuffer) LPWSTR pbBuffer, 
-        __in  DWORD  cchBuffer, 
-        __out DWORD *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            DWORD dwLengthDummy = cchBuffer;
-            if (pdwLength == NULL)
-                pdwLength = &dwLengthDummy;
-            else
-                *pdwLength = cchBuffer;
-
-            GET_CLRINFO(pInfo);
-            IfHrFailRet(pInfo->GetVersionString(pbBuffer, pdwLength));
-        }
-        else
-        {
-            CALL_LEGACY_API(GetCORVersion,
-                            (LPWSTR pbBuffer,
-                             DWORD  cchBuffer,
-                             DWORD *pdwLength),
-                            (pbBuffer,
-                             cchBuffer,
-                             pdwLength));
-                            
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetFileVersion(
-        __in  LPCWSTR szFileName, 
-        __out_ecount(cchBuffer) LPWSTR  szBuffer, 
-        __in  DWORD   cchBuffer, 
-        __out DWORD  *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            DWORD dwLengthDummy = cchBuffer;
-            if (pdwLength == NULL)
-                pdwLength = &dwLengthDummy;
-            else
-                *pdwLength = cchBuffer;
-
-            GET_CLRMETAHOST(pMH);
-            IfHrFailRet(pMH->GetVersionFromFile(szFileName, szBuffer, pdwLength));
-        }
-        else
-        {
-            CALL_LEGACY_API(GetFileVersion,
-                            (LPCWSTR szFileName, 
-                             LPWSTR  szBuffer, 
-                             DWORD   cchBuffer, 
-                             DWORD  *pdwLength),
-                            (szFileName,
-                             szBuffer,
-                             cchBuffer,
-                             pdwLength));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetCORRequiredVersion(
-        __out_ecount(cchBuffer) LPWSTR pBuffer, 
-        __in  DWORD  cchBuffer, 
-        __out DWORD *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            DWORD dwLengthDummy = cchBuffer;
-            if (pdwLength == NULL)
-                pdwLength = &dwLengthDummy;
-            else
-                *pdwLength = cchBuffer;
-
-            IfHrFailRet(Util::GetConfigImageVersion(pBuffer, pdwLength));
-        }
-        else
-        {
-            CALL_LEGACY_API(GetCORRequiredVersion,
-                            (LPWSTR pBuffer, 
-                             DWORD  cchBuffer, 
-                             DWORD *pdwLength),
-                            (pBuffer,
-                             cchBuffer,
-                             pdwLength));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // This API is the one exception that we don't have fully equivalent functionality for
-    // in the new APIs. Specifically, we do not have the runtimeInfoFlags equivalent that
-    // allows platform differentiation. As such, we just send the call to the legacy API,
-    // which does not bind (thankfully) and so we do not cap this specific API to Whidbey.
-    inline
-    HRESULT GetRequestedRuntimeInfo(
-        __in_opt  LPCWSTR pExe,
-        __in_opt  LPCWSTR pwszVersion,
-        __in_opt  LPCWSTR pConfigurationFile,
-        __in  DWORD startupFlags,
-        __in  DWORD runtimeInfoFlags,
-        __out_ecount(dwDirectory) LPWSTR pDirectory,
-        __in  DWORD dwDirectory,
-        __out DWORD  *pdwDirectoryLength, 
-        __out_ecount(cchBuffer) LPWSTR pVersion,
-        __in  DWORD cchBuffer,
-        __out DWORD  *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        CALL_LEGACY_API(GetRequestedRuntimeInfo,
-                        (LPCWSTR  pExe, 
-                         LPCWSTR  pwszVersion, 
-                         LPCWSTR  pConfigurationFile, 
-                         DWORD    startupFlags, 
-                         DWORD    runtimeInfoFlags, 
-                         LPWSTR   pDirectory, 
-                         DWORD    dwDirectory, 
-                         DWORD   *pdwDirectoryLength, 
-                         LPWSTR   pVersion, 
-                         DWORD    cchBuffer, 
-                         DWORD   *pdwLength),
-                        (pExe,
-                         pwszVersion,
-                         pConfigurationFile,
-                         startupFlags,
-                         runtimeInfoFlags,
-                         pDirectory,
-                         dwDirectory,
-                         pdwDirectoryLength, 
-                         pVersion,
-                         cchBuffer,
-                         pdwLength));
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetRequestedRuntimeVersion(
-        __in  LPWSTR pExe,
-        __out_ecount(cchBuffer) LPWSTR pVersion,
-        __in  DWORD cchBuffer,
-        __out DWORD *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            DWORD dwLengthDummy = cchBuffer;
-            if (pdwLength == NULL)
-                pdwLength = &dwLengthDummy;
-            else
-                *pdwLength = cchBuffer;
-
-            GET_CLRMETAHOSTPOLICY(pMHP);
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(pMHP->GetRequestedRuntime(
-                METAHOST_POLICY_USE_PROCESS_IMAGE_PATH,
-                pExe,
-                NULL, // config stream
-                pVersion,
-                pdwLength, 
-                NULL, // image version str
-                NULL, // image version len
-                NULL,
-                IID_ICLRRuntimeInfo,
-                reinterpret_cast<LPVOID*>(&pInfo)));// ppRuntime
-            Util::ReleaseHolder<ICLRRuntimeInfo*> hInfo(pInfo);
-        }
-        else
-        {
-            CALL_LEGACY_API(GetRequestedRuntimeVersion,
-                            (LPWSTR pExe,
-                             LPWSTR pVersion,
-                             DWORD cchBuffer,
-                             DWORD *pdwLength),
-                            (pExe,
-                             pVersion,
-                             cchBuffer,
-                             pdwLength));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CorBindToRuntimeHost(
-        LPCWSTR pwszVersion,
-        LPCWSTR pwszBuildFlavor,
-        LPCWSTR pwszHostConfigFile,
-        VOID* pReserved,
-        DWORD startupFlags,
-        REFCLSID rclsid,
-        REFIID riid,
-        LPVOID FAR *ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            IStream *pConfigStream = NULL;
-            Util::ReleaseHolder<IStream*> hConfigStream;
-            if (pwszHostConfigFile != NULL)
-            {
-                IfHrFailRet(Util::CreateIStreamFromFile(pwszHostConfigFile, &pConfigStream));
-                hConfigStream.Assign(pConfigStream);
-            }
-
-            WCHAR wszVersionLocal[512];
-            DWORD cchVersionLocal = 512;
-            if (pwszVersion != NULL)
-                wcsncpy_s(&wszVersionLocal[0], cchVersionLocal, pwszVersion, _TRUNCATE);
-
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(Util::GetCLRRuntimeInfo(
-                &pInfo,
-                NULL,
-                pConfigStream,
-                pwszVersion == NULL ? NULL : &wszVersionLocal[0],
-                pwszVersion == NULL ? NULL : &cchVersionLocal));
-
-            // We're intentionally ignoring the HRESULT return value, since CorBindToRuntimeEx
-            // always ignored these flags when a runtime had already been bound, and we need
-            // to emulate that behavior for when multiple calls to CorBindToRuntimeEx are made
-            // but with different startup flags (ICLRRuntimeInfo::SetDefaultStartupFlags will
-            // return E_INVALIDARG in the case that the runtime has already been started with
-            // different flags).
-            Util::AddStartupFlags(pInfo, pwszBuildFlavor, startupFlags, pwszHostConfigFile);
-
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(CorBindToRuntimeHost,
-                            (LPCWSTR pwszVersion,
-                             LPCWSTR pwszBuildFlavor,
-                             LPCWSTR pwszHostConfigFile,
-                             VOID* pReserved,
-                             DWORD startupFlags,
-                             REFCLSID rclsid,
-                             REFIID riid,
-                             LPVOID FAR *ppv),
-                            (pwszVersion,
-                             pwszBuildFlavor,
-                             pwszHostConfigFile,
-                             pReserved,
-                             startupFlags,
-                             rclsid,
-                             riid,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CorBindToRuntimeEx(
-        LPCWSTR pwszVersion,
-        LPCWSTR pwszBuildFlavor,
-        DWORD startupFlags,
-        REFCLSID rclsid,
-        REFIID riid,
-        LPVOID* ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            WCHAR wszVersionLocal[512];
-            DWORD cchVersionLocal = 512;
-            if (pwszVersion != NULL)
-                wcsncpy_s(&wszVersionLocal[0], cchVersionLocal, pwszVersion, _TRUNCATE);
-
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(Util::GetCLRRuntimeInfo(
-                &pInfo,
-                NULL, // exe path
-                NULL, // config stream
-                pwszVersion == NULL ? NULL : &wszVersionLocal[0],
-                pwszVersion == NULL ? NULL : &cchVersionLocal));
-
-            // We're intentionally ignoring the HRESULT return value, since CorBindToRuntimeEx
-            // always ignored these flags when a runtime had already been bound, and we need
-            // to emulate that behavior for when multiple calls to CorBindToRuntimeEx are made
-            // but with different startup flags (ICLRRuntimeInfo::SetDefaultStartupFlags will
-            // return E_INVALIDARG in the case that the runtime has already been started with
-            // different flags).
-            Util::AddStartupFlags(pInfo, pwszBuildFlavor, startupFlags, NULL);
-
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(CorBindToRuntimeEx,
-                            (LPCWSTR pwszVersion,
-                             LPCWSTR pwszBuildFlavor,
-                             DWORD startupFlags,
-                             REFCLSID rclsid,
-                             REFIID riid,
-                             LPVOID* ppv),
-                            (pwszVersion,
-                             pwszBuildFlavor,
-                             startupFlags,
-                             rclsid,
-                             riid,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CorBindToRuntimeByCfg(
-        IStream* pCfgStream,
-        DWORD reserved,
-        DWORD startupFlags,
-        REFCLSID rclsid,
-        REFIID riid,
-        LPVOID* ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            // The legacy CorBindToRuntimeByCfg picks up startup flags from both the config stream and
-            // application config file if it is present. For simplicity, we ignore the app config here.
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(Util::GetCLRRuntimeInfo(
-                &pInfo,
-                NULL, // exe path
-                pCfgStream));
-
-            // We're intentionally ignoring the HRESULT return value, since CorBindToRuntimeEx
-            // always ignored these flags when a runtime had already been bound, and we need
-            // to emulate that behavior for when multiple calls to CorBindToRuntimeEx are made
-            // but with different startup flags (ICLRRuntimeInfo::SetDefaultStartupFlags will
-            // return E_INVALIDARG in the case that the runtime has already been started with
-            // different flags).
-            Util::AddStartupFlags(pInfo, NULL, startupFlags, NULL);
-
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(CorBindToRuntimeByCfg,
-                            (IStream* pCfgStream,
-                             DWORD reserved,
-                             DWORD startupFlags,
-                             REFCLSID rclsid,
-                             REFIID riid,
-                             LPVOID* ppv),
-                            (pCfgStream,
-                             reserved,
-                             startupFlags,
-                             rclsid,
-                             riid,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CorBindToRuntime(
-        LPCWSTR pwszVersion,
-        LPCWSTR pwszBuildFlavor,
-        REFCLSID rclsid,
-        REFIID riid,
-        LPVOID* ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            WCHAR wszVersionLocal[512];
-            DWORD cchVersionLocal = 512;
-            if (pwszVersion != NULL)
-                wcsncpy_s(&wszVersionLocal[0], cchVersionLocal, pwszVersion, _TRUNCATE);
-
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(Util::GetCLRRuntimeInfo(
-                &pInfo,
-                NULL, // exe path
-                NULL, // config stream
-                pwszVersion == NULL ? NULL : &wszVersionLocal[0],
-                pwszVersion == NULL ? NULL : &cchVersionLocal));
-
-            // CorBindToRuntime has its special default flags
-            //
-            // We're intentionally ignoring the HRESULT return value, since CorBindToRuntimeEx
-            // always ignored these flags when a runtime had already been bound, and we need
-            // to emulate that behavior for when multiple calls to CorBindToRuntimeEx are made
-            // but with different startup flags (ICLRRuntimeInfo::SetDefaultStartupFlags will
-            // return E_INVALIDARG in the case that the runtime has already been started with
-            // different flags).
-            Util::AddStartupFlags(pInfo, NULL, STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST, NULL);
-
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(CorBindToRuntime,
-                            (LPCWSTR pwszVersion,
-                             LPCWSTR pwszBuildFlavor,
-                             REFCLSID rclsid,
-                             REFIID riid,
-                             LPVOID* ppv),
-                            (pwszVersion,
-                             pwszBuildFlavor,
-                             rclsid,
-                             riid,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CorBindToCurrentRuntime(
-        LPCWSTR pwszFileName,
-        REFCLSID rclsid,
-        REFIID riid,
-        LPVOID FAR *ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRet(Util::GetCLRRuntimeInfo(
-                &pInfo,
-                pwszFileName));
-
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(CorBindToCurrentRuntime,
-                            (LPCWSTR pwszFileName,
-                             REFCLSID rclsid,
-                             REFIID riid,
-                             LPVOID FAR *ppv),
-                            (pwszFileName,
-                             rclsid,
-                             riid,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT ClrCreateManagedInstance(
-        LPCWSTR pTypeName,
-        REFIID riid,
-        void **ppObject)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            HRESULT (STDMETHODCALLTYPE *pfnClrCreateManagedInstance)(LPCWSTR typeName, REFIID riid, void ** ppv) = NULL;
-            IfHrFailRet(pInfo->GetProcAddress("ClrCreateManagedInstance", (LPVOID *)&pfnClrCreateManagedInstance));
-            IfHrFailRet(pfnClrCreateManagedInstance(pTypeName, riid, ppObject));
-        }
-        else
-        {
-            CALL_LEGACY_API(ClrCreateManagedInstance,
-                            (LPCWSTR pTypeName,
-                             REFIID riid,
-                             void **ppObject),
-                            (pTypeName,
-                             riid,
-                             ppObject));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT LoadLibraryShim(
-        LPCWSTR szDllName,
-        LPCWSTR szVersion,
-        LPVOID pvReserved,
-        HMODULE *phModDll)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            Util::ReleaseHolder<ICLRRuntimeInfo*> hInfo;
-            ICLRRuntimeInfo *pInfo = NULL;
-
-            // Semantics of LoadLibraryShim is that a non-null version must match exactly.
-            if (szVersion != NULL)
-            {
-                GET_CLRMETAHOST(pMH);
-                IfHrFailRet(pMH->GetRuntime(szVersion, IID_ICLRRuntimeInfo, reinterpret_cast<LPVOID*>(&pInfo)));
-                hInfo.Assign(pInfo);
-            }
-            else
-            {
-                IfHrFailRet(Util::GetCLRRuntimeInfo(&pInfo));
-            }
-            IfHrFailRet(pInfo->LoadLibrary(szDllName, phModDll));
-        }
-        else
-        {
-            CALL_LEGACY_API(LoadLibraryShim,
-                            (LPCWSTR szDllName,
-                             LPCWSTR szVersion,
-                             LPVOID pvReserved,
-                             HMODULE *phModDll),
-                            (szDllName,
-                             szVersion,
-                             pvReserved,
-                             phModDll));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CallFunctionShim(
-        LPCWSTR szDllName,
-        LPCSTR szFunctionName,
-        LPVOID lpvArgument1,
-        LPVOID lpvArgument2,
-        LPCWSTR szVersion,
-        LPVOID pvReserved)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            HMODULE hMod = NULL;
-            HRESULT (__stdcall * pfn)(LPVOID,LPVOID) = NULL;
-
-            // Load library
-            IfHrFailRet(LegacyActivationShim::LoadLibraryShim(szDllName, szVersion, pvReserved, &hMod));
-
-            // NOTE: Legacy CallFunctionShim does not release HMODULE, leak to maintain compat
-            // Util::HMODULEHolder hModHolder(hMod);
-            
-            // Find function.
-            pfn = (HRESULT (__stdcall *)(LPVOID,LPVOID))GetProcAddress(hMod, szFunctionName);
-            if (pfn == NULL)
-                return HRESULT_FROM_WIN32(GetLastError());
-            
-            // Call it.
-            return pfn(lpvArgument1, lpvArgument2);
-        }
-        else
-        {
-            CALL_LEGACY_API(CallFunctionShim,
-                            (LPCWSTR szDllName,
-                             LPCSTR szFunctionName,
-                             LPVOID lpvArgument1,
-                             LPVOID lpvArgument2,
-                             LPCWSTR szVersion,
-                             LPVOID pvReserved),
-                            (szDllName,
-                             szFunctionName,
-                             lpvArgument1,
-                             lpvArgument2,
-                             szVersion,
-                             pvReserved));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetRealProcAddress(
-        LPCSTR pwszProcName, 
-        VOID **ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            IfHrFailRet(pInfo->GetProcAddress(pwszProcName, ppv));
-        }
-        else
-        {
-            CALL_LEGACY_API(GetRealProcAddress,
-                            (LPCSTR pwszProcName, 
-                             VOID **ppv),
-                            (pwszProcName,
-                             ppv));
-        }
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    void CorExitProcess(
-        int exitCode)
-    {
-#ifndef LEGACY_ACTIVATION_SHIM_DELAY_LOAD
-        ::CorExitProcess(exitCode);
-#else
-        typedef void __stdcall t_CorExitProcess(
-            int exitCode);
-
-        Util::MscoreeFunctor<t_CorExitProcess> FN;
-        if (FAILED(FN.Init("CorExitProcess")))
-            return;
-
-        FN()(exitCode);
-#endif
-    }
-
-// Define this method only if it is not yet defined as macro (see ndp\clr\src\inc\UtilCode.h).
-#ifndef LoadStringRC
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT LoadStringRC(
-        UINT   nResourceID, 
-        __out_ecount(nMax) LPWSTR szBuffer,
-        int    nMax, 
-        int    fQuiet)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            DWORD cchMax = static_cast<DWORD>(nMax);
-            IfHrFailRet(pInfo->LoadErrorString(nResourceID, szBuffer, &cchMax, -1));
-        }
-        else
-        {
-            CALL_LEGACY_API(LoadStringRC,
-                            (UINT   nResourceID, 
-                             LPWSTR szBuffer,
-                             int    nMax, 
-                             int    fQuiet),
-                            (nResourceID,
-                             szBuffer,
-                             nMax,
-                             fQuiet));
-        }
-
-        return hr;
-    }
-#endif //LoadStringRC
-
-// Define this method only if it is not yet defined as macro (see ndp\clr\src\inc\UtilCode.h).
-#if !defined(LoadStringRCEx) && !defined(FEATURE_CORESYSTEM)
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT LoadStringRCEx(
-        LCID lcid,
-        UINT   nResourceID, 
-        __out_ecount(nMax) LPWSTR szBuffer,
-        int    nMax, 
-        int    fQuiet, 
-        int *pcwchUsed)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            DWORD cchUsed = static_cast<DWORD>(nMax);
-            IfHrFailRet(pInfo->LoadErrorString(nResourceID, szBuffer, &cchUsed, lcid));
-            *pcwchUsed = cchUsed;
-        }
-        else
-        {
-            CALL_LEGACY_API(LoadStringRCEx,
-                            (LCID lcid,
-                             UINT   nResourceID, 
-                             LPWSTR szBuffer,
-                             int    nMax, 
-                             int    fQuiet, 
-                             int *pcwchUsed),
-                            (lcid,
-                             nResourceID,
-                             szBuffer,
-                             nMax,
-                             fQuiet,
-                             pcwchUsed));
-        }
-
-        return hr;
-    }
-#endif //LoadStringRCEx
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT LockClrVersion(
-        FLockClrVersionCallback hostCallback,
-        FLockClrVersionCallback *pBeginHostSetup,
-        FLockClrVersionCallback *pEndHostSetup)
-    {
-        HRESULT hr = S_OK;
-
-        CALL_LEGACY_API(LockClrVersion,
-                        (FLockClrVersionCallback hostCallback,
-                         FLockClrVersionCallback *pBeginHostSetup,
-                         FLockClrVersionCallback *pEndHostSetup),
-                        (hostCallback,
-                         pBeginHostSetup,
-                         pEndHostSetup));
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT CreateDebuggingInterfaceFromVersion(
-        int        nDebuggerVersion, 
-        LPCWSTR szDebuggeeVersion,
-        IUnknown ** ppCordb)
-    {
-        HRESULT hr = S_OK;
-
-        CALL_LEGACY_API(CreateDebuggingInterfaceFromVersion,
-                        (int        nDebuggerVersion, 
-                         LPCWSTR szDebuggeeVersion,
-                         IUnknown ** ppCordb),
-                        (nDebuggerVersion,
-                         szDebuggeeVersion,
-                         ppCordb));
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-    inline
-    HRESULT GetVersionFromProcess(
-        __in  HANDLE hProcess,
-        __out_ecount(cchBuffer) LPWSTR pVersion,
-        __in  DWORD cchBuffer,
-        __out DWORD *pdwLength)
-    {
-        HRESULT hr = S_OK;
-
-        CALL_LEGACY_API(GetVersionFromProcess,
-                        (HANDLE hProcess,
-                         LPWSTR pVersion,
-                         DWORD cchBuffer,
-                         DWORD *pdwLength),
-                        (hProcess,
-                         pVersion,
-                         cchBuffer,
-                         pdwLength));
-
-        return hr;
-    }
-
-    // --------------------------------------------------------------------------------------------
-// CoInitializeEE is declared in cor.h, define it only if explicitly requested
-#ifdef LEGACY_ACTIVATION_SHIM_DEFINE_CoInitializeEE
-    inline 
-    HRESULT CoInitializeEE(DWORD flags)
-    {
-        HRESULT hr = S_OK;
-        
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            HRESULT (* pfnCoInitializeEE)(DWORD);
-            IfHrFailRet(pInfo->GetProcAddress("CoInitializeEE", (LPVOID *)&pfnCoInitializeEE));
-            return (*pfnCoInitializeEE)(flags);
-        }
-        else
-        {
-            CALL_LEGACY_API(CoInitializeEE,
-                            (DWORD flags),
-                            (flags));
-        }
-        
-        return hr;
-    }
-
-    inline 
-    VOID CoUninitializeEE(BOOL flags)
-    {
-        if (Util::HasNewActivationAPIs())
-        {
-            ICLRRuntimeInfo *pInfo = NULL;
-            if (FAILED(Util::GetCLRRuntimeInfo(&pInfo)))
-                return;
-
-            VOID (* pfnCoUninitializeEE)(BOOL);
-            if (FAILED(pInfo->GetProcAddress("CoUninitializeEE", (LPVOID *)&pfnCoUninitializeEE)))
-                return;
-
-            (*pfnCoUninitializeEE)(flags);
-        }
-        else
-        {
-            CALL_LEGACY_API_VOIDRET(CoUninitializeEE,
-                                    (BOOL flags),
-                                    (flags));
-        }
-    }
-
-    inline 
-    HRESULT CoInitializeCor(DWORD flags)
-    {
-        HRESULT hr = S_OK;
-        
-        if (Util::HasNewActivationAPIs())
-        {
-            GET_CLRINFO(pInfo);
-            HRESULT (* pfnCoInitializeCor)(DWORD);
-            IfHrFailRet(pInfo->GetProcAddress("CoInitializeCor", (LPVOID *)&pfnCoInitializeCor));
-            return (*pfnCoInitializeCor)(flags);
-        }
-        else
-        {
-            CALL_LEGACY_API(CoInitializeCor,
-                            (DWORD flags),
-                            (flags));
-        }
-        
-        return hr;
-    }
-
-    inline 
-    VOID CoUninitializeCor()
-    {
-        if (Util::HasNewActivationAPIs())
-        {
-            ICLRRuntimeInfo *pInfo = NULL;
-            if (FAILED(Util::GetCLRRuntimeInfo(&pInfo)))
-                return;
-
-            VOID (* pfnCoUninitializeCor)();
-            if (FAILED(pInfo->GetProcAddress("CoUninitializeCor", (LPVOID *)&pfnCoUninitializeCor)))
-                return;
-
-            (*pfnCoUninitializeCor)();
-        }
-        else
-        {
-            CALL_LEGACY_API_VOIDRET(CoUninitializeCor,
-                                    (VOID),
-                                    ());
-        }
-    }
-
-#endif //LEGACY_ACTIVATION_SHIM_DEFINE_CoInitializeEE
-    
-    // --------------------------------------------------------------------------------------------
-// CoEEShutDownCOM is declared in cor.h, define it only if explicitly requested
-#ifdef LEGACY_ACTIVATION_SHIM_DEFINE_CoEEShutDownCOM
-    inline 
-    void CoEEShutDownCOM()
-    {
-        if (Util::HasNewActivationAPIs())
-        {
-            ICLRRuntimeInfo *pInfo = NULL;
-            IfHrFailRetVOID(Util::GetCLRRuntimeInfo(&pInfo));
-            void (* pfnCoEEShutDownCOM)();
-            IfHrFailRetVOID(pInfo->GetProcAddress("CoEEShutDownCOM", (LPVOID *)&pfnCoEEShutDownCOM));
-            (*pfnCoEEShutDownCOM)();
-        }
-        else
-        {
-            CALL_LEGACY_API_VOIDRET(CoEEShutDownCOM, 
-                            (), 
-                            ());
-        }
-        
-        return;
-    }
-#endif //LEGACY_ACTIVATION_SHIM_DEFINE_CoEEShutDownCOM
-    
-    // ---StrongName Function Helpers--------------------------------------------------------------
-#if !defined(LEGACY_ACTIVATION_SHIM_DELAY_LOAD) && defined(__STRONG_NAME_H)
-#define LEGACY_STRONGNAME_API_PASS_THROUGH(_name, _ret_type, _ret_value, _sig, _args)   \
-    LEGACY_API_PASS_THROUGH_STATIC(_name, _ret_type, _ret_value, _sig, _args)
-#define LEGACY_STRONGNAME_API_PASS_THROUGH_VOIDRET(_name, _sig, _args)   \
-    LEGACY_API_PASS_THROUGH_STATIC_VOIDRET(_name, _sig, _args)
-#else //defined(LEGACY_ACTIVATION_SHIM_DELAY_LOAD) || !defined(__STRONG_NAME_H)
-#define LEGACY_STRONGNAME_API_PASS_THROUGH(_name, _ret_type, _ret_value, _sig, _args)   \
-    LEGACY_API_PASS_THROUGH_DELAYLOAD(_name, _ret_type, _ret_value, _sig, _args)
-#define LEGACY_STRONGNAME_API_PASS_THROUGH_VOIDRET(_name, _sig, _args)   \
-    LEGACY_API_PASS_THROUGH_DELAYLOAD_VOIDRET(_name, _sig, _args)
-#endif //defined(LEGACY_ACTIVATION_SHIM_DELAY_LOAD) || !defined(__STRONG_NAME_H)
-
-// Defines a method that just delegates a call to the right runtime, this one is for SN APIs that 
-// return HRESULT.
-#define PASS_THROUGH_IMPL_HRESULT(_name, _signature, _args)     \
-    inline                                                      \
-    HRESULT _name##_signature                                   \
-    {                                                           \
-        HRESULT hr = S_OK;                                      \
-        if (Util::HasNewActivationAPIs())                       \
-        {                                                       \
-            ICLRStrongName *pSN = NULL;                         \
-            IfHrFailRet(Util::GetCLRStrongName(&pSN));          \
-            IfHrFailRet(pSN->_name _args);                      \
-        }                                                       \
-        else                                                    \
-        {                                                       \
-            LEGACY_STRONGNAME_API_PASS_THROUGH(                 \
-                _name, HRESULT, hr, _signature, _args);         \
-            IfHrFailRet(hr);                                    \
-        }                                                       \
-        return hr;                                              \
-    }
-
-// Defines a method that just delegates a call to the right runtime, this one is for SN APIs that 
-// return BOOL.
-#define PASS_THROUGH_IMPL_BOOLEAN(_name, _signature, _args)     \
-    inline                                                      \
-    BOOL _name##_signature                                      \
-    {                                                           \
-        HRESULT hr = S_OK;                                      \
-        if (Util::HasNewActivationAPIs())                       \
-        {                                                       \
-            ICLRStrongName *pSN = NULL;                         \
-            IfHrFailRetFALSE(Util::GetCLRStrongName(&pSN));     \
-            IfHrFailRetFALSE(pSN->_name _args);                 \
-            return TRUE;                                        \
-        }                                                       \
-        else                                                    \
-        {                                                       \
-            BOOL fResult = TRUE;                                \
-            LEGACY_STRONGNAME_API_PASS_THROUGH(                 \
-                _name, BOOL, fResult, _signature, _args);       \
-            IfHrFailRetFALSE(hr);                               \
-            return fResult;                                     \
-        }                                                       \
-    }
-
-// Defines a method that just delegates a call to the right runtime, this one is for SN APIs that 
-// return VOID.
-#define PASS_THROUGH_IMPL_VOID(_name, _signature, _args)        \
-    inline                                                      \
-    VOID _name##_signature                                      \
-    {                                                           \
-        HRESULT hr = S_OK;                                      \
-        if (Util::HasNewActivationAPIs())                       \
-        {                                                       \
-            ICLRStrongName *pSN = NULL;                         \
-            IfHrFailRetVOID(Util::GetCLRStrongName(&pSN));      \
-            IfHrFailRetVOID(pSN->_name _args);                  \
-            return;                                             \
-        }                                                       \
-        else                                                    \
-        {                                                       \
-            LEGACY_STRONGNAME_API_PASS_THROUGH_VOIDRET(         \
-                _name, _signature, _args);                      \
-            IfHrFailRetVOID(hr);                                \
-            return;                                             \
-        }                                                       \
-    }
-
-    // ---StrongName functions---------------------------------------------------------------------
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromAssemblyFile,
-                         (LPCSTR pszFilePath, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (pszFilePath, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromAssemblyFileW,
-                         (LPCWSTR pwzFilePath, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (pwzFilePath, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromBlob,
-                         (BYTE *pbBlob, DWORD cchBlob, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (pbBlob, cchBlob, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromFile,
-                         (LPCSTR pszFilePath, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (pszFilePath, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromFileW,
-                         (LPCWSTR pwzFilePath, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (pwzFilePath, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_HRESULT(GetHashFromHandle,
-                         (HANDLE hFile, unsigned int *piHashAlg, BYTE *pbHash, DWORD cchHash, DWORD *pchHash),
-                         (hFile, piHashAlg, pbHash, cchHash, pchHash));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameCompareAssemblies,
-                         (LPCWSTR pwzAssembly1, LPCWSTR pwzAssembly2, DWORD *pdwResult),
-                         (pwzAssembly1, pwzAssembly2, pdwResult));
-
-PASS_THROUGH_IMPL_VOID(StrongNameFreeBuffer,
-                      (BYTE *pbMemory),
-                      (pbMemory));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameGetBlob,
-                         (LPCWSTR pwzFilePath, BYTE *pbBlob, DWORD *pcbBlob),
-                         (pwzFilePath, pbBlob, pcbBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameGetBlobFromImage,
-                         (BYTE *pbBase, DWORD dwLength, BYTE *pbBlob, DWORD *pcbBlob),
-                         (pbBase, dwLength, pbBlob, pcbBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameGetPublicKey,
-                         (LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbPublicKeyBlob, ULONG *pcbPublicKeyBlob),
-                         (pwzKeyContainer, pbKeyBlob, cbKeyBlob, ppbPublicKeyBlob, pcbPublicKeyBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameHashSize,
-                         (ULONG ulHashAlg, DWORD *pcbSize),
-                         (ulHashAlg, pcbSize));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameKeyDelete,
-                         (LPCWSTR pwzKeyContainer),
-                         (pwzKeyContainer));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameKeyGen,
-                         (LPCWSTR pwzKeyContainer, DWORD dwFlags, BYTE **ppbKeyBlob, ULONG *pcbKeyBlob),
-                         (pwzKeyContainer, dwFlags, ppbKeyBlob, pcbKeyBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameKeyGenEx,
-                         (LPCWSTR pwzKeyContainer, DWORD dwFlags, DWORD dwKeySize, BYTE **ppbKeyBlob, ULONG *pcbKeyBlob),
-                         (pwzKeyContainer, dwFlags, dwKeySize, ppbKeyBlob, pcbKeyBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameKeyInstall,
-                         (LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob),
-                         (pwzKeyContainer, pbKeyBlob, cbKeyBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureGeneration,
-                         (LPCWSTR pwzFilePath, LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbSignatureBlob, ULONG *pcbSignatureBlob),
-                         (pwzFilePath, pwzKeyContainer, pbKeyBlob, cbKeyBlob, ppbSignatureBlob, pcbSignatureBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureGenerationEx,
-                         (LPCWSTR wszFilePath, LPCWSTR wszKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbSignatureBlob, ULONG *pcbSignatureBlob, DWORD dwFlags),
-                         (wszFilePath, wszKeyContainer, pbKeyBlob, cbKeyBlob, ppbSignatureBlob, pcbSignatureBlob, dwFlags));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureSize,
-                         (BYTE *pbPublicKeyBlob, ULONG cbPublicKeyBlob, DWORD *pcbSize),
-                         (pbPublicKeyBlob, cbPublicKeyBlob, pcbSize));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureVerification,
-                         (LPCWSTR  pwzFilePath, DWORD dwInFlags, DWORD *pdwOutFlags),
-                         (pwzFilePath, dwInFlags, pdwOutFlags));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureVerificationEx,
-                         (LPCWSTR pwzFilePath, BOOLEAN fForceVerification, BOOLEAN *pfWasVerified),
-                         (pwzFilePath, fForceVerification, pfWasVerified));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameSignatureVerificationFromImage,
-                         (BYTE *pbBase, DWORD dwLength, DWORD dwInFlags, DWORD *pdwOutFlags),
-                         (pbBase, dwLength, dwInFlags, pdwOutFlags));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameTokenFromAssembly,
-                         (LPCWSTR pwzFilePath, BYTE **ppbStrongNameToken, ULONG *pcbStrongNameToken),
-                         (pwzFilePath, ppbStrongNameToken, pcbStrongNameToken));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameTokenFromAssemblyEx,
-                         (LPCWSTR pwzFilePath, BYTE **ppbStrongNameToken, ULONG *pcbStrongNameToken, BYTE **ppbPublicKeyBlob, ULONG *pcbPublicKeyBlob),
-                         (pwzFilePath, ppbStrongNameToken, pcbStrongNameToken, ppbPublicKeyBlob, pcbPublicKeyBlob));
-
-PASS_THROUGH_IMPL_BOOLEAN(StrongNameTokenFromPublicKey,
-                         (BYTE *pbPublicKeyBlob, ULONG cbPublicKeyBlob, BYTE **ppbStrongNameToken, ULONG *pcbStrongNameToken),
-                         (pbPublicKeyBlob, cbPublicKeyBlob, ppbStrongNameToken, pcbStrongNameToken));
-
-#undef PASS_THROUGH_IMPL_HRESULT
-#undef PASS_THROUGH_IMPL_BOOLEAN
-#undef PASS_THROUGH_IMPL_VOID
-
-// Defines a method that just delegates a call to the right runtime, this one is for SN APIs that 
-// return BOOLEAN.
-#define WRAP_HRESULT_IMPL_BOOLEAN(_WrapperName, _name, _signature, _args)               \
-    inline                                                                              \
-    HRESULT _WrapperName##_signature                                                    \
-    {                                                                                   \
-        HRESULT hr = S_OK;                                                              \
-        if (Util::HasNewActivationAPIs())                                               \
-        {                                                                               \
-            ICLRStrongName *pSN = NULL;                                                 \
-            IfHrFailRet(Util::GetCLRStrongName(&pSN));                                  \
-            return pSN->_name _args;                                                    \
-        }                                                                               \
-        else                                                                            \
-        {                                                                               \
-            typedef BOOL __stdcall t_FN _signature;                                     \
-            Util::MscoreeFunctor<t_FN> FN;                                              \
-            IfHrFailRet(FN.Init(#_name));                                               \
-            if ((FN() _args))                                                           \
-            {                                                                           \
-                return S_OK;                                                            \
-            }                                                                           \
-            else                                                                        \
-            {   /*@TODO: Static bind version, if necessary*/                            \
-                typedef DWORD __stdcall t_FNStrongNameErrorInfo(void);                  \
-                Util::MscoreeFunctor<t_FNStrongNameErrorInfo> FNStrongNameErrorInfo;    \
-                IfHrFailRet(FNStrongNameErrorInfo.Init("StrongNameErrorInfo"));         \
-                HRESULT hrResult = (HRESULT)FNStrongNameErrorInfo() ();                 \
-                if (SUCCEEDED(hrResult))                                                \
-                {                                                                       \
-                    hrResult = E_FAIL;                                                  \
-                }                                                                       \
-                return hrResult;                                                        \
-            }                                                                           \
-        }                                                                               \
-    }
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameHashSize_HRESULT, 
-                          StrongNameHashSize, 
-                          (ULONG ulHashAlg, DWORD *pcbSize), 
-                          (ulHashAlg, pcbSize));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameTokenFromPublicKey_HRESULT, 
-                          StrongNameTokenFromPublicKey, 
-                          (BYTE *pbPublicKeyBlob, ULONG cbPublicKeyBlob, BYTE **ppbStrongNameToken, ULONG *pcbStrongNameToken), 
-                          (pbPublicKeyBlob, cbPublicKeyBlob, ppbStrongNameToken, pcbStrongNameToken));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameSignatureSize_HRESULT, 
-                          StrongNameSignatureSize, 
-                          (BYTE *pbPublicKeyBlob, ULONG cbPublicKeyBlob, DWORD *pcbSize), 
-                          (pbPublicKeyBlob, cbPublicKeyBlob, pcbSize));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameGetPublicKey_HRESULT, 
-                          StrongNameGetPublicKey, 
-                          (LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbPublicKeyBlob, ULONG *pcbPublicKeyBlob), 
-                          (pwzKeyContainer, pbKeyBlob, cbKeyBlob, ppbPublicKeyBlob, pcbPublicKeyBlob));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameKeyInstall_HRESULT, 
-                          StrongNameKeyInstall, 
-                          (LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob), 
-                          (pwzKeyContainer, pbKeyBlob, cbKeyBlob));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameSignatureGeneration_HRESULT, 
-                          StrongNameSignatureGeneration, 
-                          (LPCWSTR pwzFilePath, LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbSignatureBlob, ULONG *pcbSignatureBlob), 
-                          (pwzFilePath, pwzKeyContainer, pbKeyBlob, cbKeyBlob, ppbSignatureBlob, pcbSignatureBlob));
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameKeyGen_HRESULT, 
-                          StrongNameKeyGen, 
-                          (LPCWSTR pwzKeyContainer, DWORD dwFlags, BYTE **ppbKeyBlob, ULONG *pcbKeyBlob), 
-                          (pwzKeyContainer, dwFlags, ppbKeyBlob, pcbKeyBlob));
-
-#undef WRAP_HRESULT_IMPL_BOOLEAN
-
-// Defines a method that just delegates a call to the right runtime, this one is for ICLRStrongName2 
-// APIs that return BOOLEAN.
-#define WRAP_HRESULT_IMPL_BOOLEAN(_WrapperName, _name, _signature, _args)               \
-    inline                                                                              \
-    HRESULT _WrapperName##_signature                                                    \
-    {                                                                                   \
-        HRESULT hr = S_OK;                                                              \
-        if (Util::HasNewActivationAPIs())                                               \
-        {                                                                               \
-            ICLRStrongName2 *pSN = NULL;                                                \
-            IfHrFailRet(Util::GetCLRStrongName2(&pSN));                                 \
-            return pSN->_name _args;                                                    \
-        }                                                                               \
-        else                                                                            \
-        {                                                                               \
-            return E_FAIL;                                                              \
-        }                                                                               \
-    }
-
-
-WRAP_HRESULT_IMPL_BOOLEAN(StrongNameGetPublicKeyEx_HRESULT, 
-                          StrongNameGetPublicKeyEx, 
-                          (LPCWSTR pwzKeyContainer, BYTE *pbKeyBlob, ULONG cbKeyBlob, BYTE **ppbPublicKeyBlob, ULONG *pcbPublicKeyBlob, ULONG uHashAlgId, ULONG uReserved), 
-                          (pwzKeyContainer, pbKeyBlob, cbKeyBlob, ppbPublicKeyBlob, pcbPublicKeyBlob, uHashAlgId, uReserved));
-
-#undef WRAP_HRESULT_IMPL_BOOLEAN
-
-    inline
-    HRESULT ClrCoCreateInstance(
-      REFCLSID rclsid,
-      LPUNKNOWN pUnkOuter,
-      DWORD dwClsContext,
-      REFIID riid,
-      LPVOID * ppv)
-    {
-        HRESULT hr = S_OK;
-
-        if (Util::HasNewActivationAPIs() /*&& Util::IsCLSIDHostedByClr(rclsid)*/)
-        {
-            GET_CLRINFO(pInfo);
-            IfHrFailRet(pInfo->GetInterface(rclsid, riid, ppv));
-        }
-        else
-        {
-            IfHrFailRet(::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv));
-        }
-
-        return hr;
-    }
-}; // namespace LegacyActivationShim
-#pragma warning(pop) // Revert C4996 status
-
-#undef LEGACY_API_PASS_THROUGH_STATIC
-#undef LEGACY_API_PASS_THROUGH_STATIC_VOIDRET
-#undef LEGACY_API_PASS_THROUGH_DELAYLOAD
-#undef LEGACY_API_PASS_THROUGH_DELAYLOAD_VOIDRET
-#undef CALL_LEGACY_API
-#undef LEGACY_STRONGNAME_API_PASS_THROUGH
-#undef LEGACY_STRONGNAME_API_PASS_THROUGH_VOIDRET
-
-#undef LEGACY_ACTIVATION_SHIM_DEFAULT_PRODUCT_VER_HELPER_L
-#undef LEGACY_ACTIVATION_SHIM_DEFAULT_PRODUCT_VER_STR_L
-
-#pragma pop_macro("IfHrFailRetVOID")
-#pragma pop_macro("IfHrFailRetFALSE")
-#pragma pop_macro("IfHrFailRet")
-
-#ifdef _MANAGED
-// We are compiling Managed C++, restore previous managed/native status from the stack
-#pragma managed(pop)
-#endif //_MANAGED
-
-#pragma warning(pop)
-
-#endif // __LEGACYACTIVATIONSHIM_H__
diff --git a/src/inc/legacyactivationshimdelayload.h b/src/inc/legacyactivationshimdelayload.h
deleted file mode 100644 (file)
index 8e77ff2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-
-#ifndef __LEGACYACTIVATIONSHIMDELAYLOAD_H__
-#define __LEGACYACTIVATIONSHIMDELAYLOAD_H__
-
-#define LEGACY_ACTIVATION_SHIM_DELAY_LOAD
-#include <legacyactivationshim.h>
-#undef LEGACY_ACTIVATION_SHIM_DELAY_LOAD
-
-#endif //__LEGACYACTIVATIONSHIMDELAYLOAD_H__
index be09815..820d64b 100644 (file)
 #define WszLogonUser LogonUserW
 #define WszCreateProcessAsUser CreateProcessAsUserW
 #define WszGetCurrentHwProfile GetCurrentHwProfileW
-#define WszGetVersionEx GetVersionExW
 #define WszCreateJobObject CreateJobObjectW
 #define WszOpenJobObject OpenJobObjectW
 
@@ -925,8 +924,6 @@ __forceinline LONGLONG __InterlockedExchangeAdd64(LONGLONG volatile * Addend, LO
 #define CLR_VER_SUITENAME                   0x0000040
 #define CLR_VER_PRODUCT_TYPE                0x0000080
 
-BOOL GetOSVersion(LPOSVERSIONINFOW osVer);
-
 // Output printf-style formatted text to the debugger if it's present or stdout otherwise.
 inline void DbgWPrintf(const LPCWSTR wszFormat, ...)
 {
index 813e4f1..e8920a2 100644 (file)
@@ -218,13 +218,16 @@ if (CLR_CMAKE_PLATFORM_ARCH_ARM)
     add_subdirectory(protojit)
 endif (CLR_CMAKE_PLATFORM_ARCH_ARM)
 
-if ((CLR_CMAKE_PLATFORM_ARCH_I386 OR CLR_CMAKE_PLATFORM_ARCH_AMD64) AND WIN32)
+if (CLR_CMAKE_PLATFORM_ARCH_I386 OR CLR_CMAKE_PLATFORM_ARCH_AMD64)
     # On x86, build RyuJIT/ARM32 cross-compiling altjit.
     # On amd64, build RyuJIT/ARM64 cross-compiling altjit.
     add_subdirectory(protononjit)
+endif ()
 
-    # Build Linux/x86-running-on-Windows altjit or
-    # Linux/AMD64-running-on-Windows altjit..
+if ((CLR_CMAKE_PLATFORM_ARCH_I386 OR CLR_CMAKE_PLATFORM_ARCH_AMD64) AND WIN32)
+    # On Windows, build altjit that targets the Linux ABI:
+    #   On x86, build Linux/x86 altjit. This enables UNIX_X86_ABI.
+    #   On amd64, build Linux/AMD64 altjit. This enables UNIX_AMD64_ABI and FEATURE_UNIX_AMD64_STRUCT_PASSING.
     add_subdirectory(linuxnonjit)
 endif ()
 
@@ -233,9 +236,3 @@ if (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)
     # (Note: we could also create linuxlegacynonjit for generating Linux/ARM32 code using LEGACY_BACKEND, if needed.)
     add_subdirectory(legacynonjit)
 endif (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)
-
-if (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)
-    if (NOT CLR_BUILD_JIT32)
-        add_subdirectory(compatjit)
-    endif ()
-endif (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)
index 795691d..b024912 100755 (executable)
@@ -222,6 +222,9 @@ inline ti_types JITtype2tiType(CorInfoType type)
 // since conversions between them are not verifiable.
 #define TI_FLAG_NATIVE_INT 0x00000200
 
+// This item contains resolved token. It is used for ctor delegate optimization.
+#define TI_FLAG_TOKEN 0x00000400
+
 // This item contains the 'this' pointer (used for tracking)
 
 #define TI_FLAG_THIS_PTR 0x00001000
@@ -289,7 +292,8 @@ private:
             unsigned byref : 1;            // used
             unsigned byref_readonly : 1;   // used
             unsigned nativeInt : 1;        // used
-            unsigned : 2;                  // unused
+            unsigned token : 1;            // used
+            unsigned : 1;                  // unused
             unsigned thisPtr : 1;          // used
             unsigned thisPermHome : 1;     // used
             unsigned generic_type_var : 1; // used
@@ -300,8 +304,10 @@ private:
 
     union {
         CORINFO_CLASS_HANDLE m_cls;
-        // Valid only for type TI_METHOD
+        // Valid only for type TI_METHOD without IsToken
         CORINFO_METHOD_HANDLE m_method;
+        // Valid only for TI_TOKEN with IsToken
+        CORINFO_RESOLVED_TOKEN* m_token;
     };
 
     template <typename T>
@@ -365,6 +371,16 @@ public:
         m_method = method;
     }
 
+    typeInfo(CORINFO_RESOLVED_TOKEN* token)
+    {
+        assert(token != nullptr);
+        assert(token->hMethod != nullptr);
+        assert(!isInvalidHandle(token->hMethod));
+        m_flags = TI_METHOD;
+        SetIsToken();
+        m_token = token;
+    }
+
 #ifdef DEBUG
 #if VERBOSE_VERIFY
     void Dump() const;
@@ -444,6 +460,12 @@ public:
     // Operations
     /////////////////////////////////////////////////////////////////////////
 
+    void SetIsToken()
+    {
+        m_flags |= TI_FLAG_TOKEN;
+        assert(m_bits.token);
+    }
+
     void SetIsThisPtr()
     {
         m_flags |= TI_FLAG_THIS_PTR;
@@ -553,9 +575,19 @@ public:
     CORINFO_METHOD_HANDLE GetMethod() const
     {
         assert(GetType() == TI_METHOD);
+        if (IsToken())
+        {
+            return m_token->hMethod;
+        }
         return m_method;
     }
 
+    CORINFO_RESOLVED_TOKEN* GetToken() const
+    {
+        assert(IsToken());
+        return m_token;
+    }
+
     // Get this item's type
     // If primitive, returns the primitive type (TI_*)
     // If not primitive, returns:
@@ -616,7 +648,7 @@ public:
     // Returns whether this is a method desc
     BOOL IsMethod() const
     {
-        return (GetType() == TI_METHOD);
+        return GetType() == TI_METHOD;
     }
 
     BOOL IsStruct() const
@@ -720,6 +752,11 @@ public:
         return (m_flags & TI_FLAG_UNINIT_OBJREF);
     }
 
+    BOOL IsToken() const
+    {
+        return IsMethod() && ((m_flags & TI_FLAG_TOKEN) != 0);
+    }
+
 private:
     // used to make functions that return typeinfo efficient.
     typeInfo(DWORD flags, CORINFO_CLASS_HANDLE cls)
index 1a2c855..ca3dce1 100644 (file)
@@ -40,14 +40,6 @@ void CodeGen::genSetRegToIcon(regNumber reg, ssize_t val, var_types type, insFla
 }
 
 //------------------------------------------------------------------------
-// genEmitGSCookieCheck: Generate code to check that the GS cookie wasn't thrashed by a buffer overrun.
-//
-void CodeGen::genEmitGSCookieCheck(bool pushReg)
-{
-    NYI("ARM genEmitGSCookieCheck");
-}
-
-//------------------------------------------------------------------------
 // genCallFinally: Generate a call to the finally block.
 //
 BasicBlock* CodeGen::genCallFinally(BasicBlock* block)
@@ -517,6 +509,10 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
 
     switch (treeNode->gtOper)
     {
+        case GT_LCLHEAP:
+            genLclHeap(treeNode);
+            break;
+
         case GT_CNS_INT:
         case GT_CNS_DBL:
             genSetRegToConst(targetReg, targetType, treeNode);
@@ -1315,6 +1311,328 @@ void CodeGen::genMultiRegCallStoreToLocal(GenTreePtr treeNode)
     varDsc->lvRegNum = REG_STK;
 }
 
+//--------------------------------------------------------------------------------------
+// genLclHeap: Generate code for localloc
+//
+// Description:
+//      There are 2 ways depending from build version to generate code for localloc:
+//          1) For debug build where memory should be initialized we generate loop
+//             which invoke push {tmpReg} N times.
+//          2) Fore /o build  However, we tickle the pages to ensure that SP is always
+//             valid and is in sync with the "stack guard page". Amount of iteration
+//             is N/PAGE_SIZE.
+//
+// Comments:
+//      There can be some optimization:
+//          1) It's not needed to generate loop for zero size allocation
+//          2) For small allocation (less than 4 store) we unroll loop
+//          3) For allocation less than PAGE_SIZE and when it's not needed to initialize
+//             memory to zero, we can just increment SP.
+//
+// Notes: Size N should be aligned to STACK_ALIGN before any allocation
+//
+void CodeGen::genLclHeap(GenTreePtr tree)
+{
+    assert(tree->OperGet() == GT_LCLHEAP);
+
+    GenTreePtr size = tree->gtOp.gtOp1;
+    noway_assert((genActualType(size->gtType) == TYP_INT) || (genActualType(size->gtType) == TYP_I_IMPL));
+
+    // Result of localloc will be returned in regCnt.
+    // Also it used as temporary register in code generation
+    // for storing allocation size
+    regNumber   regCnt          = tree->gtRegNum;
+    regMaskTP   tmpRegsMask     = tree->gtRsvdRegs;
+    regNumber   pspSymReg       = REG_NA;
+    var_types   type            = genActualType(size->gtType);
+    emitAttr    easz            = emitTypeSize(type);
+    BasicBlock* endLabel        = nullptr;
+    BasicBlock* loop            = nullptr;
+    unsigned    stackAdjustment = 0;
+
+#ifdef DEBUG
+    // Verify ESP
+    if (compiler->opts.compStackCheckOnRet)
+    {
+        noway_assert(compiler->lvaReturnEspCheck != 0xCCCCCCCC &&
+                     compiler->lvaTable[compiler->lvaReturnEspCheck].lvDoNotEnregister &&
+                     compiler->lvaTable[compiler->lvaReturnEspCheck].lvOnFrame);
+        getEmitter()->emitIns_S_R(INS_cmp, EA_PTRSIZE, REG_SPBASE, compiler->lvaReturnEspCheck, 0);
+
+        BasicBlock*  esp_check = genCreateTempLabel();
+        emitJumpKind jmpEqual  = genJumpKindForOper(GT_EQ, CK_SIGNED);
+        inst_JMP(jmpEqual, esp_check);
+        getEmitter()->emitIns(INS_BREAKPOINT);
+        genDefineTempLabel(esp_check);
+    }
+#endif
+
+    noway_assert(isFramePointerUsed()); // localloc requires Frame Pointer to be established since SP changes
+    noway_assert(genStackLevel == 0);   // Can't have anything on the stack
+
+    // Whether method has PSPSym.
+    bool hasPspSym;
+#if FEATURE_EH_FUNCLETS
+    hasPspSym = (compiler->lvaPSPSym != BAD_VAR_NUM);
+#else
+    hasPspSym = false;
+#endif
+
+    // Check to 0 size allocations
+    // size_t amount = 0;
+    if (size->IsCnsIntOrI())
+    {
+        // If size is a constant, then it must be contained.
+        assert(size->isContained());
+
+        // If amount is zero then return null in regCnt
+        size_t amount = size->gtIntCon.gtIconVal;
+        if (amount == 0)
+        {
+            instGen_Set_Reg_To_Zero(EA_PTRSIZE, regCnt);
+            goto BAILOUT;
+        }
+    }
+    else
+    {
+        // If 0 bail out by returning null in regCnt
+        genConsumeRegAndCopy(size, regCnt);
+        endLabel = genCreateTempLabel();
+        getEmitter()->emitIns_R_R(INS_TEST, easz, regCnt, regCnt);
+        emitJumpKind jmpEqual = genJumpKindForOper(GT_EQ, CK_SIGNED);
+        inst_JMP(jmpEqual, endLabel);
+    }
+
+    stackAdjustment = 0;
+#if FEATURE_EH_FUNCLETS
+    // If we have PSPsym, then need to re-locate it after localloc.
+    if (hasPspSym)
+    {
+        stackAdjustment += STACK_ALIGN;
+
+        // Save a copy of PSPSym
+        assert(genCountBits(tmpRegsMask) >= 1);
+        regMaskTP pspSymRegMask = genFindLowestBit(tmpRegsMask);
+        tmpRegsMask &= ~pspSymRegMask;
+        pspSymReg = genRegNumFromMask(pspSymRegMask);
+        getEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, pspSymReg, compiler->lvaPSPSym, 0);
+    }
+#endif
+
+#if FEATURE_FIXED_OUT_ARGS
+    // If we have an outgoing arg area then we must adjust the SP by popping off the
+    // outgoing arg area. We will restore it right before we return from this method.
+    if (compiler->lvaOutgoingArgSpaceSize > 0)
+    {
+        assert((compiler->lvaOutgoingArgSpaceSize % STACK_ALIGN) == 0); // This must be true for the stack to remain
+                                                                        // aligned
+        inst_RV_IV(INS_add, REG_SPBASE, compiler->lvaOutgoingArgSpaceSize, EA_PTRSIZE);
+        stackAdjustment += compiler->lvaOutgoingArgSpaceSize;
+    }
+#endif
+
+    // Put aligned allocation size to regCnt
+    if (size->IsCnsIntOrI())
+    {
+        // 'amount' is the total number of bytes to localloc to properly STACK_ALIGN
+        size_t amount = size->gtIntCon.gtIconVal;
+        amount        = AlignUp(amount, STACK_ALIGN);
+
+        // For small allocations we will generate up to four stp instructions
+        size_t cntStackAlignedWidthItems = (amount >> STACK_ALIGN_SHIFT);
+        if (cntStackAlignedWidthItems <= 4)
+        {
+            instGen_Set_Reg_To_Zero(EA_PTRSIZE, regCnt);
+
+            while (cntStackAlignedWidthItems != 0)
+            {
+                inst_IV(INS_push, (unsigned)genRegMask(regCnt));
+                cntStackAlignedWidthItems -= 1;
+            }
+
+            goto ALLOC_DONE;
+        }
+        else if (!compiler->info.compInitMem && (amount < compiler->eeGetPageSize())) // must be < not <=
+        {
+            // Since the size is a page or less, simply adjust the SP value
+            // The SP might already be in the guard page, must touch it BEFORE
+            // the alloc, not after.
+            getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, regCnt, REG_SP, 0);
+            inst_RV_IV(INS_sub, REG_SP, amount, EA_PTRSIZE);
+            goto ALLOC_DONE;
+        }
+
+        // regCnt will be the total number of bytes to locAlloc
+        genSetRegToIcon(regCnt, amount, ((int)amount == amount) ? TYP_INT : TYP_LONG);
+    }
+    else
+    {
+        // Round up the number of bytes to allocate to a STACK_ALIGN boundary.
+        inst_RV_IV(INS_add, regCnt, (STACK_ALIGN - 1), emitActualTypeSize(type));
+        inst_RV_IV(INS_AND, regCnt, ~(STACK_ALIGN - 1), emitActualTypeSize(type));
+    }
+
+    // Allocation
+    if (compiler->info.compInitMem)
+    {
+        // At this point 'regCnt' is set to the total number of bytes to locAlloc.
+        // Since we have to zero out the allocated memory AND ensure that RSP is always valid
+        // by tickling the pages, we will just push 0's on the stack.
+
+        assert(tmpRegsMask != RBM_NONE);
+        assert(genCountBits(tmpRegsMask) >= 1);
+
+        regMaskTP regCntMask = genFindLowestBit(tmpRegsMask);
+        tmpRegsMask &= ~regCntMask;
+        regNumber regTmp = genRegNumFromMask(regCntMask);
+        instGen_Set_Reg_To_Zero(EA_PTRSIZE, regTmp);
+
+        // Loop:
+        BasicBlock* loop = genCreateTempLabel();
+        genDefineTempLabel(loop);
+
+        noway_assert(STACK_ALIGN == 8);
+        inst_IV(INS_push, (unsigned)genRegMask(regTmp));
+        inst_IV(INS_push, (unsigned)genRegMask(regTmp));
+
+        // If not done, loop
+        // Note that regCnt is the number of bytes to stack allocate.
+        assert(genIsValidIntReg(regCnt));
+        getEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, regCnt, regCnt, STACK_ALIGN);
+        emitJumpKind jmpNotEqual = genJumpKindForOper(GT_NE, CK_SIGNED);
+        inst_JMP(jmpNotEqual, loop);
+    }
+    else
+    {
+        // At this point 'regCnt' is set to the total number of bytes to locAlloc.
+        //
+        // We don't need to zero out the allocated memory. However, we do have
+        // to tickle the pages to ensure that SP is always valid and is
+        // in sync with the "stack guard page".  Note that in the worst
+        // case SP is on the last byte of the guard page.  Thus you must
+        // touch SP+0 first not SP+0x1000.
+        //
+        // Another subtlety is that you don't want SP to be exactly on the
+        // boundary of the guard page because PUSH is predecrement, thus
+        // call setup would not touch the guard page but just beyond it
+        //
+        // Note that we go through a few hoops so that SP never points to
+        // illegal pages at any time during the ticking process
+        //
+        //       subs  regCnt, SP, regCnt      // regCnt now holds ultimate SP
+        //       jb    Loop                    // result is smaller than orignial SP (no wrap around)
+        //       mov   regCnt, #0              // Overflow, pick lowest possible value
+        //
+        //  Loop:
+        //       ldr   regTmp, [SP + 0]        // tickle the page - read from the page
+        //       sub   regTmp, SP, PAGE_SIZE   // decrement SP by PAGE_SIZE
+        //       cmp   regTmp, regCnt
+        //       jb    Done
+        //       mov   SP, regTmp
+        //       j     Loop
+        //
+        //  Done:
+        //       mov   SP, regCnt
+        //
+
+        // Setup the regTmp
+        assert(tmpRegsMask != RBM_NONE);
+        assert(genCountBits(tmpRegsMask) == 1);
+        regNumber regTmp = genRegNumFromMask(tmpRegsMask);
+
+        BasicBlock* loop = genCreateTempLabel();
+        BasicBlock* done = genCreateTempLabel();
+
+        //       subs  regCnt, SP, regCnt      // regCnt now holds ultimate SP
+        getEmitter()->emitIns_R_R_R(INS_sub, EA_PTRSIZE, regCnt, REG_SPBASE, regCnt);
+
+        inst_JMP(EJ_vc, loop); // branch if the V flag is not set
+
+        // Ups... Overflow, set regCnt to lowest possible value
+        instGen_Set_Reg_To_Zero(EA_PTRSIZE, regCnt);
+
+        genDefineTempLabel(loop);
+
+        // tickle the page - Read from the updated SP - this triggers a page fault when on the guard page
+        getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, regTmp, REG_SPBASE, 0);
+
+        // decrement SP by PAGE_SIZE
+        getEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, regTmp, REG_SPBASE, compiler->eeGetPageSize());
+
+        getEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, regTmp, regCnt);
+        emitJumpKind jmpLTU = genJumpKindForOper(GT_LT, CK_UNSIGNED);
+        inst_JMP(jmpLTU, done);
+
+        // Update SP to be at the next page of stack that we will tickle
+        getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, REG_SPBASE, regCnt);
+
+        // Jump to loop and tickle new stack address
+        inst_JMP(EJ_jmp, loop);
+
+        // Done with stack tickle loop
+        genDefineTempLabel(done);
+
+        // Now just move the final value to SP
+        getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, REG_SPBASE, regCnt);
+    }
+
+ALLOC_DONE:
+    // Re-adjust SP to allocate PSPSym and out-going arg area
+    if (stackAdjustment != 0)
+    {
+        assert((stackAdjustment % STACK_ALIGN) == 0); // This must be true for the stack to remain aligned
+        assert(stackAdjustment > 0);
+        getEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, (int)stackAdjustment);
+
+#if FEATURE_EH_FUNCLETS
+        // Write PSPSym to its new location.
+        if (hasPspSym)
+        {
+            assert(genIsValidIntReg(pspSymReg));
+            getEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, pspSymReg, compiler->lvaPSPSym, 0);
+        }
+#endif
+        // Return the stackalloc'ed address in result register.
+        // regCnt = RSP + stackAdjustment.
+        getEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, regCnt, REG_SPBASE, (int)stackAdjustment);
+    }
+    else // stackAdjustment == 0
+    {
+        // Move the final value of SP to regCnt
+        inst_RV_RV(INS_mov, regCnt, REG_SPBASE);
+    }
+
+BAILOUT:
+    if (endLabel != nullptr)
+        genDefineTempLabel(endLabel);
+
+    // Write the lvaLocAllocSPvar stack frame slot
+    if (compiler->lvaLocAllocSPvar != BAD_VAR_NUM)
+    {
+        getEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, regCnt, compiler->lvaLocAllocSPvar, 0);
+    }
+
+#if STACK_PROBES
+    if (compiler->opts.compNeedStackProbes)
+    {
+        genGenerateStackProbe();
+    }
+#endif
+
+#ifdef DEBUG
+    // Update new ESP
+    if (compiler->opts.compStackCheckOnRet)
+    {
+        noway_assert(compiler->lvaReturnEspCheck != 0xCCCCCCCC &&
+                     compiler->lvaTable[compiler->lvaReturnEspCheck].lvDoNotEnregister &&
+                     compiler->lvaTable[compiler->lvaReturnEspCheck].lvOnFrame);
+        getEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, regCnt, compiler->lvaReturnEspCheck, 0);
+    }
+#endif
+
+    genProduceReg(tree);
+}
+
 //------------------------------------------------------------------------
 // genTableBasedSwitch: generate code for a switch statement based on a table of ip-relative offsets
 //
@@ -1993,8 +2311,13 @@ void CodeGen::genCallInstruction(GenTreeCall* call)
     // Insert a null check on "this" pointer if asked.
     if (call->NeedsNullCheck())
     {
-        const regNumber regThis = genGetThisArgReg(call);
-        const regNumber tmpReg  = genRegNumFromMask(call->gtRsvdRegs);
+        const regNumber regThis  = genGetThisArgReg(call);
+        regMaskTP       tempMask = genFindLowestBit(call->gtRsvdRegs);
+        const regNumber tmpReg   = genRegNumFromMask(tempMask);
+        if (genCountBits(call->gtRsvdRegs) > 1)
+        {
+            call->gtRsvdRegs &= ~tempMask;
+        }
         getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, tmpReg, regThis, 0);
     }
 
index 5698be9..c123136 100644 (file)
@@ -1283,49 +1283,6 @@ void CodeGen::genSetRegToIcon(regNumber reg, ssize_t val, var_types type, insFla
     instGen_Set_Reg_To_Imm(emitActualTypeSize(type), reg, val, flags);
 }
 
-/*****************************************************************************
- *
- *   Generate code to check that the GS cookie wasn't thrashed by a buffer
- *   overrun.  On ARM64 we always use REG_TMP_0 and REG_TMP_1 as temp registers
- *   and this works fine in the case of tail calls
- *   Implementation Note: pushReg = true, in case of tail calls.
- */
-void CodeGen::genEmitGSCookieCheck(bool pushReg)
-{
-    noway_assert(compiler->gsGlobalSecurityCookieAddr || compiler->gsGlobalSecurityCookieVal);
-
-    // Make sure that the return register is reported as live GC-ref so that any GC that kicks in while
-    // executing GS cookie check will not collect the object pointed to by REG_INTRET (R0).
-    if (!pushReg && (compiler->info.compRetType == TYP_REF))
-        gcInfo.gcRegGCrefSetCur |= RBM_INTRET;
-
-    regNumber regGSConst = REG_TMP_0;
-    regNumber regGSValue = REG_TMP_1;
-
-    if (compiler->gsGlobalSecurityCookieAddr == nullptr)
-    {
-        // load the GS cookie constant into a reg
-        //
-        genSetRegToIcon(regGSConst, compiler->gsGlobalSecurityCookieVal, TYP_I_IMPL);
-    }
-    else
-    {
-        // Ngen case - GS cookie constant needs to be accessed through an indirection.
-        instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, regGSConst, (ssize_t)compiler->gsGlobalSecurityCookieAddr);
-        getEmitter()->emitIns_R_R_I(ins_Load(TYP_I_IMPL), EA_PTRSIZE, regGSConst, regGSConst, 0);
-    }
-    // Load this method's GS value from the stack frame
-    getEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, regGSValue, compiler->lvaGSSecurityCookie, 0);
-    // Compare with the GC cookie constant
-    getEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, regGSConst, regGSValue);
-
-    BasicBlock*  gsCheckBlk = genCreateTempLabel();
-    emitJumpKind jmpEqual   = genJumpKindForOper(GT_EQ, CK_SIGNED);
-    inst_JMP(jmpEqual, gsCheckBlk);
-    genEmitHelperCall(CORINFO_HELP_FAIL_FAST, 0, EA_UNKNOWN);
-    genDefineTempLabel(gsCheckBlk);
-}
-
 BasicBlock* CodeGen::genCallFinally(BasicBlock* block)
 {
     // Generate a call to the finally, like this:
@@ -1883,8 +1840,8 @@ void CodeGen::genReturn(GenTreePtr treeNode)
 
         if (movRequired)
         {
-            emitAttr movSize = EA_ATTR(genTypeSize(targetType));
-            getEmitter()->emitIns_R_R(INS_mov, movSize, retReg, op1->gtRegNum);
+            emitAttr attr = emitTypeSize(targetType);
+            getEmitter()->emitIns_R_R(INS_mov, attr, retReg, op1->gtRegNum);
         }
     }
 
index e9546f8..29a76c4 100644 (file)
@@ -2610,6 +2610,51 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
     return result;
 }
 
+#ifndef LEGACY_BACKEND
+#ifdef _TARGET_ARMARCH_
+//------------------------------------------------------------------------
+// genEmitGSCookieCheck: Generate code to check that the GS cookie
+// wasn't thrashed by a buffer overrun. Coomon code for ARM32 and ARM64
+//
+void CodeGen::genEmitGSCookieCheck(bool pushReg)
+{
+    noway_assert(compiler->gsGlobalSecurityCookieAddr || compiler->gsGlobalSecurityCookieVal);
+
+    // Make sure that the return register is reported as live GC-ref so that any GC that kicks in while
+    // executing GS cookie check will not collect the object pointed to by REG_INTRET (R0).
+    if (!pushReg && (compiler->info.compRetType == TYP_REF))
+        gcInfo.gcRegGCrefSetCur |= RBM_INTRET;
+
+    regNumber regGSConst = REG_TMP_0;
+    regNumber regGSValue = REG_TMP_1;
+
+    if (compiler->gsGlobalSecurityCookieAddr == nullptr)
+    {
+        // load the GS cookie constant into a reg
+        //
+        genSetRegToIcon(regGSConst, compiler->gsGlobalSecurityCookieVal, TYP_I_IMPL);
+    }
+    else
+    {
+        // Ngen case - GS cookie constant needs to be accessed through an indirection.
+        instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, regGSConst, (ssize_t)compiler->gsGlobalSecurityCookieAddr);
+        getEmitter()->emitIns_R_R_I(ins_Load(TYP_I_IMPL), EA_PTRSIZE, regGSConst, regGSConst, 0);
+    }
+    // Load this method's GS value from the stack frame
+    getEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, regGSValue, compiler->lvaGSSecurityCookie, 0);
+    // Compare with the GC cookie constant
+    getEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, regGSConst, regGSValue);
+
+    BasicBlock*  gsCheckBlk = genCreateTempLabel();
+    emitJumpKind jmpEqual   = genJumpKindForOper(GT_EQ, CK_SIGNED);
+    inst_JMP(jmpEqual, gsCheckBlk);
+    // regGSConst and regGSValue aren't needed anymore, we can use them for helper call
+    genEmitHelperCall(CORINFO_HELP_FAIL_FAST, 0, EA_UNKNOWN, regGSConst);
+    genDefineTempLabel(gsCheckBlk);
+}
+#endif // _TARGET_ARMARCH_
+#endif // !LEGACY_BACKEND
+
 /*****************************************************************************
  *
  *  Generate an exit sequence for a return from a method (note: when compiling
@@ -3158,14 +3203,11 @@ void CodeGen::genGenerateCode(void** codePtr, ULONG* nativeSizeOfCode)
 
     bool trackedStackPtrsContig; // are tracked stk-ptrs contiguous ?
 
-#ifdef _TARGET_AMD64_
+#if defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
     trackedStackPtrsContig = false;
 #elif defined(_TARGET_ARM_)
     // On arm due to prespilling of arguments, tracked stk-ptrs may not be contiguous
     trackedStackPtrsContig = !compiler->opts.compDbgEnC && !compiler->compIsProfilerHookNeeded();
-#elif defined(_TARGET_ARM64_)
-    // Incoming vararg registers are homed on the top of the stack. Tracked var may not be contiguous.
-    trackedStackPtrsContig = !compiler->opts.compDbgEnC && !compiler->info.compIsVarArgs;
 #else
     trackedStackPtrsContig = !compiler->opts.compDbgEnC;
 #endif
@@ -8094,6 +8136,14 @@ void CodeGen::genFinalizeFrame()
     }
 #endif // defined(_TARGET_ARMARCH_)
 
+#if defined(_TARGET_ARM_)
+    // If there are any reserved registers, add them to the
+    if (regSet.rsMaskResvd != RBM_NONE)
+    {
+        regSet.rsSetRegsModified(regSet.rsMaskResvd);
+    }
+#endif // _TARGET_ARM_
+
 #ifdef DEBUG
     if (verbose)
     {
index ff6c14b..d653511 100644 (file)
@@ -21029,8 +21029,6 @@ regMaskTP CodeGen::genPInvokeMethodProlog(regMaskTP initRegs)
     }
     else
     {
-        noway_assert(pInfo->osMajor >= 5);
-
         DWORD basePtr = WIN_NT5_TLS_HIGHOFFSET;
         threadTlsIndex -= 64;
 
diff --git a/src/jit/compatjit/.gitmirror b/src/jit/compatjit/.gitmirror
deleted file mode 100644 (file)
index f507630..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Only contents of this folder, excluding subfolders, will be mirrored by the Git-TFS Mirror. 
\ No newline at end of file
diff --git a/src/jit/compatjit/CMakeLists.txt b/src/jit/compatjit/CMakeLists.txt
deleted file mode 100644 (file)
index 71b8dae..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-project(compatjit)
-
-# This compatjit.dll is only built if we are not building JIT32 as compatjit.dll.
-# It is a normal JIT build, and only exists so the JIT nuget package can build,
-# with both clrjit.dll and compatjit.dll, if JIT32 is not being built.
-
-add_definitions(-DFEATURE_NO_HOST)
-add_definitions(-DSELF_NO_HOST)
-add_definitions(-DFEATURE_READYTORUN_COMPILER)
-remove_definitions(-DFEATURE_MERGE_JIT_AND_ENGINE)
-
-if(WIN32)
-  add_definitions(-DFX_VER_INTERNALNAME_STR=compatjit.dll)
-endif(WIN32)
-
-add_library_clr(compatjit
-   SHARED
-   ${SHARED_LIB_SOURCES}
-   ${JIT_ARCH_SOURCES}
-)
-
-add_dependencies(compatjit jit_exports)
-
-set_property(TARGET compatjit APPEND_STRING PROPERTY LINK_FLAGS ${JIT_EXPORTS_LINKER_OPTION})
-set_property(TARGET compatjit APPEND_STRING PROPERTY LINK_DEPENDS ${JIT_EXPORTS_FILE})
-
-set(RYUJIT_LINK_LIBRARIES
-   utilcodestaticnohost
-   gcinfo
-)
-
-if(CLR_CMAKE_PLATFORM_UNIX)
-    list(APPEND RYUJIT_LINK_LIBRARIES
-       mscorrc_debug
-       coreclrpal
-       palrt
-    )
-else()
-    list(APPEND RYUJIT_LINK_LIBRARIES
-       ${STATIC_MT_CRT_LIB}
-       ${STATIC_MT_VCRT_LIB}
-       kernel32.lib
-       advapi32.lib
-       ole32.lib
-       oleaut32.lib
-       uuid.lib
-       user32.lib
-       version.lib
-       shlwapi.lib
-       bcrypt.lib
-       crypt32.lib
-       RuntimeObject.lib
-    )
-endif(CLR_CMAKE_PLATFORM_UNIX)
-
-target_link_libraries(compatjit
-   ${RYUJIT_LINK_LIBRARIES}
-)
-
-# add the install targets
-install_clr(compatjit)
index 3f75623..df54c8f 100644 (file)
@@ -2470,7 +2470,8 @@ void Compiler::compInitOptions(JitFlags* jitFlags)
     opts.jitFlags  = jitFlags;
     opts.compFlags = CLFLG_MAXOPT; // Default value is for full optimization
 
-    if (jitFlags->IsSet(JitFlags::JIT_FLAG_DEBUG_CODE) || jitFlags->IsSet(JitFlags::JIT_FLAG_MIN_OPT))
+    if (jitFlags->IsSet(JitFlags::JIT_FLAG_DEBUG_CODE) || jitFlags->IsSet(JitFlags::JIT_FLAG_MIN_OPT) ||
+        jitFlags->IsSet(JitFlags::JIT_FLAG_TIER0))
     {
         opts.compFlags = CLFLG_MINOPT;
     }
@@ -2495,7 +2496,8 @@ void Compiler::compInitOptions(JitFlags* jitFlags)
     //
     // If the EE sets SPEED_OPT we will optimize for speed at the expense of code size
     //
-    else if (jitFlags->IsSet(JitFlags::JIT_FLAG_SPEED_OPT))
+    else if (jitFlags->IsSet(JitFlags::JIT_FLAG_SPEED_OPT) ||
+             (jitFlags->IsSet(JitFlags::JIT_FLAG_TIER1) && !jitFlags->IsSet(JitFlags::JIT_FLAG_MIN_OPT)))
     {
         opts.compCodeOpt = FAST_CODE;
         assert(!jitFlags->IsSet(JitFlags::JIT_FLAG_SIZE_OPT));
index 5e876aa..1c01953 100644 (file)
@@ -2880,6 +2880,7 @@ protected:
     StackEntry impPopStack(CORINFO_CLASS_HANDLE& structTypeRet);
     GenTreePtr impPopStack(typeInfo& ti);
     StackEntry& impStackTop(unsigned n = 0);
+    unsigned impStackHeight();
 
     void impSaveStackState(SavedStack* savePtr, bool copy);
     void impRestoreStackState(SavedStack* savePtr);
@@ -3384,6 +3385,8 @@ private:
     bool impIsImplicitTailCallCandidate(
         OPCODE curOpcode, const BYTE* codeAddrOfNextOpcode, const BYTE* codeEnd, int prefixFlags, bool isRecursive);
 
+    CORINFO_RESOLVED_TOKEN* impAllocateToken(CORINFO_RESOLVED_TOKEN token);
+
     /*
     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -4729,7 +4732,9 @@ private:
     void fgNoteNonInlineCandidate(GenTreeStmt* stmt, GenTreeCall* call);
     static fgWalkPreFn fgFindNonInlineCandidate;
 #endif
-    GenTreePtr fgOptimizeDelegateConstructor(GenTreeCall* call, CORINFO_CONTEXT_HANDLE* ExactContextHnd);
+    GenTreePtr fgOptimizeDelegateConstructor(GenTreeCall*            call,
+                                             CORINFO_CONTEXT_HANDLE* ExactContextHnd,
+                                             CORINFO_RESOLVED_TOKEN* ldftnToken);
     GenTreePtr fgMorphLeaf(GenTreePtr tree);
     void fgAssignSetVarDef(GenTreePtr tree);
     GenTreePtr fgMorphOneAsgBlockOp(GenTreePtr tree);
index 534cb40..50d1cfa 100644 (file)
@@ -7118,7 +7118,9 @@ bool Compiler::fgAddrCouldBeNull(GenTreePtr addr)
  *  Optimize the call to the delegate constructor.
  */
 
-GenTreePtr Compiler::fgOptimizeDelegateConstructor(GenTreeCall* call, CORINFO_CONTEXT_HANDLE* ExactContextHnd)
+GenTreePtr Compiler::fgOptimizeDelegateConstructor(GenTreeCall*            call,
+                                                   CORINFO_CONTEXT_HANDLE* ExactContextHnd,
+                                                   CORINFO_RESOLVED_TOKEN* ldftnToken)
 {
     noway_assert(call->gtCallType == CT_USER_FUNC);
     CORINFO_METHOD_HANDLE methHnd = call->gtCallMethHnd;
@@ -7182,8 +7184,37 @@ GenTreePtr Compiler::fgOptimizeDelegateConstructor(GenTreeCall* call, CORINFO_CO
 #ifdef FEATURE_READYTORUN_COMPILER
     if (opts.IsReadyToRun())
     {
+        if (IsTargetAbi(CORINFO_CORERT_ABI))
+        {
+            if (ldftnToken != nullptr)
+            {
+                GenTreePtr           thisPointer       = call->gtCallObjp;
+                GenTreePtr           targetObjPointers = call->gtCallArgs->Current();
+                GenTreeArgList*      helperArgs        = nullptr;
+                CORINFO_LOOKUP       pLookup;
+                CORINFO_CONST_LOOKUP entryPoint;
+                info.compCompHnd->getReadyToRunDelegateCtorHelper(ldftnToken, clsHnd, &pLookup);
+                if (!pLookup.lookupKind.needsRuntimeLookup)
+                {
+                    helperArgs = gtNewArgList(thisPointer, targetObjPointers);
+                    entryPoint = pLookup.constLookup;
+                }
+                else
+                {
+                    assert(oper != GT_FTN_ADDR);
+                    CORINFO_CONST_LOOKUP genericLookup;
+                    info.compCompHnd->getReadyToRunHelper(ldftnToken, &pLookup.lookupKind,
+                                                          CORINFO_HELP_READYTORUN_GENERIC_HANDLE, &genericLookup);
+                    GenTreePtr ctxTree = getRuntimeContextTree(pLookup.lookupKind.runtimeLookupKind);
+                    helperArgs         = gtNewArgList(thisPointer, targetObjPointers, ctxTree);
+                    entryPoint         = genericLookup;
+                }
+                call = gtNewHelperCallNode(CORINFO_HELP_READYTORUN_DELEGATE_CTOR, TYP_VOID, GTF_EXCEPT, helperArgs);
+                call->setEntryPoint(entryPoint);
+            }
+        }
         // ReadyToRun has this optimization for a non-virtual function pointers only for now.
-        if (oper == GT_FTN_ADDR)
+        else if (oper == GT_FTN_ADDR)
         {
             GenTreePtr      thisPointer       = call->gtCallObjp;
             GenTreePtr      targetObjPointers = call->gtCallArgs->Current();
@@ -7191,8 +7222,8 @@ GenTreePtr Compiler::fgOptimizeDelegateConstructor(GenTreeCall* call, CORINFO_CO
 
             call = gtNewHelperCallNode(CORINFO_HELP_READYTORUN_DELEGATE_CTOR, TYP_VOID, GTF_EXCEPT, helperArgs);
 
-            CORINFO_RESOLVED_TOKEN* ldftnToken = targetMethod->gtFptrVal.gtLdftnResolvedToken;
-            CORINFO_LOOKUP          entryPoint;
+            assert(ldftnToken == targetMethod->gtFptrVal.gtLdftnResolvedToken);
+            CORINFO_LOOKUP entryPoint;
             info.compCompHnd->getReadyToRunDelegateCtorHelper(ldftnToken, clsHnd, &entryPoint);
             assert(!entryPoint.lookupKind.needsRuntimeLookup);
             call->setEntryPoint(entryPoint.constLookup);
index e4c740e..11e1d47 100644 (file)
@@ -350,6 +350,12 @@ StackEntry& Compiler::impStackTop(unsigned n)
 
     return verCurrentState.esStack[verCurrentState.esStackDepth - n - 1];
 }
+
+unsigned Compiler::impStackHeight()
+{
+    return verCurrentState.esStackDepth;
+}
+
 /*****************************************************************************
  *  Some of the trees are spilled specially. While unspilling them, or
  *  making a copy, these need to be handled specially. The function
@@ -6378,6 +6384,8 @@ var_types Compiler::impImportCall(OPCODE                  opcode,
     int                    tailCall                       = prefixFlags & PREFIX_TAILCALL;
     bool                   readonlyCall                   = (prefixFlags & PREFIX_READONLY) != 0;
 
+    CORINFO_RESOLVED_TOKEN* ldftnToken = nullptr;
+
     // Synchronized methods need to call CORINFO_HELP_MON_EXIT at the end. We could
     // do that before tailcalls, but that is probably not the intended
     // semantic. So just disallow tailcalls from synchronized methods.
@@ -7289,6 +7297,21 @@ var_types Compiler::impImportCall(OPCODE                  opcode,
         exactContextHnd = nullptr;
     }
 
+    if ((opcode == CEE_NEWOBJ) && ((clsFlags & CORINFO_FLG_DELEGATE) != 0))
+    {
+        // Only verifiable cases are supported.
+        // dup; ldvirtftn; newobj; or ldftn; newobj.
+        // IL test could contain unverifiable sequence, in this case optimization should not be done.
+        if (impStackHeight() > 0)
+        {
+            typeInfo delegateTypeInfo = impStackTop().seTypeInfo;
+            if (delegateTypeInfo.IsToken())
+            {
+                ldftnToken = delegateTypeInfo.GetToken();
+            }
+        }
+    }
+
     //-------------------------------------------------------------------------
     // The main group of arguments
 
@@ -7369,7 +7392,7 @@ var_types Compiler::impImportCall(OPCODE                  opcode,
             {
                 // New inliner morph it in impImportCall.
                 // This will allow us to inline the call to the delegate constructor.
-                call = fgOptimizeDelegateConstructor(call->AsCall(), &exactContextHnd);
+                call = fgOptimizeDelegateConstructor(call->AsCall(), &exactContextHnd, ldftnToken);
             }
 
             if (!bIntrinsicImported)
@@ -12272,7 +12295,8 @@ void Compiler::impImportBlockCode(BasicBlock* block)
                     return;
                 }
 
-                impPushOnStack(op1, typeInfo(resolvedToken.hMethod));
+                CORINFO_RESOLVED_TOKEN* heapToken = impAllocateToken(resolvedToken);
+                impPushOnStack(op1, typeInfo(heapToken));
 
                 break;
             }
@@ -12377,7 +12401,10 @@ void Compiler::impImportBlockCode(BasicBlock* block)
                     return;
                 }
 
-                impPushOnStack(fptr, typeInfo(resolvedToken.hMethod));
+                CORINFO_RESOLVED_TOKEN* heapToken = impAllocateToken(resolvedToken);
+                assert(heapToken->tokenType == CORINFO_TOKENKIND_Method);
+                heapToken->tokenType = CORINFO_TOKENKIND_Ldvirtftn;
+                impPushOnStack(fptr, typeInfo(heapToken));
 
                 break;
             }
@@ -18696,3 +18723,18 @@ void Compiler::impDevirtualizeCall(GenTreeCall*            call,
     }
 #endif // defined(DEBUG)
 }
+
+//------------------------------------------------------------------------
+// impAllocateToken: create CORINFO_RESOLVED_TOKEN into jit-allocated memory and init it.
+//
+// Arguments:
+//    token - init value for the allocated token.
+//
+// Return Value:
+//    pointer to token into jit-allocated memory.
+CORINFO_RESOLVED_TOKEN* Compiler::impAllocateToken(CORINFO_RESOLVED_TOKEN token)
+{
+    CORINFO_RESOLVED_TOKEN* memory = (CORINFO_RESOLVED_TOKEN*)compGetMem(sizeof(token));
+    *memory                        = token;
+    return memory;
+}
index 916b680..cec24a9 100644 (file)
 #define __PLACEMENT_NEW_INLINE  // don't bring in the global placement new, it is easy to make a mistake
                                 // with our new(compiler*) pattern.
 
-#if COR_JIT_EE_VER > 460
-#define NO_CLRCONFIG // Don't bring in the usual CLRConfig infrastructure, since the JIT uses the JIT/EE
-                     // interface to retrieve config values.
-
-// This is needed for contract.inl when FEATURE_STACK_PROBE is enabled.
-struct CLRConfig
-{
-    static struct ConfigKey
-    {
-    } EXTERNAL_NO_SO_NOT_MAINLINE;
-    static DWORD GetConfigValue(const ConfigKey& key)
-    {
-        return 0;
-    }
-};
-#endif
-
 #include "utilcode.h" // this defines assert as _ASSERTE
 #include "host.h"     // this redefines assert for the JIT to use assertAbort
 #include "utils.h"
index 810c93e..7b0e4a0 100644 (file)
@@ -78,6 +78,8 @@ public:
         JIT_FLAG_USE_PINVOKE_HELPERS     = 36, // The JIT should use the PINVOKE_{BEGIN,END} helpers instead of emitting inline transitions
         JIT_FLAG_REVERSE_PINVOKE         = 37, // The JIT should insert REVERSE_PINVOKE_{ENTER,EXIT} helpers into method prolog/epilog
         JIT_FLAG_DESKTOP_QUIRKS          = 38, // The JIT should generate desktop-quirk-compatible code
+        JIT_FLAG_TIER0                   = 39, // This is the initial tier for tiered compilation which should generate code as quickly as possible
+        JIT_FLAG_TIER1                   = 40, // This is the final tier (for now) for tiered compilation which should generate high quality code
     };
     // clang-format on
 
@@ -187,6 +189,8 @@ public:
         FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_USE_PINVOKE_HELPERS, JIT_FLAG_USE_PINVOKE_HELPERS);
         FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_REVERSE_PINVOKE, JIT_FLAG_REVERSE_PINVOKE);
         FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_DESKTOP_QUIRKS, JIT_FLAG_DESKTOP_QUIRKS);
+        FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_TIER0, JIT_FLAG_TIER0);
+        FLAGS_EQUAL(CORJIT_FLAGS::CORJIT_FLAG_TIER1, JIT_FLAG_TIER1);
 
 #undef FLAGS_EQUAL
     }
index 0c5fa72..912fd36 100644 (file)
@@ -728,6 +728,88 @@ void Lowering::TreeNodeInfoInitPutArgStk(GenTreePutArgStk* argNode, fgArgTabEntr
     }
 }
 
+void Lowering::TreeNodeInfoInitLclHeap(GenTree* tree)
+{
+    TreeNodeInfo* info     = &(tree->gtLsraInfo);
+    LinearScan*   l        = m_lsra;
+    Compiler*     compiler = comp;
+
+    info->srcCount = 1;
+    info->dstCount = 1;
+
+    // Need a variable number of temp regs (see genLclHeap() in codegenarm.cpp):
+    // Here '-' means don't care.
+    //
+    //  Size?                   Init Memory?    # temp regs
+    //   0                          -               0
+    //   const and <=4 ptr words    -             hasPspSym ? 1 : 0
+    //   const and <PageSize        No            hasPspSym ? 1 : 0
+    //   >4 ptr words               Yes           hasPspSym ? 2 : 1
+    //   Non-const                  Yes           hasPspSym ? 2 : 1
+    //   Non-const                  No            hasPspSym ? 2 : 1
+
+    bool hasPspSym;
+#if FEATURE_EH_FUNCLETS
+    hasPspSym = (compiler->lvaPSPSym != BAD_VAR_NUM);
+#else
+    hasPspSym = false;
+#endif
+
+    GenTreePtr size = tree->gtOp.gtOp1;
+    if (size->IsCnsIntOrI())
+    {
+        MakeSrcContained(tree, size);
+
+        size_t sizeVal = size->gtIntCon.gtIconVal;
+        if (sizeVal == 0)
+        {
+            info->internalIntCount = 0;
+        }
+        else
+        {
+            sizeVal                          = AlignUp(sizeVal, STACK_ALIGN);
+            size_t cntStackAlignedWidthItems = (sizeVal >> STACK_ALIGN_SHIFT);
+
+            // For small allocations up to 4 store instructions
+            if (cntStackAlignedWidthItems <= 4)
+            {
+                info->internalIntCount = 0;
+            }
+            else if (!compiler->info.compInitMem)
+            {
+                // No need to initialize allocated stack space.
+                if (sizeVal < compiler->eeGetPageSize())
+                {
+                    info->internalIntCount = 0;
+                }
+                else
+                {
+                    // target (regCnt) + tmp + [psp]
+                    info->internalIntCount       = 1;
+                    info->isInternalRegDelayFree = true;
+                }
+            }
+            else
+            {
+                // target (regCnt) + tmp + [psp]
+                info->internalIntCount       = 1;
+                info->isInternalRegDelayFree = true;
+            }
+
+            if (hasPspSym)
+            {
+                info->internalIntCount++;
+            }
+        }
+    }
+    else
+    {
+        // target (regCnt) + tmp + [psp]
+        info->internalIntCount       = hasPspSym ? 2 : 1;
+        info->isInternalRegDelayFree = true;
+    }
+}
+
 //------------------------------------------------------------------------
 // TreeNodeInfoInitBlockStore: Set the NodeInfo for a block store.
 //
@@ -1296,6 +1378,10 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
             TreeNodeInfoInitBlockStore(tree->AsBlk());
             break;
 
+        case GT_LCLHEAP:
+            TreeNodeInfoInitLclHeap(tree);
+            break;
+
         case GT_STOREIND:
         {
             info->srcCount = 2;
index ed6932e..e209e4c 100644 (file)
@@ -21,6 +21,17 @@ else()
     clr_unknown_arch()
 endif()
 
+if (NOT WIN32)
+    if (CLR_CMAKE_PLATFORM_ARCH_I386)
+        remove_definitions(-DUNIX_X86_ABI)
+    elseif(CLR_CMAKE_PLATFORM_ARCH_AMD64)
+        remove_definitions(-DUNIX_AMD64_ABI)
+        remove_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING)
+    else()
+        clr_unknown_arch()
+    endif()
+endif(NOT WIN32)
+
 if(WIN32)
   add_definitions(-DFX_VER_INTERNALNAME_STR=protononjit.dll)
 endif(WIN32)
index 0b86738..ce6c14e 100644 (file)
@@ -5207,7 +5207,7 @@ HRESULT RegMeta::ValidateAssembly(RID rid)
     dwFlags = (CorAssemblyFlags) pMiniMd->getFlagsOfAssembly(pRecord);
 
     // Validate the flags 
-    invalidAssemblyFlags = dwFlags & (~(afPublicKey | afRetargetable | afPA_FullMask | afEnableJITcompileTracking | afDisableJITcompileOptimizer | afContentType_Mask));
+    invalidAssemblyFlags = dwFlags & (~(afPublicKey | afRetargetable | afPA_FullMask | afDebuggableAttributeMask | afContentType_Mask));
 
     // Validate we only set a legal processor architecture flags
     // The processor architecture flags were introduced in CLR v2.0.
index 2153d78..41c7b9e 100644 (file)
     <Compile Include="$(BclSourcesRoot)\System\Security\VerificationException.cs" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="$(BclSourcesRoot)\System\Security\Util\URLString.cs" />
-  </ItemGroup>
-  <ItemGroup>
     <Compile Include="$(BclSourcesRoot)\System\Diagnostics\Assert.cs" />
     <Compile Include="$(BclSourcesRoot)\System\Diagnostics\AssertFilter.cs" />
     <Compile Include="$(BclSourcesRoot)\System\Diagnostics\AssertFilters.cs" />
index 97746fd..ff26537 100644 (file)
@@ -4,6 +4,7 @@
 
 internal partial class Interop
 {
+    // As defined in winerror.h and https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx
     internal partial class Errors
     {
         internal const int ERROR_SUCCESS = 0x0;
index 6524c2e..521ea65 100644 (file)
 
 */
 
-
+using Microsoft.Win32.SafeHandles;
 using System;
-using System.Collections;
+using System.Buffers;
 using System.Collections.Generic;
-using System.Security;
-using System.Text;
-using System.Threading;
-using System.IO;
-using System.Runtime.Remoting;
-using System.Runtime.InteropServices;
-using Microsoft.Win32.SafeHandles;
-using System.Runtime.Versioning;
-using System.Globalization;
 using System.Diagnostics.Contracts;
-using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Text;
 
 namespace Microsoft.Win32
 {
@@ -228,7 +220,6 @@ namespace Microsoft.Win32
         public void DeleteValue(String name, bool throwOnMissingValue)
         {
             EnsureWriteable();
-            CheckPermission(RegistryInternalCheck.CheckValueWritePermission, name, false, RegistryKeyPermissionCheck.Default);
             int errorCode = Win32Native.RegDeleteValue(hkey, name);
 
             //
@@ -299,9 +290,8 @@ namespace Microsoft.Win32
         {
             ValidateKeyName(name);
             EnsureNotDisposed();
-            name = FixupName(name); // Fixup multiple slashes to a single slash            
+            name = FixupName(name); // Fixup multiple slashes to a single slash
 
-            CheckPermission(RegistryInternalCheck.CheckOpenSubKeyWithWritablePermission, name, writable, RegistryKeyPermissionCheck.Default);
             SafeRegistryHandle result = null;
             int ret = Win32Native.RegOpenKeyEx(hkey,
                 name,
@@ -363,144 +353,131 @@ namespace Microsoft.Win32
             return OpenSubKey(name, false);
         }
 
-        internal int InternalSubKeyCount()
+        /// <summary>
+        /// Retrieves an array of strings containing all the subkey names.
+        /// </summary>
+        public string[] GetSubKeyNames()
         {
             EnsureNotDisposed();
 
-            int subkeys = 0;
-            int junk = 0;
-            int ret = Win32Native.RegQueryInfoKey(hkey,
-                                      null,
-                                      null,
-                                      IntPtr.Zero,
-                                      ref subkeys,  // subkeys
-                                      null,
-                                      null,
-                                      ref junk,     // values
-                                      null,
-                                      null,
-                                      null,
-                                      null);
-
-            if (ret != 0)
-                Win32Error(ret, null);
-            return subkeys;
-        }
+            var names = new List<string>();
+            char[] name = ArrayPool<char>.Shared.Rent(MaxKeyLength + 1);
 
-        /**
-         * Retrieves an array of strings containing all the subkey names.
-         *
-         * @return all subkey names.
-         */
-        public String[] GetSubKeyNames()
-        {
-            CheckPermission(RegistryInternalCheck.CheckKeyReadPermission, null, false, RegistryKeyPermissionCheck.Default);
-            return InternalGetSubKeyNames();
-        }
-
-        internal unsafe String[] InternalGetSubKeyNames()
-        {
-            EnsureNotDisposed();
-            int subkeys = InternalSubKeyCount();
-            String[] names = new String[subkeys];  // Returns 0-length array if empty.
-
-            if (subkeys > 0)
+            try
             {
-                char[] name = new char[MaxKeyLength + 1];
-
-                int namelen;
-
-                fixed (char* namePtr = &name[0])
+                int result;
+                int nameLength = name.Length;
+
+                while ((result = Win32Native.RegEnumKeyEx(
+                    hkey,
+                    names.Count,
+                    name,
+                    ref nameLength,
+                    null,
+                    null,
+                    null,
+                    null)) != Interop.Errors.ERROR_NO_MORE_ITEMS)
                 {
-                    for (int i = 0; i < subkeys; i++)
+                    switch (result)
                     {
-                        namelen = name.Length; // Don't remove this. The API's doesn't work if this is not properly initialised.
-                        int ret = Win32Native.RegEnumKeyEx(hkey,
-                            i,
-                            namePtr,
-                            ref namelen,
-                            null,
-                            null,
-                            null,
-                            null);
-                        if (ret != 0)
-                            Win32Error(ret, null);
-                        names[i] = new String(namePtr);
+                        case Interop.Errors.ERROR_SUCCESS:
+                            names.Add(new string(name, 0, nameLength));
+                            nameLength = name.Length;
+                            break;
+                        default:
+                            // Throw the error
+                            Win32Error(result, null);
+                            break;
                     }
                 }
             }
+            finally
+            {
+                ArrayPool<char>.Shared.Return(name);
+            }
 
-            return names;
+            return names.ToArray();
         }
 
-        internal int InternalValueCount()
+        /// <summary>
+        /// Retrieves an array of strings containing all the value names.
+        /// </summary>
+        public unsafe string[] GetValueNames()
         {
             EnsureNotDisposed();
-            int values = 0;
-            int junk = 0;
-            int ret = Win32Native.RegQueryInfoKey(hkey,
-                                      null,
-                                      null,
-                                      IntPtr.Zero,
-                                      ref junk,     // subkeys
-                                      null,
-                                      null,
-                                      ref values,   // values
-                                      null,
-                                      null,
-                                      null,
-                                      null);
-            if (ret != 0)
-                Win32Error(ret, null);
-            return values;
-        }
+            var names = new List<string>();
 
-        /**
-         * Retrieves an array of strings containing all the value names.
-         *
-         * @return all value names.
-         */
-        public unsafe String[] GetValueNames()
-        {
-            CheckPermission(RegistryInternalCheck.CheckKeyReadPermission, null, false, RegistryKeyPermissionCheck.Default);
-            EnsureNotDisposed();
+            // Names in the registry aren't usually very long, although they can go to as large
+            // as 16383 characters (MaxValueLength).
+            //
+            // Every call to RegEnumValue will allocate another buffer to get the data from
+            // NtEnumerateValueKey before copying it back out to our passed in buffer. This can
+            // add up quickly- we'll try to keep the memory pressure low and grow the buffer
+            // only if needed.
 
-            int values = InternalValueCount();
-            String[] names = new String[values];
+            char[] name = ArrayPool<char>.Shared.Rent(100);
 
-            if (values > 0)
+            try
             {
-                char[] name = new char[MaxValueLength + 1];
-                int namelen;
-
-                fixed (char* namePtr = &name[0])
+                int result;
+                int nameLength = name.Length;
+
+                while ((result = Win32Native.RegEnumValue(
+                    hkey,
+                    names.Count,
+                    name,
+                    ref nameLength,
+                    IntPtr.Zero,
+                    null,
+                    null,
+                    null)) != Interop.Errors.ERROR_NO_MORE_ITEMS)
                 {
-                    for (int i = 0; i < values; i++)
+                    switch (result)
                     {
-                        namelen = name.Length;
-
-                        int ret = Win32Native.RegEnumValue(hkey,
-                            i,
-                            namePtr,
-                            ref namelen,
-                            IntPtr.Zero,
-                            null,
-                            null,
-                            null);
-
-                        if (ret != 0)
-                        {
-                            // ignore ERROR_MORE_DATA if we're querying HKEY_PERFORMANCE_DATA
-                            if (!(IsPerfDataKey() && ret == Win32Native.ERROR_MORE_DATA))
-                                Win32Error(ret, null);
-                        }
-
-                        names[i] = new String(namePtr);
+                        // The size is only ever reported back correctly in the case
+                        // of ERROR_SUCCESS. It will almost always be changed, however.
+                        case Interop.Errors.ERROR_SUCCESS:
+                            names.Add(new string(name, 0, nameLength));
+                            break;
+                        case Interop.Errors.ERROR_MORE_DATA:
+                            if (IsPerfDataKey())
+                            {
+                                // Enumerating the values for Perf keys always returns
+                                // ERROR_MORE_DATA, but has a valid name. Buffer does need
+                                // to be big enough however. 8 characters is the largest
+                                // known name. The size isn't returned, but the string is
+                                // null terminated.
+                                fixed (char* c = &name[0])
+                                {
+                                    names.Add(new string(c));
+                                }
+                            }
+                            else
+                            {
+                                char[] oldName = name;
+                                int oldLength = oldName.Length;
+                                name = null;
+                                ArrayPool<char>.Shared.Return(oldName);
+                                name = ArrayPool<char>.Shared.Rent(checked(oldLength * 2));
+                            }
+                            break;
+                        default:
+                            // Throw the error
+                            Win32Error(result, null);
+                            break;
                     }
+
+                    // Always set the name length back to the buffer size
+                    nameLength = name.Length;
                 }
             }
+            finally
+            {
+                if (name != null)
+                    ArrayPool<char>.Shared.Return(name);
+            }
 
-            return names;
+            return names.ToArray();
         }
 
         /**
@@ -516,7 +493,6 @@ namespace Microsoft.Win32
          */
         public Object GetValue(String name)
         {
-            CheckPermission(RegistryInternalCheck.CheckValueReadPermission, name, false, RegistryKeyPermissionCheck.Default);
             return InternalGetValue(name, null, false, true);
         }
 
@@ -537,7 +513,6 @@ namespace Microsoft.Win32
          */
         public Object GetValue(String name, Object defaultValue)
         {
-            CheckPermission(RegistryInternalCheck.CheckValueReadPermission, name, false, RegistryKeyPermissionCheck.Default);
             return InternalGetValue(name, defaultValue, false, true);
         }
 
@@ -548,7 +523,6 @@ namespace Microsoft.Win32
                 throw new ArgumentException(SR.Format(SR.Arg_EnumIllegalVal, (int)options), nameof(options));
             }
             bool doNotExpand = (options == RegistryValueOptions.DoNotExpandEnvironmentNames);
-            CheckPermission(RegistryInternalCheck.CheckValueReadPermission, name, false, RegistryKeyPermissionCheck.Default);
             return InternalGetValue(name, defaultValue, doNotExpand, true);
         }
 
@@ -852,15 +826,6 @@ namespace Microsoft.Win32
 
             EnsureWriteable();
 
-            if (!remoteKey && ContainsRegistryValue(name))
-            { // Existing key 
-                CheckPermission(RegistryInternalCheck.CheckValueWritePermission, name, false, RegistryKeyPermissionCheck.Default);
-            }
-            else
-            { // Creating a new value
-                CheckPermission(RegistryInternalCheck.CheckValueCreatePermission, name, false, RegistryKeyPermissionCheck.Default);
-            }
-
             if (valueKind == RegistryValueKind.Unknown)
             {
                 // this is to maintain compatibility with the old way of autodetecting the type.
@@ -1137,11 +1102,6 @@ namespace Microsoft.Win32
             }
         }
 
-        private void CheckPermission(RegistryInternalCheck check, string item, bool subKeyWritable, RegistryKeyPermissionCheck subKeyCheck)
-        {
-            // TODO: Cleanup
-        }
-
         private bool ContainsRegistryValue(string name)
         {
             int type = 0;
index 8408937..e751a63 100644 (file)
@@ -834,13 +834,13 @@ namespace Microsoft.Win32
 
         [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)]
         internal unsafe static extern int RegEnumKeyEx(SafeRegistryHandle hKey, int dwIndex,
-                    char* lpName, ref int lpcbName, int[] lpReserved,
+                    char[] lpName, ref int lpcbName, int[] lpReserved,
                     [Out]StringBuilder lpClass, int[] lpcbClass,
                     long[] lpftLastWriteTime);
 
         [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)]
         internal unsafe static extern int RegEnumValue(SafeRegistryHandle hKey, int dwIndex,
-                    char* lpValueName, ref int lpcbValueName,
+                    char[] lpValueName, ref int lpcbValueName,
                     IntPtr lpReserved_MustBeZero, int[] lpType, byte[] lpData,
                     int[] lpcbData);
 
@@ -971,5 +971,15 @@ namespace Microsoft.Win32
 #else
         private const int BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002;
 #endif
+
+        internal const byte VER_GREATER_EQUAL = 0x3;
+        internal const uint VER_MAJORVERSION = 0x0000002;
+        internal const uint VER_MINORVERSION = 0x0000001;
+        internal const uint VER_SERVICEPACKMAJOR = 0x0000020;
+        internal const uint VER_SERVICEPACKMINOR = 0x0000010;
+        [DllImport("kernel32.dll")]
+        internal static extern bool VerifyVersionInfoW([In, Out] OSVERSIONINFOEX lpVersionInfo, uint dwTypeMask, ulong dwlConditionMask);
+        [DllImport("kernel32.dll")]
+        internal static extern ulong VerSetConditionMask(ulong dwlConditionMask, uint dwTypeBitMask, byte dwConditionMask);        
     }
 }
index 2529660..907ac69 100644 (file)
@@ -52,7 +52,6 @@ namespace System
 
         // Constants from fusionsetup.h.
         private const string LOADER_OPTIMIZATION = "LOADER_OPTIMIZATION";
-        private const string CONFIGURATION_EXTENSION = ".config";
 
         private const string ACTAG_APP_BASE_URL = "APPBASE";
 
@@ -131,7 +130,7 @@ namespace System
                 else
                     _AppDomainInitializer = null;
 
-                _ConfigurationBytes = copy.GetConfigurationBytes();
+                _ConfigurationBytes = null; 
 #if FEATURE_COMINTEROP
                 _DisableInterfaceCache = copy._DisableInterfaceCache;
 #endif // FEATURE_COMINTEROP
@@ -178,7 +177,6 @@ namespace System
                 else
                     ApplicationBase = appBase;
             }
-            ConfigurationFile = ApplicationName + AppDomainSetup.ConfigurationExtension;
         }
 
         internal string[] Value
@@ -191,11 +189,6 @@ namespace System
             }
         }
 
-        internal String GetUnsecureApplicationBase()
-        {
-            return Value[(int)LoaderInformation.ApplicationBaseValue];
-        }
-
         public string AppDomainManagerAssembly
         {
             get { return _AppDomainManagerAssembly; }
@@ -213,246 +206,15 @@ namespace System
             [Pure]
             get
             {
-                return VerifyDir(GetUnsecureApplicationBase(), false);
+                return Value[(int)LoaderInformation.ApplicationBaseValue];
             }
 
             set
             {
-                Value[(int)LoaderInformation.ApplicationBaseValue] = NormalizePath(value, false);
+                Value[(int)LoaderInformation.ApplicationBaseValue] = (value == null || value.Length == 0)?null:Path.GetFullPath(value);
             }
         }
-
-        private String NormalizePath(String path, bool useAppBase)
-        {
-            if (path == null)
-                return null;
-
-            // If we add very long file name support ("\\?\") to the Path class then this is unnecesary,
-            // but we do not plan on doing this for now.
-
-            // Long path checks can be quirked, and as loading default quirks too early in the setup of an AppDomain is risky
-            // we'll avoid checking path lengths- we'll still fail at MAX_PATH later if we're !useAppBase when we call Path's
-            // NormalizePath.
-            if (!useAppBase)
-                path = Security.Util.URLString.PreProcessForExtendedPathRemoval(
-                    checkPathLength: false,
-                    url: path,
-                    isFileUrl: false);
-
-
-            int len = path.Length;
-            if (len == 0)
-                return null;
-
-#if !PLATFORM_UNIX
-            bool UNCpath = false;
-#endif // !PLATFORM_UNIX
-
-            if ((len > 7) &&
-                (String.Compare(path, 0, "file:", 0, 5, StringComparison.OrdinalIgnoreCase) == 0))
-            {
-                int trim;
-
-                if (path[6] == '\\')
-                {
-                    if ((path[7] == '\\') || (path[7] == '/'))
-                    {
-                        // Don't allow "file:\\\\", because we can't tell the difference
-                        // with it for "file:\\" + "\\server" and "file:\\\" + "\localpath"
-                        if ((len > 8) &&
-                             ((path[8] == '\\') || (path[8] == '/')))
-                            throw new ArgumentException(SR.Argument_InvalidPathChars);
-
-                        // file:\\\ means local path
-                        else
-#if !PLATFORM_UNIX
-                            trim = 8;
-#else
-                            // For Unix platform, trim the first 7 characters only.
-                            // Trimming the first 8 characters will cause
-                            // the root path separator to be trimmed away,
-                            // and the absolute local path becomes a relative local path.
-                            trim = 7;
-#endif // !PLATFORM_UNIX
-                    }
-
-                    // file:\\ means remote server
-                    else
-                    {
-                        trim = 5;
-#if !PLATFORM_UNIX
-                        UNCpath = true;
-#endif // !PLATFORM_UNIX
-                    }
-                }
-
-                // local path
-                else if (path[7] == '/')
-#if !PLATFORM_UNIX
-                    trim = 8;
-#else
-                    // For Unix platform, trim the first 7 characters only.
-                    // Trimming the first 8 characters will cause
-                    // the root path separator to be trimmed away,
-                    // and the absolute local path becomes a relative local path.
-                    trim = 7;
-#endif // !PLATFORM_UNIX
-
-                // remote
-                else
-                {
-                    // file://\\remote
-                    if ((len > 8) && (path[7] == '\\') && (path[8] == '\\'))
-                        trim = 7;
-                    else
-                    { // file://remote
-                        trim = 5;
-#if !PLATFORM_UNIX
-                        // Create valid UNC path by changing
-                        // all occurences of '/' to '\\' in path
-                        System.Text.StringBuilder winPathBuilder =
-                            new System.Text.StringBuilder(len);
-                        for (int i = 0; i < len; i++)
-                        {
-                            char c = path[i];
-                            if (c == '/')
-                                winPathBuilder.Append('\\');
-                            else
-                                winPathBuilder.Append(c);
-                        }
-                        path = winPathBuilder.ToString();
-#endif // !PLATFORM_UNIX
-                    }
-#if !PLATFORM_UNIX
-                    UNCpath = true;
-#endif // !PLATFORM_UNIX
-                }
-
-                path = path.Substring(trim);
-                len -= trim;
-            }
-
-#if !PLATFORM_UNIX
-            bool localPath;
-
-            // UNC
-            if (UNCpath ||
-                ((len > 1) &&
-                  ((path[0] == '/') || (path[0] == '\\')) &&
-                  ((path[1] == '/') || (path[1] == '\\'))))
-                localPath = false;
-
-            else
-            {
-                int colon = path.IndexOf(':') + 1;
-
-                // protocol other than file:
-                if ((colon != 0) &&
-                    (len > colon + 1) &&
-                    ((path[colon] == '/') || (path[colon] == '\\')) &&
-                    ((path[colon + 1] == '/') || (path[colon + 1] == '\\')))
-                    localPath = false;
-
-                else
-                    localPath = true;
-            }
-
-            if (localPath)
-#else
-            if ( (len == 1) ||
-                 ( (path[0] != '/') && (path[0] != '\\') ) ) 
-#endif // !PLATFORM_UNIX
-            {
-                if (useAppBase &&
-                    ((len == 1) || (path[1] != ':')))
-                {
-                    String appBase = Value[(int)LoaderInformation.ApplicationBaseValue];
-
-                    if ((appBase == null) || (appBase.Length == 0))
-                        throw new MemberAccessException(SR.AppDomain_AppBaseNotSet);
-
-                    StringBuilder result = StringBuilderCache.Acquire();
-
-                    bool slash = false;
-                    if ((path[0] == '/') || (path[0] == '\\'))
-                    {
-                        string pathRoot = AppDomain.NormalizePath(appBase, fullCheck: false);
-                        pathRoot = pathRoot.Substring(0, IO.PathInternal.GetRootLength(pathRoot));
-
-                        if (pathRoot.Length == 0)
-                        { // URL
-                            int index = appBase.IndexOf(":/", StringComparison.Ordinal);
-                            if (index == -1)
-                                index = appBase.IndexOf(":\\", StringComparison.Ordinal);
-
-                            // Get past last slashes of "url:http://"
-                            int urlLen = appBase.Length;
-                            for (index += 1;
-                                 (index < urlLen) && ((appBase[index] == '/') || (appBase[index] == '\\'));
-                                 index++) ;
-
-                            // Now find the next slash to get domain name
-                            for (; (index < urlLen) && (appBase[index] != '/') && (appBase[index] != '\\');
-                                index++) ;
-
-                            pathRoot = appBase.Substring(0, index);
-                        }
-
-                        result.Append(pathRoot);
-                        slash = true;
-                    }
-                    else
-                        result.Append(appBase);
-
-                    // Make sure there's a slash separator (and only one)
-                    int aLen = result.Length - 1;
-                    if ((result[aLen] != '/') &&
-                        (result[aLen] != '\\'))
-                    {
-                        if (!slash)
-                        {
-#if !PLATFORM_UNIX
-                            if (appBase.IndexOf(":/", StringComparison.Ordinal) == -1)
-                                result.Append('\\');
-                            else
-#endif // !PLATFORM_UNIX
-                                result.Append('/');
-                        }
-                    }
-                    else if (slash)
-                        result.Remove(aLen, 1);
-
-                    result.Append(path);
-                    path = StringBuilderCache.GetStringAndRelease(result);
-                }
-                else
-                    path = AppDomain.NormalizePath(path, fullCheck: true);
-            }
-
-            return path;
-        }
-
-        public String ConfigurationFile
-        {
-            get
-            {
-                return VerifyDir(Value[(int)LoaderInformation.ConfigurationFileValue], true);
-            }
-
-            set
-            {
-                Value[(int)LoaderInformation.ConfigurationFileValue] = value;
-            }
-        }
-
-        public byte[] GetConfigurationBytes()
-        {
-            if (_ConfigurationBytes == null)
-                return null;
-
-            return (byte[])_ConfigurationBytes.Clone();
-        }
-
+        
         // only needed by AppDomain.Setup(). Not really needed by users. 
         internal Dictionary<string, object> GetCompatibilityFlags()
         {
@@ -497,22 +259,6 @@ namespace System
             }
         }
 
-        private String VerifyDir(String dir, bool normalize)
-        {
-            if (dir != null)
-            {
-                if (dir.Length == 0)
-                    dir = null;
-                else
-                {
-                    if (normalize)
-                        dir = NormalizePath(dir, true);
-                }
-            }
-
-            return dir;
-        }
-
         public String ApplicationName
         {
             get
@@ -594,14 +340,6 @@ namespace System
             }
         }
 
-        internal static string ConfigurationExtension
-        {
-            get
-            {
-                return CONFIGURATION_EXTENSION;
-            }
-        }
-
         static internal int Locate(String s)
         {
             if (String.IsNullOrEmpty(s))
index 2ec76a5..495f2f7 100644 (file)
@@ -8,11 +8,7 @@ namespace System.Diagnostics
 {
     public static partial class Debug
     {
-        private static string NewLine => "\n"; 
-
-        private const string EnvVar_DebugWriteToStdErr = "COMPlus_DebugWriteToStdErr";
-        private static readonly bool s_shouldWriteToStdErr = 
-            Internal.Runtime.Augments.EnvironmentAugments.GetEnvironmentVariable(EnvVar_DebugWriteToStdErr) == "1";
+        private static readonly bool s_shouldWriteToStdErr = Environment.GetEnvironmentVariable("COMPlus_DebugWriteToStdErr") == "1";
 
         private static void ShowAssertDialog(string stackTrace, string message, string detailMessage)
         {
@@ -22,16 +18,11 @@ namespace System.Diagnostics
             }
             else
             {
-                // TODO: #3708 Determine if/how to put up a dialog instead.
-                var exc = new DebugAssertException(message, detailMessage, stackTrace);
-                if (!s_shouldWriteToStdErr) 
-                {
-                    // We always want to print out Debug.Assert failures to stderr, even if
-                    // !s_shouldWriteToStdErr, so if it wouldn't have been printed in
-                    // WriteCore (only when s_shouldWriteToStdErr), print it here.
-                    WriteToStderr(exc.Message);
-                }
-                throw exc;
+                // In Core, we do not show a dialog.
+                // Fail in order to avoid anyone catching an exception and masking
+                // an assert failure.
+                var ex = new DebugAssertException(message, detailMessage, stackTrace);
+                Environment.FailFast(ex.Message, ex);
             }
         }
 
index f9b097c..095e9b6 100644 (file)
@@ -6,8 +6,6 @@ namespace System.Diagnostics
 {
     public static partial class Debug
     {
-        private static string NewLine => "\r\n";
-
         private static void ShowAssertDialog(string stackTrace, string message, string detailMessage)
         {
             if (Debugger.IsAttached)
@@ -16,8 +14,11 @@ namespace System.Diagnostics
             }
             else
             {
-                // TODO: #3708 Determine if/how to put up a dialog instead.
-                throw new DebugAssertException(message, detailMessage, stackTrace);
+                // In Core, we do not show a dialog.
+                // Fail in order to avoid anyone catching an exception and masking
+                // an assert failure.
+                var ex = new DebugAssertException(message, detailMessage, stackTrace);
+                Environment.FailFast(ex.Message, ex);
             }
         }
 
index 2dfde8d..59f3c37 100644 (file)
@@ -122,7 +122,7 @@ namespace System.Diagnostics
 
         private static string FormatAssert(string stackTrace, string message, string detailMessage)
         {
-            string newLine = GetIndentString() + NewLine;
+            string newLine = GetIndentString() + Environment.NewLine;
             return SR.DebugAssertBanner + newLine
                    + SR.DebugAssertShortMessage + newLine
                    + message + newLine
@@ -140,7 +140,7 @@ namespace System.Diagnostics
         [System.Diagnostics.Conditional("DEBUG")]
         public static void WriteLine(string message)
         {
-            Write(message + NewLine);
+            Write(message + Environment.NewLine);
         }
 
         [System.Diagnostics.Conditional("DEBUG")]
@@ -159,7 +159,7 @@ namespace System.Diagnostics
                     s_needIndent = false;
                 }
                 s_WriteCore(message);
-                if (message.EndsWith(NewLine))
+                if (message.EndsWith(Environment.NewLine))
                 {
                     s_needIndent = true;
                 }
@@ -311,7 +311,7 @@ namespace System.Diagnostics
         private sealed class DebugAssertException : Exception
         {
             internal DebugAssertException(string message, string detailMessage, string stackTrace) :
-                base(message + NewLine + detailMessage + NewLine + stackTrace)
+                base(message + Environment.NewLine + detailMessage + Environment.NewLine + stackTrace)
             {
             }
         }
index 3668d8c..1d5830c 100644 (file)
@@ -1470,8 +1470,7 @@ namespace System.Diagnostics.Tracing
 #if (!ES_BUILD_STANDALONE && !PROJECTN)
                 // API available on OS >= Win 8 and patched Win 7.
                 // Disable only for FrameworkEventSource to avoid recursion inside exception handling.
-                var osVer = Environment.OSVersion.Version.Major * 10 + Environment.OSVersion.Version.Minor;
-                if (this.Name != "System.Diagnostics.Eventing.FrameworkEventSource" || osVer >= 62)
+                if (this.Name != "System.Diagnostics.Eventing.FrameworkEventSource" || Environment.IsWindows8OrAbove)
 #endif
                 {
                     int setInformationResult;
index 453583b..062e5d9 100644 (file)
@@ -361,69 +361,38 @@ namespace System
             }
         }
 
-        /*==================================OSVersion===================================
-        **Action:
-        **Returns:
-        **Arguments:
-        **Exceptions:
-        ==============================================================================*/
-        internal static OperatingSystem OSVersion
-        {
-            get
-            {
-                Contract.Ensures(Contract.Result<OperatingSystem>() != null);
-
-                if (m_os == null)
-                { // We avoid the lock since we don't care if two threads will set this at the same time.
-                    Microsoft.Win32.Win32Native.OSVERSIONINFO osvi = new Microsoft.Win32.Win32Native.OSVERSIONINFO();
-                    if (!GetVersion(osvi))
-                    {
-                        throw new InvalidOperationException(SR.InvalidOperation_GetVersion);
-                    }
-
-                    Microsoft.Win32.Win32Native.OSVERSIONINFOEX osviEx = new Microsoft.Win32.Win32Native.OSVERSIONINFOEX();
-                    if (!GetVersionEx(osviEx))
-                        throw new InvalidOperationException(SR.InvalidOperation_GetVersion);
-
-#if PLATFORM_UNIX
-                    PlatformID id = PlatformID.Unix;
-#else
-                    PlatformID id = PlatformID.Win32NT;
-#endif // PLATFORM_UNIX
-
-                    Version v = new Version(osvi.MajorVersion, osvi.MinorVersion, osvi.BuildNumber, (osviEx.ServicePackMajor << 16) | osviEx.ServicePackMinor);
-                    m_os = new OperatingSystem(id, v, osvi.CSDVersion);
-                }
-                Debug.Assert(m_os != null, "m_os != null");
-                return m_os;
-            }
-        }
-
-
-        internal static bool IsWindows8OrAbove
-        {
-            get
-            {
-                return true;
-            }
-        }
-
+#if !FEATURE_PAL
+        private static Lazy<bool> s_IsWindows8OrAbove = new Lazy<bool>(() => 
+        {
+            ulong conditionMask = Win32Native.VerSetConditionMask(0, Win32Native.VER_MAJORVERSION, Win32Native.VER_GREATER_EQUAL);
+            conditionMask = Win32Native.VerSetConditionMask(conditionMask, Win32Native.VER_MINORVERSION, Win32Native.VER_GREATER_EQUAL);
+            conditionMask = Win32Native.VerSetConditionMask(conditionMask, Win32Native.VER_SERVICEPACKMAJOR, Win32Native.VER_GREATER_EQUAL);
+            conditionMask = Win32Native.VerSetConditionMask(conditionMask, Win32Native.VER_SERVICEPACKMINOR, Win32Native.VER_GREATER_EQUAL);
+
+            // Windows 8 version is 6.2
+            var version = new Win32Native.OSVERSIONINFOEX { MajorVersion = 6, MinorVersion = 2, ServicePackMajor = 0, ServicePackMinor = 0 };
+                
+            return Win32Native.VerifyVersionInfoW(version, 
+                       Win32Native.VER_MAJORVERSION | Win32Native.VER_MINORVERSION | Win32Native.VER_SERVICEPACKMAJOR | Win32Native.VER_SERVICEPACKMINOR,
+                       conditionMask);
+        });
+        internal static bool IsWindows8OrAbove => s_IsWindows8OrAbove.Value;
+#endif
+        
 #if FEATURE_COMINTEROP
-        internal static bool IsWinRTSupported
+        // Does the current version of Windows have Windows Runtime suppport?
+        private static Lazy<bool> s_IsWinRTSupported = new Lazy<bool>(() =>
         {
-            get
-            {
-                return true;
-            }
-        }
-#endif // FEATURE_COMINTEROP
-
+            return WinRTSupported();
+        });
 
-        [MethodImplAttribute(MethodImplOptions.InternalCall)]
-        internal static extern bool GetVersion(Microsoft.Win32.Win32Native.OSVERSIONINFO osVer);
+        internal static bool IsWinRTSupported => s_IsWinRTSupported.Value;
 
-        [MethodImplAttribute(MethodImplOptions.InternalCall)]
-        internal static extern bool GetVersionEx(Microsoft.Win32.Win32Native.OSVERSIONINFOEX osVer);
+        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool WinRTSupported();
+#endif // FEATURE_COMINTEROP
 
 
         /*==================================StackTrace==================================
index c7e6220..f64211d 100644 (file)
@@ -1285,35 +1285,40 @@ namespace System
             return ToString(format, null);
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private static char HexToChar(int a)
         {
             a = a & 0xf;
             return (char)((a > 9) ? a - 10 + 0x61 : a + 0x30);
         }
 
-        unsafe private static int HexsToChars(char* guidChars, int offset, int a, int b)
+        unsafe private static int HexsToChars(char* guidChars, int a, int b)
         {
-            return HexsToChars(guidChars, offset, a, b, false);
+            guidChars[0] = HexToChar(a >> 4);
+            guidChars[1] = HexToChar(a);
+
+            guidChars[2] = HexToChar(b >> 4);
+            guidChars[3] = HexToChar(b);
+
+            return 4;
         }
 
-        unsafe private static int HexsToChars(char* guidChars, int offset, int a, int b, bool hex)
+        unsafe private static int HexsToCharsHexOutput(char* guidChars, int a, int b)
         {
-            if (hex)
-            {
-                guidChars[offset++] = '0';
-                guidChars[offset++] = 'x';
-            }
-            guidChars[offset++] = HexToChar(a >> 4);
-            guidChars[offset++] = HexToChar(a);
-            if (hex)
-            {
-                guidChars[offset++] = ',';
-                guidChars[offset++] = '0';
-                guidChars[offset++] = 'x';
-            }
-            guidChars[offset++] = HexToChar(b >> 4);
-            guidChars[offset++] = HexToChar(b);
-            return offset;
+            guidChars[0] = '0';
+            guidChars[1] = 'x';
+
+            guidChars[2] = HexToChar(a >> 4);
+            guidChars[3] = HexToChar(a);
+
+            guidChars[4] = ',';
+            guidChars[5] = '0';
+            guidChars[6] = 'x';
+
+            guidChars[7] = HexToChar(b >> 4);
+            guidChars[8] = HexToChar(b);
+
+            return 9;
         }
 
         // IFormattable interface
@@ -1396,42 +1401,42 @@ namespace System
                         // {0xdddddddd,0xdddd,0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}}
                         guidChars[offset++] = '0';
                         guidChars[offset++] = 'x';
-                        offset = HexsToChars(guidChars, offset, _a >> 24, _a >> 16);
-                        offset = HexsToChars(guidChars, offset, _a >> 8, _a);
+                        offset += HexsToChars(guidChars + offset, _a >> 24, _a >> 16);
+                        offset += HexsToChars(guidChars + offset, _a >> 8, _a);
                         guidChars[offset++] = ',';
                         guidChars[offset++] = '0';
                         guidChars[offset++] = 'x';
-                        offset = HexsToChars(guidChars, offset, _b >> 8, _b);
+                        offset += HexsToChars(guidChars + offset, _b >> 8, _b);
                         guidChars[offset++] = ',';
                         guidChars[offset++] = '0';
                         guidChars[offset++] = 'x';
-                        offset = HexsToChars(guidChars, offset, _c >> 8, _c);
+                        offset += HexsToChars(guidChars + offset, _c >> 8, _c);
                         guidChars[offset++] = ',';
                         guidChars[offset++] = '{';
-                        offset = HexsToChars(guidChars, offset, _d, _e, true);
+                        offset += HexsToCharsHexOutput(guidChars + offset, _d, _e);
                         guidChars[offset++] = ',';
-                        offset = HexsToChars(guidChars, offset, _f, _g, true);
+                        offset += HexsToCharsHexOutput(guidChars + offset, _f, _g);
                         guidChars[offset++] = ',';
-                        offset = HexsToChars(guidChars, offset, _h, _i, true);
+                        offset += HexsToCharsHexOutput(guidChars + offset, _h, _i);
                         guidChars[offset++] = ',';
-                        offset = HexsToChars(guidChars, offset, _j, _k, true);
+                        offset += HexsToCharsHexOutput(guidChars + offset, _j, _k);
                         guidChars[offset++] = '}';
                     }
                     else
                     {
                         // [{|(]dddddddd[-]dddd[-]dddd[-]dddd[-]dddddddddddd[}|)]
-                        offset = HexsToChars(guidChars, offset, _a >> 24, _a >> 16);
-                        offset = HexsToChars(guidChars, offset, _a >> 8, _a);
+                        offset += HexsToChars(guidChars + offset, _a >> 24, _a >> 16);
+                        offset += HexsToChars(guidChars + offset, _a >> 8, _a);
                         if (dash) guidChars[offset++] = '-';
-                        offset = HexsToChars(guidChars, offset, _b >> 8, _b);
+                        offset += HexsToChars(guidChars + offset, _b >> 8, _b);
                         if (dash) guidChars[offset++] = '-';
-                        offset = HexsToChars(guidChars, offset, _c >> 8, _c);
+                        offset += HexsToChars(guidChars + offset, _c >> 8, _c);
                         if (dash) guidChars[offset++] = '-';
-                        offset = HexsToChars(guidChars, offset, _d, _e);
+                        offset += HexsToChars(guidChars + offset, _d, _e);
                         if (dash) guidChars[offset++] = '-';
-                        offset = HexsToChars(guidChars, offset, _f, _g);
-                        offset = HexsToChars(guidChars, offset, _h, _i);
-                        offset = HexsToChars(guidChars, offset, _j, _k);
+                        offset += HexsToChars(guidChars + offset, _f, _g);
+                        offset += HexsToChars(guidChars + offset, _h, _i);
+                        offset += HexsToChars(guidChars + offset, _j, _k);
                     }
                 }
             }
index 5f07c3a..1813932 100644 (file)
@@ -29,6 +29,8 @@ using System.Diagnostics.Contracts;
 
 namespace System.Runtime.Serialization
 {
+    // This class duplicates a class on CoreFX. We are keeping it here -- just this one method --
+    // as it was widely invoked by reflection to workaround it being missing in .NET Core 1.0
     internal static class FormatterServices
     {
         // Gets a new instance of the object.  The entire object is initalized to 0 and no 
@@ -56,28 +58,6 @@ namespace System.Runtime.Serialization
 
         [MethodImplAttribute(MethodImplOptions.InternalCall)]
         private static extern Object nativeGetUninitializedObject(RuntimeType type);
-        private static Binder s_binder = Type.DefaultBinder;
-
-        /*============================LoadAssemblyFromString============================
-        **Action: Loads an assembly from a given string.  The current assembly loading story
-        **        is quite confusing.  If the assembly is in the fusion cache, we can load it
-        **        using the stringized-name which we transmitted over the wire.  If that fails,
-        **        we try for a lookup of the assembly using the simple name which is the first
-        **        part of the assembly name.  If we can't find it that way, we'll return null
-        **        as our failure result.
-        **Returns: The loaded assembly or null if it can't be found.
-        **Arguments: assemblyName -- The stringized assembly name.
-        **Exceptions: None
-        ==============================================================================*/
-        internal static Assembly LoadAssemblyFromString(String assemblyName)
-        {
-            //
-            // Try using the stringized assembly name to load from the fusion cache.
-            //
-            BCLDebug.Trace("SER", "[LoadAssemblyFromString]Looking for assembly: ", assemblyName);
-            Assembly found = Assembly.Load(assemblyName);
-            return found;
-        }
     }
 }
 
diff --git a/src/mscorlib/src/System/Security/Util/URLString.cs b/src/mscorlib/src/System/Security/Util/URLString.cs
deleted file mode 100644 (file)
index 33aac6f..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-//  URLString
-//
-//
-//  Implementation of membership condition for zones
-//
-
-namespace System.Security.Util
-{
-    using System;
-    using System.Collections;
-    using System.Collections.Generic;
-    using System.Runtime.CompilerServices;
-    using System.Runtime.InteropServices;
-    using System.Runtime.Versioning;
-    using System.Runtime.Serialization;
-    using System.Globalization;
-    using System.Text;
-    using System.IO;
-    using System.Diagnostics.Contracts;
-
-    internal static class URLString
-    {
-        internal static string PreProcessForExtendedPathRemoval(bool checkPathLength, string url, bool isFileUrl)
-        {
-            bool isUncShare = false;
-            return PreProcessForExtendedPathRemoval(checkPathLength: checkPathLength, url: url, isFileUrl: isFileUrl, isUncShare: ref isUncShare);
-        }
-
-        // Keeping this signature to avoid reflection breaks
-        private static string PreProcessForExtendedPathRemoval(string url, bool isFileUrl, ref bool isUncShare)
-        {
-            return PreProcessForExtendedPathRemoval(checkPathLength: true, url: url, isFileUrl: isFileUrl, isUncShare: ref isUncShare);
-        }
-
-        private static string PreProcessForExtendedPathRemoval(bool checkPathLength, string url, bool isFileUrl, ref bool isUncShare)
-        {
-            // This is the modified URL that we will return
-            StringBuilder modifiedUrl = new StringBuilder(url);
-
-            // ITEM 1 - remove extended path characters.
-            {
-                // Keep track of where we are in both the comparison and altered strings.
-                int curCmpIdx = 0;
-                int curModIdx = 0;
-
-                // If all the '\' have already been converted to '/', just check for //?/ or //./
-                if ((url.Length - curCmpIdx) >= 4 &&
-                    (String.Compare(url, curCmpIdx, "//?/", 0, 4, StringComparison.OrdinalIgnoreCase) == 0 ||
-                     String.Compare(url, curCmpIdx, "//./", 0, 4, StringComparison.OrdinalIgnoreCase) == 0))
-                {
-                    modifiedUrl.Remove(curModIdx, 4);
-                    curCmpIdx += 4;
-                }
-                else
-                {
-                    if (isFileUrl)
-                    {
-                        // We need to handle an indefinite number of leading front slashes for file URLs since we could
-                        // get something like:
-                        //      file://\\?\
-                        //      file:/\\?\
-                        //      file:\\?\
-                        //      etc...
-                        while (url[curCmpIdx] == '/')
-                        {
-                            curCmpIdx++;
-                            curModIdx++;
-                        }
-                    }
-
-                    // Remove the extended path characters
-                    if ((url.Length - curCmpIdx) >= 4 &&
-                        (String.Compare(url, curCmpIdx, "\\\\?\\", 0, 4, StringComparison.OrdinalIgnoreCase) == 0 ||
-                         String.Compare(url, curCmpIdx, "\\\\?/", 0, 4, StringComparison.OrdinalIgnoreCase) == 0 ||
-                         String.Compare(url, curCmpIdx, "\\\\.\\", 0, 4, StringComparison.OrdinalIgnoreCase) == 0 ||
-                         String.Compare(url, curCmpIdx, "\\\\./", 0, 4, StringComparison.OrdinalIgnoreCase) == 0))
-                    {
-                        modifiedUrl.Remove(curModIdx, 4);
-                        curCmpIdx += 4;
-                    }
-                }
-            }
-
-            // ITEM 2 - convert all slashes to forward slashes, and strip leading slashes.
-            if (isFileUrl)
-            {
-                int slashCount = 0;
-                bool seenFirstBackslash = false;
-
-                while (slashCount < modifiedUrl.Length && (modifiedUrl[slashCount] == '/' || modifiedUrl[slashCount] == '\\'))
-                {
-                    // Look for sets of consecutive backslashes. We can't just look for these at the start
-                    // of the string, since file:// might come first.  Instead, once we see the first \, look
-                    // for a second one following it.
-                    if (!seenFirstBackslash && modifiedUrl[slashCount] == '\\')
-                    {
-                        seenFirstBackslash = true;
-                        if (slashCount + 1 < modifiedUrl.Length && modifiedUrl[slashCount + 1] == '\\')
-                            isUncShare = true;
-                    }
-
-                    slashCount++;
-                }
-
-                modifiedUrl.Remove(0, slashCount);
-                modifiedUrl.Replace('\\', '/');
-            }
-
-            // ITEM 3 - If the path is greater than or equal (due to terminating NULL in windows) MAX_PATH, we throw.
-            if (checkPathLength)
-            {
-                // This needs to be a separate method to avoid hitting the static constructor on AppContextSwitches
-                CheckPathTooLong(modifiedUrl);
-            }
-
-            // Create the result string from the StringBuilder
-            return modifiedUrl.ToString();
-        }
-
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private static void CheckPathTooLong(StringBuilder path)
-        {
-            if (path.Length >= (
-#if PLATFORM_UNIX
-                Interop.Sys.MaxPath))
-#else
-                PathInternal.MaxLongPath))
-#endif
-            {
-                throw new PathTooLongException(SR.IO_PathTooLong);
-            }
-        }
-    }
-}
index 1d74358..589eb54 100644 (file)
@@ -4742,18 +4742,6 @@ typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
 #endif
 
-PALIMPORT
-BOOL
-PALAPI
-GetVersionExW(
-          IN OUT LPOSVERSIONINFOW lpVersionInformation);
-
-#ifdef UNICODE
-#define GetVersionEx GetVersionExW
-#else
-#define GetVersionEx GetVersionExA
-#endif
-
 #define IMAGE_FILE_MACHINE_I386              0x014c
 #define IMAGE_FILE_MACHINE_ARM64             0xAA64  // ARM64 Little-Endian
 
index 2677dd6..554a502 100644 (file)
@@ -293,12 +293,6 @@ FreeEnvironmentStringsA(
 PALIMPORT
 BOOL
 PALAPI
-GetVersionExA(
-          IN OUT LPOSVERSIONINFOA lpVersionInformation);
-
-PALIMPORT
-BOOL
-PALAPI
 RemoveDirectoryA(
                  IN LPCSTR lpPathName);
 
index f21c9db..5314cdf 100644 (file)
@@ -181,7 +181,6 @@ set(SOURCES
   misc/sysinfo.cpp
   misc/time.cpp
   misc/utils.cpp
-  misc/version.cpp
   objmgr/palobjbase.cpp
   objmgr/shmobject.cpp
   objmgr/shmobjectmanager.cpp
index f0bf8f8..bf44124 100644 (file)
 LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
         push  ebp
         mov   ecx, [esp + 12] // ecx: PAL_SEHException * (first argument for ThrowExceptionHelper)
-        mov   ebx, [esp + 8]  // ebx: CONTEXT *
+        mov   eax, [esp + 8]  // ebx: CONTEXT *
 
-        mov   ebp, [ebx + CONTEXT_Ebp]
-        mov   esp, [ebx + CONTEXT_ResumeEsp]
+        mov   ebp, [eax + CONTEXT_Ebp]
+        mov   esp, [eax + CONTEXT_ResumeEsp]
+        mov   ebx, [eax + CONTEXT_Ebx]
+        mov   esi, [eax + CONTEXT_Esi]
+        mov   edi, [eax + CONTEXT_Edi]
 
         // The ESP is re-initialized as the target frame's value, so the current function's
         // CFA is now right at the ESP.
@@ -34,7 +37,8 @@ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
         .cfi_restore ebp
 
         // Store return address to the stack
-        mov     ebx, [ebx + CONTEXT_Eip]
-        push    ebx
+        mov     eax, [eax + CONTEXT_Eip]
+        push    eax
         jmp     EXTERNAL_C_FUNC(ThrowExceptionHelper)
+
 LEAF_END ThrowExceptionFromContextInternal, _TEXT
index fed7b69..9fc1346 100644 (file)
@@ -218,7 +218,13 @@ GetEnvironmentVariableW(
     }
     else if (size == 0)
     {
-        // handle error in GetEnvironmentVariableA
+        // If size is 0, it either means GetEnvironmentVariableA failed, or that
+        // it succeeded and the value of the variable is empty. Check GetLastError
+        // to determine which. If the call failed, we won't touch the buffer.
+        if (GetLastError() == ERROR_SUCCESS)
+        {
+            *lpBuffer = '\0';
+        }
     }
     else
     {
index 2244311..2c52439 100644 (file)
@@ -76,7 +76,7 @@ ErrorString palErrorStrings[] =
     { ERROR_SEM_TIMEOUT, W("The semaphore timeout period has expired.\n") },
     { ERROR_INSUFFICIENT_BUFFER, W("The data area passed to a system call is too small.\n") },
     { ERROR_INVALID_NAME, W("The filename, directory name, or volume label syntax is incorrect.\n") },
-    { ERROR_MOD_NOT_FOUND, W("The specified module could not be found.\n") },
+    { ERROR_MOD_NOT_FOUND, W("The specified module or one of its dependencies could not be found.\n") },
     { ERROR_PROC_NOT_FOUND, W("The specified procedure could not be found.\n") },
     { ERROR_WAIT_NO_CHILDREN, W("There are no child processes to wait for.\n") },
     { ERROR_NEGATIVE_SEEK, W("An attempt was made to move the file pointer before the beginning of the file.\n") },
diff --git a/src/pal/src/misc/version.cpp b/src/pal/src/misc/version.cpp
deleted file mode 100644 (file)
index 7a9f90a..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*++
-
-
-
-Module Name:
-
-    version.c
-
-Abstract:
-
-    Implementation of functions for getting platform.OS versions.
-
-Revision History:
-
-
-
---*/
-
-#include "pal/palinternal.h"
-#include "pal/dbgmsg.h"
-
-SET_DEFAULT_DEBUG_CHANNEL(MISC);
-
-/*++
-Function:
-  GetVersionExA
-
-
-
-GetVersionEx
-
-The GetVersionEx function obtains extended information about the
-version of the operating system that is currently running.
-
-Parameters
-
-lpVersionInfo 
-       [in/out] Pointer to an OSVERSIONINFO data structure that the
-       function fills with operating system version information.
-
-       Before calling the GetVersionEx function, set the
-       dwOSVersionInfoSize member of the OSVERSIONINFO data structure
-       to sizeof(OSVERSIONINFO).
-
-Return Values
-
-If the function succeeds, the return value is a nonzero value.
-
-If the function fails, the return value is zero. To get extended error
-information, call GetLastError. The function fails if you specify an
-invalid value for the dwOSVersionInfoSize member of the OSVERSIONINFO
-structure.
-
---*/
-BOOL
-PALAPI
-GetVersionExA(
-             IN OUT LPOSVERSIONINFOA lpVersionInformation)
-{
-    BOOL bRet = TRUE;
-    PERF_ENTRY(GetVersionExA);
-    ENTRY("GetVersionExA (lpVersionInformation=%p)\n", lpVersionInformation);
-
-    if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA))
-    {
-        lpVersionInformation->dwMajorVersion = 5;       /* same as WIN2000 */
-        lpVersionInformation->dwMinorVersion = 0;       /* same as WIN2000 */
-        lpVersionInformation->dwBuildNumber = 0;
-        lpVersionInformation->dwPlatformId = VER_PLATFORM_UNIX;
-        lpVersionInformation->szCSDVersion[0] = '\0'; /* no service pack */
-    } 
-    else 
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        bRet = FALSE;
-    }
-    LOGEXIT("GetVersionExA returning BOOL %d\n", bRet);
-    PERF_EXIT(GetVersionExA);
-    return bRet;
-}
-
-
-/*++
-Function:
-  GetVersionExW
-
-See GetVersionExA
---*/
-BOOL
-PALAPI
-GetVersionExW(
-             IN OUT LPOSVERSIONINFOW lpVersionInformation)
-{
-    BOOL bRet = TRUE;
-
-    PERF_ENTRY(GetVersionExW);
-    ENTRY("GetVersionExW (lpVersionInformation=%p)\n", lpVersionInformation);
-
-    if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOW))
-    {
-        lpVersionInformation->dwMajorVersion = 5;       /* same as WIN2000 */
-        lpVersionInformation->dwMinorVersion = 0;       /* same as WIN2000 */
-        lpVersionInformation->dwBuildNumber = 0;
-        lpVersionInformation->dwPlatformId = VER_PLATFORM_UNIX;
-        lpVersionInformation->szCSDVersion[0] = '\0'; /* no service pack */
-    } 
-    else 
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        bRet =  FALSE;
-    }
-    LOGEXIT("GetVersionExW returning BOOL %d\n", bRet);
-    PERF_EXIT(GetVersionExW);
-    return bRet;
-}
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExA/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/GetVersionExA/CMakeLists.txt
deleted file mode 100644 (file)
index f6aa0cb..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12.2)
-
-add_subdirectory(test1)
-
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/CMakeLists.txt
deleted file mode 100644 (file)
index 1e512f3..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12.2)
-
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
-set(SOURCES
-  test.cpp
-)
-
-add_executable(paltest_getversionexa_test1
-  ${SOURCES}
-)
-
-add_dependencies(paltest_getversionexa_test1 coreclrpal)
-
-target_link_libraries(paltest_getversionexa_test1
-  ${COMMON_TEST_LIBRARIES}
-)
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/test.cpp b/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/test.cpp
deleted file mode 100644 (file)
index 5dd20c6..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*============================================================
-**
-** Source : test.c
-**
-** Purpose: Test for GetVersionExA() function
-**
-**
-**=========================================================*/
-
-#include <palsuite.h>
-
-int __cdecl main(int argc, char *argv[]) {
-       
-    OSVERSIONINFO TheVersionInfo;
-    OSVERSIONINFO* pVersionInfo = &TheVersionInfo;
-
-    /*
-     * Initialize the PAL and return FAILURE if this fails
-     */
-
-    if(0 != (PAL_Initialize(argc, argv)))
-    {
-        return FAIL;
-    }
-
-    /* This needs to be done before using GetVersionEx */
-    pVersionInfo->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-  
-    /* If GetVersionEx fails, then the test fails */
-    if(GetVersionEx(pVersionInfo) == 0) 
-    {
-        Fail("ERROR: The GetVersionEx function returned 0, which indicates "
-             "failure.");    
-    }
-  
-    /* These values are fixed, ensure they're set properly */
-    if(pVersionInfo->dwMajorVersion != 5) 
-    {
-        Fail("ERROR: The fixed value of dwMajorVersion shoud be 5, "
-             "but is really %d.",pVersionInfo->dwMajorVersion);
-    }
-
-    /* The minor version values for Win2k and XP are different 
-    for Win2k minor version equals 0 and for XP minor version
-    equals 1.  Both values are excepted here. */
-    if((pVersionInfo->dwMinorVersion != 0) && 
-       (pVersionInfo->dwMinorVersion != 1)) 
-    {
-        Fail("ERROR: The fixed value of dwMinorVersion shoud be 0 or 1, "
-             "but is really %d.",pVersionInfo->dwMinorVersion);
-    }
-    if(pVersionInfo->dwBuildNumber_PAL_Undefined < 0) 
-    {
-        Fail("ERROR: The value of dwBuildNumber shoud be at least 0, but "
-             "is really %d.",pVersionInfo->dwBuildNumber_PAL_Undefined);
-    }
-
-#if !WIN32
-    /* Under BSD, the PlatformID should be UNIX and the Service Pack
-       version should be set to "".
-    */
-
-    if(pVersionInfo->dwPlatformId != VER_PLATFORM_UNIX ||
-       pVersionInfo->szCSDVersion_PAL_Undefined[0] != 0) 
-    {
-        Fail("ERROR: The dwPlatformId should be %d but is really %d.  And the "
-             "szCSDVerion should be NULL.",
-             VER_PLATFORM_UNIX,pVersionInfo->dwPlatformId);
-    }
-#endif
-    
-    PAL_Terminate();
-    return PASS;
-}
-
-
-
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/testinfo.dat b/src/pal/tests/palsuite/miscellaneous/GetVersionExA/test1/testinfo.dat
deleted file mode 100644 (file)
index 1e9c570..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-Version = 1.0
-Section = Miscellaneous
-Function = GetVersionExA
-Name = Positive Test for GetVersionExA
-TYPE = DEFAULT
-EXE1 = test
-Description
-= Test that all the values in the OSVERSION structure are set properly
-= for the current environment.
-
-
-
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExW/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/GetVersionExW/CMakeLists.txt
deleted file mode 100644 (file)
index f6aa0cb..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12.2)
-
-add_subdirectory(test1)
-
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/CMakeLists.txt
deleted file mode 100644 (file)
index 4ef820c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12.2)
-
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
-set(SOURCES
-  test.cpp
-)
-
-add_executable(paltest_getversionexw_test1
-  ${SOURCES}
-)
-
-add_dependencies(paltest_getversionexw_test1 coreclrpal)
-
-target_link_libraries(paltest_getversionexw_test1
-  ${COMMON_TEST_LIBRARIES}
-)
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/test.cpp b/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/test.cpp
deleted file mode 100644 (file)
index 69aae54..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*============================================================
-**
-** Source : test.c
-**
-** Purpose: Test for GetVersionExW() function
-**
-**
-**=========================================================*/
-
-#define UNICODE
-
-#include <palsuite.h>
-
-int __cdecl main(int argc, char *argv[]) 
-{
-       
-    OSVERSIONINFO TheVersionInfo;
-    OSVERSIONINFO* pVersionInfo = &TheVersionInfo;
-    /*
-     * Initialize the PAL and return FAILURE if this fails
-     */
-
-    if(0 != (PAL_Initialize(argc, argv)))
-    {
-        return FAIL;
-    }
-
-    /* This needs to be done before using GetVersionEx */
-    pVersionInfo->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-  
-    /* If GetVersionEx fails, then the test fails */
-    if(GetVersionEx(pVersionInfo) == 0) 
-    {
-        Fail("ERROR: The GetVersionEx function returned 0, which indicates " 
-             "failure.");
-    }
-  
-    /* These values are fixed, ensure they're set properly */
-    if(pVersionInfo->dwMajorVersion != 5) 
-    {
-        Fail("ERROR: The fixed value of dwMajorVersion shoud be 5, but is "
-             " really %d.",pVersionInfo->dwMajorVersion);
-    }
-
-    /* The minor version values for Win2k and XP are different 
-       for Win2k minor version equals 0 and for XP minor version
-       equals 1.  Both values are excepted here. */
-    if((pVersionInfo->dwMinorVersion != 0) && 
-       (pVersionInfo->dwMinorVersion != 1)) 
-    {
-        Fail("ERROR: The fixed value of dwMinorVersion shoud be 0 or 1, "
-             "but is really %d.",pVersionInfo->dwMinorVersion);
-    }
-
-    if(pVersionInfo->dwBuildNumber_PAL_Undefined < 0) 
-    {
-        Fail("ERROR: The value of dwBuildNumber shoud be at least 0, but is "
-             "really %d.",pVersionInfo->dwBuildNumber_PAL_Undefined);
-    }
-
-#if !WIN32
-
-
-    /* Under BSD, the PlatformID should be UNIX and the Service Pack
-       version should be set to "".
-    */
-
-    if(pVersionInfo->dwPlatformId != VER_PLATFORM_UNIX ||
-       pVersionInfo->szCSDVersion_PAL_Undefined[0] != 0) 
-    {
-        Fail("ERROR: The dwPlatformId should be %d but is really %d.  And the "
-             "szCSDVerion should be NULL.",VER_PLATFORM_UNIX,
-             pVersionInfo->dwPlatformId);
-    }
-#endif
-  
-    
-    PAL_Terminate();
-    return PASS;
-}
-
-
-
diff --git a/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/testinfo.dat b/src/pal/tests/palsuite/miscellaneous/GetVersionExW/test1/testinfo.dat
deleted file mode 100644 (file)
index 7773245..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-Version = 1.0
-Section = Miscellaneous
-Function = GetVersionExW
-Name = Positive Test for GetVersionExW
-TYPE = DEFAULT
-EXE1 = test
-Description
-= Test that all the values in the OSVERSION structure are set properly
-= for the current environment.
-
-
-
index f7a293a..3f9469d 100644 (file)
@@ -144,8 +144,6 @@ miscellaneous/GetDateFormatW/GetDateFormatW_neg1/paltest_getdateformatw_getdatef
 miscellaneous/GetDateFormatW/GetDateFormatW_neg2/paltest_getdateformatw_getdateformatw_neg2
 miscellaneous/GetDateFormatW/test1/paltest_getdateformatw_test1
 miscellaneous/GetUserNameW/test1/paltest_getusernamew_test1
-miscellaneous/GetVersionExA/test1/paltest_getversionexa_test1
-miscellaneous/GetVersionExW/test1/paltest_getversionexw_test1
 miscellaneous/InterLockedExchangeAdd/test1/paltest_interlockedexchangeadd_test1
 miscellaneous/IsBadCodePtr/test1/paltest_isbadcodeptr_test1
 miscellaneous/IsBadReadPtr/test1/paltest_isbadreadptr_test1
index 6c264cb..924a365 100755 (executable)
@@ -139,6 +139,17 @@ if [[ -n "$CROSSCOMPILE" ]]; then
     fi
     cmake_extra_defines="$cmake_extra_defines -C $CONFIG_DIR/tryrun.cmake"
     cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$CONFIG_DIR/toolchain.cmake"
+    cmake_extra_defines="$cmake_extra_defines -DCLR_UNIX_CROSS_BUILD=1"
+fi
+if [ $OS == "Linux" ]; then
+    linux_id_file="/etc/os-release"
+    if [[ -n "$CROSSCOMPILE" ]]; then
+        linux_id_file="$ROOTFS_DIR/$linux_id_file"
+    fi
+    if [[ -e $linux_id_file ]]; then
+        source $linux_id_file
+        cmake_extra_defines="$cmake_extra_defines -DCLR_CMAKE_LINUX_ID=$ID"
+    fi
 fi
 if [ "$build_arch" == "armel" ]; then
     cmake_extra_defines="$cmake_extra_defines -DARM_SOFTFP=1"
index 2c184d1..5ce6e16 100644 (file)
@@ -76,7 +76,7 @@ OOPStackUnwinderX86::VirtualUnwind(
 
     FillRegDisplay(&rd, ContextRecord);
 
-    rd.SP = ContextRecord->ResumeEsp;
+    rd.SP = ContextRecord->Esp;
     rd.PCTAddr = (UINT_PTR)&(ContextRecord->Eip);
 
     if (ContextPointers)
index 27b7a4a..dfe830d 100644 (file)
@@ -1,10 +1,6 @@
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
-if(WIN32)
-    add_compile_options(/wd4996)
-endif(WIN32)
-
 set(UTILCODE_COMMON_SOURCES
   clrhost_nodependencies.cpp
   ccomprc.cpp
index d760765..e8b16de 100644 (file)
         RestoreRegMS 26, X26
         RestoreRegMS 27, X27
         RestoreRegMS 28, X28
+        RestoreRegMS 29, X29
 
 Done
         ; Its imperative that the return value of HelperMethodFrameRestoreState is zero
@@ -991,16 +992,6 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup
 
         ; This helper enables us to call into a funclet after restoring Fp register
         NESTED_ENTRY CallEHFunclet
-
-        ; Using below prolog instead of PROLOG_SAVE_REG_PAIR fp,lr, #-16!
-        ; is intentional. Above statement would also emit instruction to save
-        ; sp in fp. If sp is saved in fp in prolog then it is not expected that fp can change in the body
-        ; of method. However, this method needs to be able to change fp before calling funclet.
-        ; This is required to access locals in funclet.
-        PROLOG_SAVE_REG_PAIR x19,x20, #-16!
-        PROLOG_SAVE_REG   fp, #0
-        PROLOG_SAVE_REG   lr, #8
-
         ; On entry:
         ;
         ; X0 = throwable        
@@ -1008,17 +999,42 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup
         ; X2 = address of X19 register in CONTEXT record; used to restore the non-volatile registers of CrawlFrame
         ; X3 = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
         ;
+
+        ; Using below prolog instead of PROLOG_SAVE_REG_PAIR fp,lr, #-16!
+        ; is intentional. Above statement would also emit instruction to save
+        ; sp in fp. If sp is saved in fp in prolog then it is not expected that fp can change in the body
+        ; of method. However, this method needs to be able to change fp before calling funclet.
+        ; This is required to access locals in funclet.
+        PROLOG_SAVE_REG_PAIR_NO_FP fp,lr, #-96!
+
+        ; Spill callee saved registers
+        PROLOG_SAVE_REG_PAIR   x19, x20, 16
+        PROLOG_SAVE_REG_PAIR   x21, x22, 32
+        PROLOG_SAVE_REG_PAIR   x23, x24, 48
+        PROLOG_SAVE_REG_PAIR   x25, x26, 64
+        PROLOG_SAVE_REG_PAIR   x27, x28, 80
+
         ; Save the SP of this function. We cannot store SP directly.
         mov fp, sp
         str fp, [x3]
 
+        ldp x19, x20, [x2, #0]
+        ldp x21, x22, [x2, #16]
+        ldp x23, x24, [x2, #32]
+        ldp x25, x26, [x2, #48]
+        ldp x27, x28, [x2, #64]
         ldr fp, [x2, #80] ; offset of fp in CONTEXT relative to X19
 
         ; Invoke the funclet
         blr x1
         nop
 
-        EPILOG_RESTORE_REG_PAIR   fp, lr, #16!
+        EPILOG_RESTORE_REG_PAIR   x19, x20, 16
+        EPILOG_RESTORE_REG_PAIR   x21, x22, 32
+        EPILOG_RESTORE_REG_PAIR   x23, x24, 48
+        EPILOG_RESTORE_REG_PAIR   x25, x26, 64
+        EPILOG_RESTORE_REG_PAIR   x27, x28, 80
+        EPILOG_RESTORE_REG_PAIR   fp, lr, #96!
         EPILOG_RETURN
 
         NESTED_END CallEHFunclet
index fdaa981..4d6ba26 100644 (file)
@@ -266,9 +266,9 @@ BOOL BaseAssemblySpec::CompareRefToDef(const BaseAssemblySpec *pRef, const BaseA
     }
 
     //
-    // flags are non-optional, except processor architecture and content type
+    // flags are non-optional, except processor architecture, content type, and debuggable attribute bits
     //
-    DWORD dwFlagsMask = ~(afPA_FullMask | afContentType_Mask);
+    DWORD dwFlagsMask = ~(afPA_FullMask | afContentType_Mask | afDebuggableAttributeMask);
     if ((pRef->m_dwFlags & dwFlagsMask) != (pDef->m_dwFlags & dwFlagsMask))
         return FALSE;
 
index b8c1387..d5d0962 100644 (file)
@@ -3397,24 +3397,4 @@ void ContractRegressionCheck()
 
 #endif // ENABLE_CONTRACTS_IMPL
 
-
 #endif // CROSSGEN_COMPILE
-
-
-//
-// GetOSVersion - Gets the real OS version bypassing the OS compatibility shim
-// Mscoree.dll resides in System32 dir and is always excluded from compat shim.
-// This function calls mscoree!shim function via mscoreei ICLRRuntimeHostInternal interface
-// to get the OS version. We do not do this PAL or coreclr..we direclty call the OS
-// in that case.
-//
-BOOL GetOSVersion(LPOSVERSIONINFO lposVer)
-{
-// Fix for warnings when building against WinBlue build 9444.0.130614-1739
-// warning C4996: 'GetVersionExW': was declared deprecated
-// externalapis\windows\winblue\sdk\inc\sysinfoapi.h(442)
-// Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
-#pragma warning( disable : 4996 )
-    return WszGetVersionEx(lposVer);
-#pragma warning( default : 4996 )
-}
index ad4c519..c2632f7 100644 (file)
@@ -985,6 +985,13 @@ PTR_VOID GetUnwindDataBlob(TADDR moduleBase, PTR_RUNTIME_FUNCTION pRuntimeFuncti
 
     return pUnwindInfo;
 
+#elif defined(_TARGET_X86_) && defined(FEATURE_PAL)
+    PTR_UNWIND_INFO pUnwindInfo(dac_cast<PTR_UNWIND_INFO>(moduleBase + RUNTIME_FUNCTION__GetUnwindInfoAddress(pRuntimeFunction)));
+
+    *pSize = ALIGN_UP(sizeof(UNWIND_INFO), sizeof(DWORD));
+
+    return pUnwindInfo;
+
 #elif defined(_TARGET_ARM_)
 
     // if this function uses packed unwind data then at least one of the two least significant bits
index 253ebbb..2193c5a 100644 (file)
@@ -2418,14 +2418,11 @@ void DomainAssembly::GetCurrentVersionInfo(CORCOMPILE_VERSION_INFO *pNativeVersi
                                           &fForceProfiling,
                                           &fForceInstrument);
 
-    OSVERSIONINFOW osInfo;
-    osInfo.dwOSVersionInfoSize = sizeof(osInfo);
-    if (!GetOSVersion(&osInfo))
-        _ASSERTE(!"GetOSVersion failed");
-
-    _ASSERTE(osInfo.dwMajorVersion < 999);
-    _ASSERTE(osInfo.dwMinorVersion < 999);
-    pNativeVersionInfo->wOSPlatformID = (WORD) osInfo.dwPlatformId;
+#ifndef FEATURE_PAL 
+    pNativeVersionInfo->wOSPlatformID = VER_PLATFORM_WIN32_NT;
+#else
+    pNativeVersionInfo->wOSPlatformID = VER_PLATFORM_UNIX;
+#endif    
 
     // The native images should be OS-version agnostic. Do not store the actual OS version for determinism.
     // pNativeVersionInfo->wOSMajorVersion = (WORD) osInfo.dwMajorVersion;
index ad73135..415926e 100644 (file)
@@ -170,8 +170,6 @@ FCFuncStart(gDateTimeFuncs)
 FCFuncEnd()
 
 FCFuncStart(gEnvironmentFuncs)
-    FCFuncElement("GetVersion", SystemNative::GetOSVersion)
-    FCFuncElement("GetVersionEx", SystemNative::GetOSVersionEx)
     FCFuncElement("get_TickCount", SystemNative::GetTickCount)
     QCFuncElement("_Exit", SystemNative::Exit)
     FCFuncElement("set_ExitCode", SystemNative::SetExitCode)
@@ -181,7 +179,7 @@ FCFuncStart(gEnvironmentFuncs)
     FCFuncElement("GetCommandLineArgsNative", SystemNative::GetCommandLineArgs)
     FCFuncElement("get_CurrentProcessorNumber", SystemNative::GetCurrentProcessorNumber)
 
-#if defined(FEATURE_COMINTEROP) && !defined(FEATURE_CORESYSTEM)
+#if defined(FEATURE_COMINTEROP)
     QCFuncElement("WinRTSupported", SystemNative::WinRTSupported)
 #endif // FEATURE_COMINTEROP
     FCFuncElementSig("FailFast", &gsig_SM_Str_RetVoid, SystemNative::FailFast)
index 18bc24a..aff2507 100644 (file)
@@ -3815,7 +3815,10 @@ bool UnwindEbpDoubleAlignFrame(
         // TODO Currently we assume that ESP of funclet frames is always fixed but actually it could change.
         if (pCodeInfo->IsFunclet())
         {
-            baseSP = curESP + 12; // padding for 16byte stack alignment allocated in genFuncletProlog()
+            // Set baseSP as initial SP
+            baseSP = pContext->pCurrentContext->ResumeEsp;
+            // 16-byte stack alignment padding (allocated in genFuncletProlog)
+            baseSP += 12;
 
             pContext->PCTAddr = baseSP;
             pContext->ControlPC = *PTR_PCODE(pContext->PCTAddr);
@@ -4163,6 +4166,14 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
         GC_NOTRIGGER;
     } CONTRACTL_END;
 
+#ifdef WIN64EXCEPTIONS
+    if (flags & ParentOfFuncletStackFrame)
+    {
+        LOG((LF_GCROOTS, LL_INFO100000, "Not reporting this frame because it was already reported via another funclet.\n"));
+        return true;
+    }
+#endif // WIN64EXCEPTIONS
+
     GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
     unsigned  curOffs = pCodeInfo->GetRelOffset();
 
@@ -4752,6 +4763,18 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
     _ASSERTE(*castto(table, unsigned short *)++ == 0xBABE);
 #endif
 
+#ifdef WIN64EXCEPTIONS   // funclets
+    //
+    // If we're in a funclet, we do not want to report the incoming varargs.  This is
+    // taken care of by the parent method and the funclet should access those arguments
+    // by way of the parent method's stack frame.
+    //
+    if(pCodeInfo->IsFunclet())
+    {
+        return true;
+    }
+#endif // WIN64EXCEPTIONS
+
     /* Are we a varargs function, if so we have to report all args
        except 'this' (note that the GC tables created by the x86 jit
        do not contain ANY arguments except 'this' (even if they
index b708f17..1eb8938 100644 (file)
@@ -4310,27 +4310,6 @@ HRESULT ETW::CEtwTracer::Register()
 {
     WRAPPER_NO_CONTRACT;
 
-#ifndef FEATURE_CORESYSTEM
-    OSVERSIONINFO osVer;
-    osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-
-    if (GetOSVersion(&osVer) == FALSE) {
-        return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-    }
-    else if (osVer.dwMajorVersion < ETW_SUPPORTED_MAJORVER) {
-        return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-    }
-
-    // if running on OS < Longhorn, skip registration unless reg key is set
-    // since ETW reg is expensive (in both time and working set) on older OSes
-    if (osVer.dwMajorVersion < ETW_ENABLED_MAJORVER && !g_fEnableETW && !CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_PreVistaETWEnabled))
-        return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-
-    // If running on OS >= Longhorn, skip registration if ETW is not enabled
-    if (osVer.dwMajorVersion >= ETW_ENABLED_MAJORVER && !g_fEnableETW && !CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_VistaAndAboveETWEnabled))
-        return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-#endif
-
     EventRegisterMicrosoft_Windows_DotNETRuntime();
     EventRegisterMicrosoft_Windows_DotNETRuntimePrivate();
     EventRegisterMicrosoft_Windows_DotNETRuntimeRundown();
index f3c139e..a652359 100644 (file)
 #include "comcallablewrapper.h"
 #endif // FEATURE_COMINTEROP
 
+// the method table for the WeakReference class
+extern MethodTable* pWeakReferenceMT;
+
+// The canonical method table for WeakReference<T>
+extern MethodTable* pWeakReferenceOfTCanonMT;
+
+// Finalizes a weak reference directly.
+extern void FinalizeWeakReference(Object* obj);
+
 void GCToEEInterface::SuspendEE(SUSPEND_REASON reason)
 {
     WRAPPER_NO_CONTRACT;
@@ -1359,3 +1368,16 @@ bool GCToEEInterface::ShouldFinalizeObjectForUnload(AppDomain* pDomain, Object*
     // to move them to a new app domain instead of finalizing them here.
     return true;
 }
+
+bool GCToEEInterface::EagerFinalized(Object* obj)
+{
+    MethodTable* pMT = obj->GetGCSafeMethodTable();
+    if (pMT == pWeakReferenceMT ||
+        pMT->GetCanonicalMethodTable() == pWeakReferenceOfTCanonMT)
+    {
+        FinalizeWeakReference(obj);
+        return true;
+    }
+
+    return false;
+}
index 030eb71..5eb3e3d 100644 (file)
@@ -46,6 +46,7 @@ public:
     void EnableFinalization(bool foundFinalizers);
     void HandleFatalError(unsigned int exitCode);
     bool ShouldFinalizeObjectForUnload(AppDomain* pDomain, Object* obj);
+    bool EagerFinalized(Object* obj);
 };
 
 #endif // FEATURE_STANDALONE_GC
index 30a6a38..1f2bedf 100644 (file)
@@ -398,7 +398,10 @@ HRESULT FunctionMember::GetLocalsDebugInfo(NotifyGdb::PTK_TypeInfoMap pTypeMap,
     {
         if (FindNativeInfoInILVariable(0, startNativeOffset, &locals.pVars, locals.countVars, &nativeVar) == S_OK)
         {
-            vars[0].m_var_type = GetTypeInfoFromTypeHandle(TypeHandle(md->GetMethodTable()), pTypeMap, method);
+            TypeHandle th = TypeHandle(md->GetMethodTable());
+            if (th.IsValueType())
+                th = th.MakePointer();
+            vars[0].m_var_type = GetTypeInfoFromTypeHandle(th, pTypeMap, method);
             vars[0].m_var_name = new char[strlen("this") + 1];
             strcpy(vars[0].m_var_name, "this");
             vars[0].m_il_index = 0;
index a19d2a8..0ab23f1 100644 (file)
@@ -966,6 +966,14 @@ DYNAMICHELPER (DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_Objec
 
 #endif // FEATURE_READYTORUN
 
+//
+// Entry stack:
+//    dispatch token
+//    siteAddrForRegisterIndirect (used only if this is a RegisterIndirect dispatch call)
+//    return address of caller to stub
+//
+// Please see vm/i386/virtualcallstubcpu.hpp for details
+//
 NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, NoHandler
     //
     // The stub arguments are where we want to setup the TransitionBlock. We will
@@ -987,32 +995,40 @@ NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, NoHandler
 
     mov         esi, esp
 
+    #define STACK_ALIGN_PADDING 8
+
+    sub         esp, STACK_ALIGN_PADDING
     push        [esi + 4*4]     // dispatch token
     push        [esi + 5*4]     // siteAddrForRegisterIndirect
     push        esi             // pTransitionBlock
 
     // Setup up proper EBP frame now that the stub arguments can be trashed
-    mov         [esi + 4*4],ebx
-    mov         [esi + 5*4],ebp
+    mov         [esi + 4*4], ebx
+    mov         [esi + 5*4], ebp
     lea         ebp, [esi + 5*4]
 
     // Make the call
+    CHECK_STACK_ALIGNMENT
     call        C_FUNC(VSD_ResolveWorker)
 
+    add         esp, STACK_ALIGN_PADDING
+
+    #undef STACK_ALIGN_PADDING
+
     // From here on, mustn't trash eax
 
     // pop ArgumentRegisters
-    pop     edx
-    pop     ecx
+    pop         edx
+    pop         ecx
 
     // pop CalleeSavedRegisters
-    pop edi
-    pop esi
-    pop ebx
-    pop ebp
+    pop         edi
+    pop         esi
+    pop         ebx
+    pop         ebp
 
     // Now jump to the target
-    jmp     eax             // continue on into the method
+    jmp         eax // continue on into the method
 NESTED_END ResolveWorkerAsmStub, _TEXT
 
 #ifdef FEATURE_STUBS_AS_IL
index 248deac..338c274 100644 (file)
@@ -8719,7 +8719,6 @@ CORINFO_METHOD_HANDLE CEEInfo::resolveVirtualMethodHelper(CORINFO_METHOD_HANDLE
                                                           CORINFO_CONTEXT_HANDLE ownerType)
 {
     CONTRACTL {
-        SO_TOLERANT;
         THROWS;
         GC_TRIGGERS;
         MODE_PREEMPTIVE;
@@ -9917,15 +9916,12 @@ void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut)
     pEEInfoOut->maxUncheckedOffsetForNullObject = MAX_UNCHECKED_OFFSET_FOR_NULL_OBJECT;
     pEEInfoOut->targetAbi = CORINFO_CORECLR_ABI;
 
-    OSVERSIONINFO   sVerInfo;
-    sVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-    GetOSVersion(&sVerInfo);
-
     pEEInfoOut->osType = CORINFO_WINNT;
 
-    pEEInfoOut->osMajor = sVerInfo.dwMajorVersion;
-    pEEInfoOut->osMinor = sVerInfo.dwMinorVersion;
-    pEEInfoOut->osBuild = sVerInfo.dwBuildNumber;
+    // hardcode OS version to 0.0.0. These fields can be removed from JITEE interface
+    pEEInfoOut->osMajor = 0;
+    pEEInfoOut->osMinor = 0;
+    pEEInfoOut->osBuild = 0;
 
     EE_TO_JIT_TRANSITION();
 }
index e646771..67639e9 100644 (file)
@@ -285,7 +285,7 @@ PCODE MethodDesc::MakeJitWorker(COR_ILMETHOD_DECODER* ILHeader, CORJIT_FLAGS fla
     bool fBackgroundThread = flags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_MCJIT_BACKGROUND);
 #endif
 
-    // If this is the first stage of a tiered compilation progression, use min-opt, otherwise
+    // If this is the first stage of a tiered compilation progression, use tier0, otherwise
     // use default compilation options
 #ifdef FEATURE_TIERED_COMPILATION
     if (!IsEligibleForTieredCompilation())
@@ -295,7 +295,7 @@ PCODE MethodDesc::MakeJitWorker(COR_ILMETHOD_DECODER* ILHeader, CORJIT_FLAGS fla
     else
     {
         fStable = FALSE;
-        flags.Add(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_MIN_OPT));
+        flags.Add(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_TIER0));
     }
 #endif
 
index 623556d..b85cf9a 100644 (file)
@@ -53,7 +53,7 @@ MethodDesc * ReadyToRunInfo::GetMethodDescForEntryPoint(PCODE entryPoint)
     }
     CONTRACTL_END;
 
-#ifdef _TARGET_AMD64_
+#if defined(_TARGET_AMD64_) || (defined(_TARGET_X86_) && defined(FEATURE_PAL))
     // A normal method entry point is always 8 byte aligned, but a funclet can start at an odd address.
     // Since PtrHashMap can't handle odd pointers, check for this case and return NULL.
     if ((entryPoint & 0x1) != 0)
index 64378db..2032e66 100644 (file)
@@ -300,7 +300,7 @@ PCODE TieredCompilationManager::CompileMethod(MethodDesc* pMethod)
     EX_TRY
     {
         CORJIT_FLAGS flags = CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_MCJIT_BACKGROUND);
-        flags.Add(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_SPEED_OPT));
+        flags.Add(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_TIER1));
 
         if (pMethod->IsDynamicMethod())
         {
index e54e884..ead385d 100644 (file)
@@ -1202,6 +1202,30 @@ void ZapUnwindData::Save(ZapWriter * pZapWriter)
 #endif //REDHAWK
 }
 
+#elif defined(_TARGET_X86_) && defined(FEATURE_PAL)
+
+UINT ZapUnwindData::GetAlignment()
+{
+    return sizeof(BYTE);
+}
+
+DWORD ZapUnwindData::GetSize()
+{
+    DWORD dwSize = ZapBlob::GetSize();
+
+    return dwSize;
+}
+
+void ZapUnwindData::Save(ZapWriter * pZapWriter)
+{
+    ZapImage * pImage = ZapImage::GetImage(pZapWriter);
+
+    PVOID pData = GetData();
+    DWORD dwSize = GetBlobSize();
+
+    pZapWriter->Write(pData, dwSize);
+}
+
 #elif defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
 
 UINT ZapUnwindData::GetAlignment()
index 40eb20a..ee641ef 100644 (file)
@@ -1,8 +1,8 @@
 ## This list file has been produced automatically. Any changes
 ## are subject to being overwritten when reproducing this file.
 ## 
-## Last Updated: 27-Feb-2017 16:38:10
-## Commit: 740b64d2513c68f8455444a90f477010f71093bf
+## Last Updated: 31-Mar-2017 09:36:29
+## Commit: 2401b6ed08252d48831bfd804c3533cd0142c76c
 ## 
 [Dev10_535767.cmd_0]
 RelativePath=baseservices\compilerservices\dynamicobjectproperties\Dev10_535767\Dev10_535767.cmd
@@ -9988,310 +9988,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 
-[DateTimeCompare.cmd_1248]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCompare\DateTimeCompare.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCompare
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCompareTo1.cmd_1249]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCompareTo1\DateTimeCompareTo1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCompareTo1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCtor1.cmd_1250]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCtor1\DateTimeCtor1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCtor1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCtor3.cmd_1251]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCtor3\DateTimeCtor3.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCtor3
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCtor4.cmd_1252]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCtor4\DateTimeCtor4.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCtor4
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCtor6.cmd_1253]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCtor6\DateTimeCtor6.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCtor6
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeCtor7.cmd_1254]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeCtor7\DateTimeCtor7.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeCtor7
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeDate.cmd_1255]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeDate\DateTimeDate.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeDate
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeGetHashCode.cmd_1256]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeGetHashCode\DateTimeGetHashCode.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeGetHashCode
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeHour.cmd_1257]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeHour\DateTimeHour.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeHour
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeKind.cmd_1258]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeKind\DateTimeKind.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeKind
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeMaxValue.cmd_1259]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeMaxValue\DateTimeMaxValue.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeMaxValue
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeMillisecond.cmd_1260]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeMillisecond\DateTimeMillisecond.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeMillisecond
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeMinute.cmd_1261]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeMinute\DateTimeMinute.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeMinute
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeMinValue.cmd_1262]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeMinValue\DateTimeMinValue.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeMinValue
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeNow.cmd_1263]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeNow\DateTimeNow.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeNow
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParse1.cmd_1264]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParse1\DateTimeParse1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParse1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParse2.cmd_1265]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParse2\DateTimeParse2.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParse2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParse3.cmd_1266]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParse3\DateTimeParse3.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParse3
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParseExact1.cmd_1267]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParseExact1\DateTimeParseExact1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParseExact1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParseExact2.cmd_1268]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParseExact2\DateTimeParseExact2.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParseExact2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeParseExact3.cmd_1269]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeParseExact3\DateTimeParseExact3.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeParseExact3
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeSecond.cmd_1270]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeSecond\DateTimeSecond.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeSecond
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeSubtract1.cmd_1271]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeSubtract1\DateTimeSubtract1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeSubtract1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeSubtract2.cmd_1272]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeSubtract2\DateTimeSubtract2.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeSubtract2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeTicks.cmd_1273]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeTicks\DateTimeTicks.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeTicks
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeTimeOfDay.cmd_1274]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeTimeOfDay\DateTimeTimeOfDay.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeTimeOfDay
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimetoday.cmd_1275]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimetoday\DateTimetoday.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimetoday
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToFileTime.cmd_1276]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToFileTime\DateTimeToFileTime.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToFileTime
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToFileTimeUtc.cmd_1277]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToFileTimeUtc\DateTimeToFileTimeUtc.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToFileTimeUtc
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToLocalTime.cmd_1278]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToLocalTime\DateTimeToLocalTime.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToLocalTime
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToString1.cmd_1279]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToString1\DateTimeToString1.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToString1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToString2.cmd_1280]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToString2\DateTimeToString2.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToString2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeToString3.cmd_1281]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeToString3\DateTimeToString3.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeToString3
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeUtcNow.cmd_1282]
-RelativePath=CoreMangLib\cti\system\datetime\DateTimeUtcNow\DateTimeUtcNow.cmd
-WorkingDir=CoreMangLib\cti\system\datetime\DateTimeUtcNow
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeKindLocal.cmd_1283]
-RelativePath=CoreMangLib\cti\system\datetimekind\DateTimeKindLocal\DateTimeKindLocal.cmd
-WorkingDir=CoreMangLib\cti\system\datetimekind\DateTimeKindLocal
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeKindUnspecified.cmd_1284]
-RelativePath=CoreMangLib\cti\system\datetimekind\DateTimeKindUnspecified\DateTimeKindUnspecified.cmd
-WorkingDir=CoreMangLib\cti\system\datetimekind\DateTimeKindUnspecified
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeKindUtc.cmd_1285]
-RelativePath=CoreMangLib\cti\system\datetimekind\DateTimeKindUtc\DateTimeKindUtc.cmd
-WorkingDir=CoreMangLib\cti\system\datetimekind\DateTimeKindUtc
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
 [DayOfWeekFriday.cmd_1286]
 RelativePath=CoreMangLib\cti\system\dayofweek\DayOfWeekFriday\DayOfWeekFriday.cmd
 WorkingDir=CoreMangLib\cti\system\dayofweek\DayOfWeekFriday
@@ -11412,1094 +11108,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 
-[CalendarWeekRuleFirstDay.cmd_1426]
-RelativePath=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstDay\CalendarWeekRuleFirstDay.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstDay
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CalendarWeekRuleFirstFourDayWeek.cmd_1427]
-RelativePath=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstFourDayWeek\CalendarWeekRuleFirstFourDayWeek.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstFourDayWeek
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CalendarWeekRuleFirstFullWeek.cmd_1428]
-RelativePath=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstFullWeek\CalendarWeekRuleFirstFullWeek.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\calendarweekrule\CalendarWeekRuleFirstFullWeek
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CharUnicodeInfoGetNumericValue1.cmd_1429]
-RelativePath=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetNumericValue1\CharUnicodeInfoGetNumericValue1.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetNumericValue1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CharUnicodeInfoGetNumericValue2.cmd_1430]
-RelativePath=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetNumericValue2\CharUnicodeInfoGetNumericValue2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetNumericValue2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CharUnicodeInfoGetUnicodeCategory1.cmd_1431]
-RelativePath=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetUnicodeCategory1\CharUnicodeInfoGetUnicodeCategory1.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetUnicodeCategory1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CharUnicodeInfoGetUnicodeCategory2.cmd_1432]
-RelativePath=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetUnicodeCategory2\CharUnicodeInfoGetUnicodeCategory2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\charunicodeinfo\CharUnicodeInfoGetUnicodeCategory2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareInfoCompare2.cmd_1433]
-RelativePath=CoreMangLib\cti\system\globalization\compareinfo\CompareInfoCompare2\CompareInfoCompare2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareinfo\CompareInfoCompare2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareInfoIndexOf2.cmd_1434]
-RelativePath=CoreMangLib\cti\system\globalization\compareinfo\CompareInfoIndexOf2\CompareInfoIndexOf2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareinfo\CompareInfoIndexOf2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsIgnoreCase.cmd_1435]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreCase\CompareOptionsIgnoreCase.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreCase
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsIgnoreKanaType.cmd_1436]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreKanaType\CompareOptionsIgnoreKanaType.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreKanaType
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsIgnoreNonSpace.cmd_1437]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreNonSpace\CompareOptionsIgnoreNonSpace.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreNonSpace
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsIgnoreSymbols.cmd_1438]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreSymbols\CompareOptionsIgnoreSymbols.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreSymbols
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsIgnoreWidth.cmd_1439]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreWidth\CompareOptionsIgnoreWidth.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsIgnoreWidth
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsNone.cmd_1440]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsNone\CompareOptionsNone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsNone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsOrdinal.cmd_1441]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsOrdinal\CompareOptionsOrdinal.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsOrdinal
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsOrdinalIgoreCase.cmd_1442]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsOrdinalIgoreCase\CompareOptionsOrdinalIgoreCase.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsOrdinalIgoreCase
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CompareOptionsStringSort.cmd_1443]
-RelativePath=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsStringSort\CompareOptionsStringSort.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\compareoptions\CompareOptionsStringSort
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoClone.cmd_1444]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoClone\CultureInfoClone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoClone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoEnglishName.cmd_1445]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoEnglishName\CultureInfoEnglishName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoEnglishName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoEquals.cmd_1446]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoEquals\CultureInfoEquals.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoEquals
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoGetCultureInfo2.cmd_1447]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoGetCultureInfo2\CultureInfoGetCultureInfo2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoGetCultureInfo2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoGetHashCode.cmd_1448]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoGetHashCode\CultureInfoGetHashCode.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoGetHashCode
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoInvariantCulture.cmd_1449]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoInvariantCulture\CultureInfoInvariantCulture.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoInvariantCulture
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoIsNeutralCulture.cmd_1450]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoIsNeutralCulture\CultureInfoIsNeutralCulture.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoIsNeutralCulture
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoName.cmd_1451]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoName\CultureInfoName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoNativeName.cmd_1452]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoNativeName\CultureInfoNativeName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoNativeName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoParent.cmd_1453]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoParent\CultureInfoParent.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoParent
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoReadOnly.cmd_1454]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoReadOnly\CultureInfoReadOnly.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoReadOnly
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoTextInfo.cmd_1455]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoTextInfo\CultureInfoTextInfo.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoTextInfo
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoToString.cmd_1456]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoToString\CultureInfoToString.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoToString
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[CultureInfoTwoLetterISOLanguageName.cmd_1457]
-RelativePath=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoTwoLetterISOLanguageName\CultureInfoTwoLetterISOLanguageName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\cultureinfo\CultureInfoTwoLetterISOLanguageName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoClone.cmd_1458]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoClone\DateTimeFormatInfoClone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoClone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoCurrentInfo.cmd_1459]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoCurrentInfo\DateTimeFormatInfoCurrentInfo.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoCurrentInfo
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoGetAbbreviatedMonthName.cmd_1460]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetAbbreviatedMonthName\DateTimeFormatInfoGetAbbreviatedMonthName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetAbbreviatedMonthName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoGetFormat.cmd_1461]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetFormat\DateTimeFormatInfoGetFormat.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetFormat
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoGetInstance.cmd_1462]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetInstance\DateTimeFormatInfoGetInstance.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetInstance
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoGetMonthName.cmd_1463]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetMonthName\DateTimeFormatInfoGetMonthName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoGetMonthName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoInvariantInfo.cmd_1464]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoInvariantInfo\DateTimeFormatInfoInvariantInfo.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoInvariantInfo
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoIsReadOnly.cmd_1465]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoIsReadOnly\DateTimeFormatInfoIsReadOnly.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoIsReadOnly
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoReadOnly.cmd_1466]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoReadOnly\DateTimeFormatInfoReadOnly.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoReadOnly
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoRFC1123Pattern.cmd_1467]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoRFC1123Pattern\DateTimeFormatInfoRFC1123Pattern.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoRFC1123Pattern
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeFormatInfoSortableDateTimePattern.cmd_1468]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoSortableDateTimePattern\DateTimeFormatInfoSortableDateTimePattern.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\DateTimeFormatInfoSortableDateTimePattern
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UniversalSortableDateTimePattern.cmd_1469]
-RelativePath=CoreMangLib\cti\system\globalization\datetimeformatinfo\UniversalSortableDateTimePattern\UniversalSortableDateTimePattern.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimeformatinfo\UniversalSortableDateTimePattern
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStyleAllowInnerWhite.cmd_1470]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStyleAllowInnerWhite\DateTimeStyleAllowInnerWhite.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStyleAllowInnerWhite
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAdjustToUniversal.cmd_1471]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAdjustToUniversal\DateTimeStylesAdjustToUniversal.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAdjustToUniversal
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAllowLeadingWhite.cmd_1472]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowLeadingWhite\DateTimeStylesAllowLeadingWhite.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowLeadingWhite
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAllowTrailingWhite.cmd_1473]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowTrailingWhite\DateTimeStylesAllowTrailingWhite.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowTrailingWhite
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAllowWhiteSpaces.cmd_1474]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowWhiteSpaces\DateTimeStylesAllowWhiteSpaces.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAllowWhiteSpaces
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAssumeLocal.cmd_1475]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAssumeLocal\DateTimeStylesAssumeLocal.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAssumeLocal
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesAssumeUniversal.cmd_1476]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAssumeUniversal\DateTimeStylesAssumeUniversal.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesAssumeUniversal
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesNoCurrentDateDefault.cmd_1477]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesNoCurrentDateDefault\DateTimeStylesNoCurrentDateDefault.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesNoCurrentDateDefault
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesNone.cmd_1478]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesNone\DateTimeStylesNone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesNone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[DateTimeStylesRoundTripKind.cmd_1479]
-RelativePath=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesRoundTripKind\DateTimeStylesRoundTripKind.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\datetimestyles\DateTimeStylesRoundTripKind
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoClone.cmd_1480]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoClone\NumberFormatInfoClone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoClone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoCtor.cmd_1481]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCtor\NumberFormatInfoCtor.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCtor
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoCurrencyDecimalSeparator.cmd_1482]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCurrencyDecimalSeparator\NumberFormatInfoCurrencyDecimalSeparator.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCurrencyDecimalSeparator
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoCurrencyGroupSeparator.cmd_1483]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCurrencyGroupSeparator\NumberFormatInfoCurrencyGroupSeparator.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoCurrencyGroupSeparator
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoGetFormat.cmd_1484]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoGetFormat\NumberFormatInfoGetFormat.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoGetFormat
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoGetInstance.cmd_1485]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoGetInstance\NumberFormatInfoGetInstance.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoGetInstance
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberFormatInfoReadOnly.cmd_1486]
-RelativePath=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoReadOnly\NumberFormatInfoReadOnly.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberformatinfo\NumberFormatInfoReadOnly
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowCurrencySymbol.cmd_1487]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowCurrencySymbol\NumberStylesAllowCurrencySymbol.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowCurrencySymbol
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowDecimalPoint.cmd_1488]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowDecimalPoint\NumberStylesAllowDecimalPoint.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowDecimalPoint
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowExponent.cmd_1489]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowExponent\NumberStylesAllowExponent.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowExponent
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowHexSpecifier.cmd_1490]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowHexSpecifier\NumberStylesAllowHexSpecifier.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowHexSpecifier
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowLeadingSign.cmd_1491]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowLeadingSign\NumberStylesAllowLeadingSign.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowLeadingSign
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowLeadingWhite.cmd_1492]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowLeadingWhite\NumberStylesAllowLeadingWhite.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowLeadingWhite
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowParentheses.cmd_1493]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowParentheses\NumberStylesAllowParentheses.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowParentheses
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowThousands.cmd_1494]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowThousands\NumberStylesAllowThousands.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowThousands
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowTrailingSign.cmd_1495]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowTrailingSign\NumberStylesAllowTrailingSign.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowTrailingSign
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAllowTrailingWhite.cmd_1496]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowTrailingWhite\NumberStylesAllowTrailingWhite.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAllowTrailingWhite
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesAny.cmd_1497]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAny\NumberStylesAny.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesAny
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesCurrency.cmd_1498]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesCurrency\NumberStylesCurrency.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesCurrency
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesFloat.cmd_1499]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesFloat\NumberStylesFloat.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesFloat
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesHexNumber.cmd_1500]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesHexNumber\NumberStylesHexNumber.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesHexNumber
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesInteger.cmd_1501]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesInteger\NumberStylesInteger.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesInteger
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesNone.cmd_1502]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesNone\NumberStylesNone.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesNone
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[NumberStylesNumber.cmd_1503]
-RelativePath=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesNumber\NumberStylesNumber.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\numberstyles\NumberStylesNumber
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoEquals.cmd_1505]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoEquals\RegionInfoEquals.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoEquals
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoGetHashCode.cmd_1506]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoGetHashCode\RegionInfoGetHashCode.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoGetHashCode
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoIsMetric.cmd_1507]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoIsMetric\RegionInfoIsMetric.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoIsMetric
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoISOCurrencySymbol.cmd_1508]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoISOCurrencySymbol\RegionInfoISOCurrencySymbol.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoISOCurrencySymbol
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoName.cmd_1509]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoName\RegionInfoName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoToString.cmd_1510]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoToString\RegionInfoToString.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoToString
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[RegionInfoTwoLetterISORegionName.cmd_1511]
-RelativePath=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoTwoLetterISORegionName\RegionInfoTwoLetterISORegionName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\regioninfo\RegionInfoTwoLetterISORegionName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoCtor1.cmd_1512]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoCtor1\StringInfoCtor1.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoCtor1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoCtor2.cmd_1513]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoCtor2\StringInfoCtor2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoCtor2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoEquals.cmd_1514]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoEquals\StringInfoEquals.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoEquals
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoGetHashCode.cmd_1515]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetHashCode\StringInfoGetHashCode.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetHashCode
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoGetNextTextElement2.cmd_1516]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetNextTextElement2\StringInfoGetNextTextElement2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetNextTextElement2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoGetTextElementEnumerator1.cmd_1517]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetTextElementEnumerator1\StringInfoGetTextElementEnumerator1.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetTextElementEnumerator1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoGetTextElementEnumerator2.cmd_1518]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetTextElementEnumerator2\StringInfoGetTextElementEnumerator2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoGetTextElementEnumerator2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoLengthInTextElements.cmd_1519]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoLengthInTextElements\StringInfoLengthInTextElements.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoLengthInTextElements
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoParseCombiningCharacters.cmd_1520]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoParseCombiningCharacters\StringInfoParseCombiningCharacters.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoParseCombiningCharacters
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[StringInfoString.cmd_1521]
-RelativePath=CoreMangLib\cti\system\globalization\stringinfo\StringInfoString\StringInfoString.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\stringinfo\StringInfoString
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextElementEnumeratorCurrent.cmd_1522]
-RelativePath=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorCurrent\TextElementEnumeratorCurrent.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorCurrent
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextElementEnumeratorElementIndex.cmd_1523]
-RelativePath=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorElementIndex\TextElementEnumeratorElementIndex.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorElementIndex
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextElementEnumeratorGetTextElement.cmd_1524]
-RelativePath=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorGetTextElement\TextElementEnumeratorGetTextElement.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorGetTextElement
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextElementEnumeratorMoveNext.cmd_1525]
-RelativePath=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorMoveNext\TextElementEnumeratorMoveNext.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorMoveNext
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextElementEnumeratorReset.cmd_1526]
-RelativePath=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorReset\TextElementEnumeratorReset.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textelementenumerator\TextElementEnumeratorReset
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoCultureName.cmd_1527]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoCultureName\TextInfoCultureName.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoCultureName
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoEquals.cmd_1528]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoEquals\TextInfoEquals.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoEquals
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoGetHashCode.cmd_1529]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoGetHashCode\TextInfoGetHashCode.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoGetHashCode
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoIsReadOnly.cmd_1530]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoIsReadOnly\TextInfoIsReadOnly.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoIsReadOnly
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoToString.cmd_1531]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoToString\TextInfoToString.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoToString
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoToUpper1.cmd_1532]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoToUpper1\TextInfoToUpper1.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoToUpper1
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[TextInfoToUpper2.cmd_1533]
-RelativePath=CoreMangLib\cti\system\globalization\textinfo\TextInfoToUpper2\TextInfoToUpper2.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\textinfo\TextInfoToUpper2
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryClosePunctuation.cmd_1534]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryClosePunctuation\UnicodeCategoryClosePunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryClosePunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryConnectorPunctuation.cmd_1535]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryConnectorPunctuation\UnicodeCategoryConnectorPunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryConnectorPunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryControl.cmd_1536]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryControl\UnicodeCategoryControl.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryControl
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryDashPunctuation.cmd_1537]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryDashPunctuation\UnicodeCategoryDashPunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryDashPunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryDecimalDigitNumber.cmd_1538]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryDecimalDigitNumber\UnicodeCategoryDecimalDigitNumber.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryDecimalDigitNumber
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryEnclosingMark.cmd_1539]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryEnclosingMark\UnicodeCategoryEnclosingMark.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryEnclosingMark
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryFinalQuotePunctuation.cmd_1540]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryFinalQuotePunctuation\UnicodeCategoryFinalQuotePunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryFinalQuotePunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryFormat.cmd_1541]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryFormat\UnicodeCategoryFormat.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryFormat
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryInitialQuotePunctuation.cmd_1542]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryInitialQuotePunctuation\UnicodeCategoryInitialQuotePunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryInitialQuotePunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryLetterNumber.cmd_1543]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLetterNumber\UnicodeCategoryLetterNumber.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLetterNumber
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryLineSeparator.cmd_1544]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLineSeparator\UnicodeCategoryLineSeparator.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLineSeparator
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryLowercaseLetter.cmd_1545]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLowercaseLetter\UnicodeCategoryLowercaseLetter.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryLowercaseLetter
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryMathSymbol.cmd_1546]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryMathSymbol\UnicodeCategoryMathSymbol.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryMathSymbol
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryModifierLetter.cmd_1547]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryModifierLetter\UnicodeCategoryModifierLetter.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryModifierLetter
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryModifierSymbol.cmd_1548]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryModifierSymbol\UnicodeCategoryModifierSymbol.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryModifierSymbol
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryNonSpacingMark.cmd_1549]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryNonSpacingMark\UnicodeCategoryNonSpacingMark.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryNonSpacingMark
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOpenPunctuation.cmd_1550]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOpenPunctuation\UnicodeCategoryOpenPunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOpenPunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOtherLetter.cmd_1551]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherLetter\UnicodeCategoryOtherLetter.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherLetter
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOtherNotAssigned.cmd_1552]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherNotAssigned\UnicodeCategoryOtherNotAssigned.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherNotAssigned
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOtherNumber.cmd_1553]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherNumber\UnicodeCategoryOtherNumber.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherNumber
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOtherPunctuation.cmd_1554]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherPunctuation\UnicodeCategoryOtherPunctuation.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherPunctuation
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryOtherSymbol.cmd_1555]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherSymbol\UnicodeCategoryOtherSymbol.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryOtherSymbol
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryParagraphSeparator.cmd_1556]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryParagraphSeparator\UnicodeCategoryParagraphSeparator.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryParagraphSeparator
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryPrivateUse.cmd_1557]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryPrivateUse\UnicodeCategoryPrivateUse.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryPrivateUse
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategorySpaceSeparator.cmd_1558]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySpaceSeparator\UnicodeCategorySpaceSeparator.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySpaceSeparator
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategorySpacingCombiningMark.cmd_1559]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySpacingCombiningMark\UnicodeCategorySpacingCombiningMark.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySpacingCombiningMark
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategorySurrogate.cmd_1560]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySurrogate\UnicodeCategorySurrogate.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategorySurrogate
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryTitlecaseLetter.cmd_1561]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryTitlecaseLetter\UnicodeCategoryTitlecaseLetter.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryTitlecaseLetter
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
-[UnicodeCategoryUppercaseLetter.cmd_1562]
-RelativePath=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryUppercaseLetter\UnicodeCategoryUppercaseLetter.cmd
-WorkingDir=CoreMangLib\cti\system\globalization\unicodecategory\UnicodeCategoryUppercaseLetter
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
 [GuidCompareTo1_cti.cmd_1563]
 RelativePath=CoreMangLib\cti\system\guid\GuidCompareTo1_cti\GuidCompareTo1_cti.cmd
 WorkingDir=CoreMangLib\cti\system\guid\GuidCompareTo1_cti
@@ -22684,14 +21292,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 
-[Co7510ParseExact_formatarray.cmd_2836]
-RelativePath=CoreMangLib\system\datetime\Co7510ParseExact_formatarray\Co7510ParseExact_formatarray.cmd
-WorkingDir=CoreMangLib\system\datetime\Co7510ParseExact_formatarray
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
 [NegativeGenerics.cmd_2837]
 RelativePath=CoreMangLib\system\delegate\generics\NegativeGenerics\NegativeGenerics.cmd
 WorkingDir=CoreMangLib\system\delegate\generics\NegativeGenerics
@@ -22764,14 +21364,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri1;RT;EXPECTED_PASS
 HostStyle=0
 
-[Shift_Jis.cmd_2846]
-RelativePath=CoreMangLib\system\text\encoding\Shift_Jis\Shift_Jis.cmd
-WorkingDir=CoreMangLib\system\text\encoding\Shift_Jis
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_PASS
-HostStyle=0
-
 [Version_Parsing.cmd_2847]
 RelativePath=CoreMangLib\system\version\Version_Parsing\Version_Parsing.cmd
 WorkingDir=CoreMangLib\system\version\Version_Parsing
@@ -59953,7 +58545,7 @@ RelativePath=JIT\Methodical\stringintern\_XModuletest4-xmod\_XModuletest4-xmod.c
 WorkingDir=JIT\Methodical\stringintern\_XModuletest4-xmod
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_PASSPASSPASSPASS
+Categories=Pri0;EXPECTED_PASSPASSPASSPASS;EXPECTED_PASS
 HostStyle=0
 
 [structinregs.cmd_7583]
@@ -63500,14 +62092,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri0;EXPECTED_PASS
 HostStyle=0
 
-[DeltaBlue.cmd_8033]
-RelativePath=JIT\Performance\CodeQuality\V8\DeltaBlue\DeltaBlue\DeltaBlue.cmd
-WorkingDir=JIT\Performance\CodeQuality\V8\DeltaBlue\DeltaBlue
-Expected=0
-MaxAllowedDurationSeconds=1000
-Categories=GCSTRESS_FAIL;Pri0;LONG_RUNNING;ISSUE_6065;EXPECTED_PASS
-HostStyle=0
-
 [Richards.cmd_8034]
 RelativePath=JIT\Performance\CodeQuality\V8\Richards\Richards\Richards.cmd
 WorkingDir=JIT\Performance\CodeQuality\V8\Richards\Richards
@@ -70484,14 +69068,6 @@ MaxAllowedDurationSeconds=600
 Categories=Pri0;JIT;EXPECTED_PASS
 HostStyle=0
 
-[b475589.cmd_8932]
-RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-RTM\b475589\b475589\b475589.cmd
-WorkingDir=JIT\Regression\CLR-x86-JIT\V2.0-RTM\b475589\b475589
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_FAIL;8156
-HostStyle=0
-
 [b487364.cmd_8933]
 RelativePath=JIT\Regression\CLR-x86-JIT\V2.0-RTM\b487364\b487364\b487364.cmd
 WorkingDir=JIT\Regression\CLR-x86-JIT\V2.0-RTM\b487364\b487364
@@ -73988,14 +72564,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS
 HostStyle=0
 
-[VSW491668.cmd_9372]
-RelativePath=Loader\classloader\generics\GenericMethods\VSW491668\VSW491668.cmd
-WorkingDir=Loader\classloader\generics\GenericMethods\VSW491668
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=NEW;EXPECTED_FAIL;8156
-HostStyle=0
-
 [abstract01.cmd_9373]
 RelativePath=Loader\classloader\generics\Instantiation\Negative\abstract01\abstract01.cmd
 WorkingDir=Loader\classloader\generics\Instantiation\Negative\abstract01
@@ -79348,14 +77916,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsByte.cmd_10042]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsByte\ConstantArgsByte.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsByte
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated1478.cmd_10043]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1478\Generated1478\Generated1478.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1478\Generated1478
@@ -80828,14 +79388,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsShort.cmd_10227]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsShort\ConstantArgsShort.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsShort
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated908.cmd_10228]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest908\Generated908\Generated908.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest908\Generated908
@@ -81908,14 +80460,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsInt.cmd_10362]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsInt\ConstantArgsInt.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsInt
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated1297.cmd_10363]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1297\Generated1297\Generated1297.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1297\Generated1297
@@ -83076,14 +81620,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsLong.cmd_10508]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsLong\ConstantArgsLong.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsLong
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated1013.cmd_10509]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1013\Generated1013\Generated1013.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1013\Generated1013
@@ -83468,14 +82004,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsULong.cmd_10557]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsULong\ConstantArgsULong.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsULong
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated331.cmd_10558]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest331\Generated331\Generated331.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest331\Generated331
@@ -84660,14 +83188,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsSByte.cmd_10706]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsSByte\ConstantArgsSByte.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsSByte
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated806.cmd_10707]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest806\Generated806\Generated806.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest806\Generated806
@@ -85668,14 +84188,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsFloat.cmd_10832]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsFloat\ConstantArgsFloat.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsFloat
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated716.cmd_10833]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest716\Generated716\Generated716.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest716\Generated716
@@ -86196,14 +84708,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsString.cmd_10898]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsString\ConstantArgsString.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsString
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [mcc_i02.cmd_10899]
 RelativePath=JIT\jit64\mcc\interop\mcc_i02\mcc_i02.cmd
 WorkingDir=JIT\jit64\mcc\interop\mcc_i02
@@ -86652,14 +85156,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_FAIL;4851;NEW
 HostStyle=0
 
-[ConstantArgsUInt.cmd_10955]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsUInt\ConstantArgsUInt.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsUInt
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated1228.cmd_10956]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1228\Generated1228\Generated1228.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1228\Generated1228
@@ -86876,14 +85372,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsUShort.cmd_10983]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsUShort\ConstantArgsUShort.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsUShort
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated1165.cmd_10984]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1165\Generated1165\Generated1165.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest1165\Generated1165
@@ -87932,14 +86420,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsChar.cmd_11115]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsChar\ConstantArgsChar.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsChar
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated553.cmd_11116]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest553\Generated553\Generated553.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest553\Generated553
@@ -90921,7 +89401,7 @@ RelativePath=JIT\Performance\CodeQuality\Span\SpanBench\SpanBench.cmd
 WorkingDir=JIT\Performance\CodeQuality\Span\SpanBench
 Expected=0
 MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
+Categories=EXPECTED_FAIL;10544;NEW
 HostStyle=0
 
 [Generated1202.cmd_11489]
@@ -91260,14 +89740,6 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
-[ConstantArgsDouble.cmd_11531]
-RelativePath=JIT\Performance\CodeQuality\Inlining\ConstantArgsDouble\ConstantArgsDouble.cmd
-WorkingDir=JIT\Performance\CodeQuality\Inlining\ConstantArgsDouble
-Expected=0
-MaxAllowedDurationSeconds=600
-Categories=EXPECTED_PASS;NEW
-HostStyle=0
-
 [Generated539.cmd_11532]
 RelativePath=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest539\Generated539\Generated539.cmd
 WorkingDir=Loader\classloader\TypeGeneratorTests\TypeGeneratorTest539\Generated539
@@ -91532,3 +90004,531 @@ MaxAllowedDurationSeconds=600
 Categories=EXPECTED_PASS;NEW
 HostStyle=0
 
+[MathFCos.cmd_11565]
+RelativePath=CoreMangLib\cti\system\mathf\MathFCos\MathFCos.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFCos
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[sealeddefault.cmd_11566]
+RelativePath=JIT\opt\Devirtualization\sealeddefault\sealeddefault.cmd
+WorkingDir=JIT\opt\Devirtualization\sealeddefault
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[StringReplace3.cmd_11567]
+RelativePath=CoreMangLib\cti\system\string\StringReplace3\StringReplace3.cmd
+WorkingDir=CoreMangLib\cti\system\string\StringReplace3
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFRound1.cmd_11568]
+RelativePath=CoreMangLib\cti\system\mathf\MathFRound1\MathFRound1.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFRound1
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ArrayJagged.cmd_11569]
+RelativePath=JIT\CodeGenBringUpTests\ArrayJagged\ArrayJagged.cmd
+WorkingDir=JIT\CodeGenBringUpTests\ArrayJagged
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFFloor.cmd_11570]
+RelativePath=CoreMangLib\cti\system\mathf\MathFFloor\MathFFloor.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFFloor
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[comparable.cmd_11571]
+RelativePath=JIT\opt\Devirtualization\comparable\comparable.cmd
+WorkingDir=JIT\opt\Devirtualization\comparable
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[sealedmethod.cmd_11572]
+RelativePath=JIT\opt\Devirtualization\sealedmethod\sealedmethod.cmd
+WorkingDir=JIT\opt\Devirtualization\sealedmethod
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[generic.cmd_11573]
+RelativePath=JIT\opt\Devirtualization\generic\generic.cmd
+WorkingDir=JIT\opt\Devirtualization\generic
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ForeignThreadExceptions.cmd_11574]
+RelativePath=Exceptions\ForeignThread\ForeignThreadExceptions\ForeignThreadExceptions.cmd
+WorkingDir=Exceptions\ForeignThread\ForeignThreadExceptions
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_FAIL;10636;NEW
+HostStyle=0
+
+[MathFExp.cmd_11575]
+RelativePath=CoreMangLib\cti\system\mathf\MathFExp\MathFExp.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFExp
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFMax.cmd_11576]
+RelativePath=CoreMangLib\cti\system\mathf\MathFMax\MathFMax.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFMax
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFAtan2.cmd_11577]
+RelativePath=CoreMangLib\cti\system\mathf\MathFAtan2\MathFAtan2.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFAtan2
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFAtan.cmd_11578]
+RelativePath=CoreMangLib\cti\system\mathf\MathFAtan\MathFAtan.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFAtan
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFRound2.cmd_11579]
+RelativePath=CoreMangLib\cti\system\mathf\MathFRound2\MathFRound2.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFRound2
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[fromcollection.cmd_11580]
+RelativePath=JIT\opt\Devirtualization\fromcollection\fromcollection.cmd
+WorkingDir=JIT\opt\Devirtualization\fromcollection
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[GitHub_9651.cmd_11581]
+RelativePath=JIT\Regression\JitBlue\GitHub_9651\GitHub_9651\GitHub_9651.cmd
+WorkingDir=JIT\Regression\JitBlue\GitHub_9651\GitHub_9651
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[overload.cmd_11582]
+RelativePath=JIT\opt\Devirtualization\overload\overload.cmd
+WorkingDir=JIT\opt\Devirtualization\overload
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFIEEERemainder.cmd_11583]
+RelativePath=CoreMangLib\cti\system\mathf\MathFIEEERemainder\MathFIEEERemainder.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFIEEERemainder
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFCosh.cmd_11584]
+RelativePath=CoreMangLib\cti\system\mathf\MathFCosh\MathFCosh.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFCosh
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ArrayExc.cmd_11585]
+RelativePath=JIT\CodeGenBringUpTests\ArrayExc\ArrayExc.cmd
+WorkingDir=JIT\CodeGenBringUpTests\ArrayExc
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFSqrt.cmd_11586]
+RelativePath=CoreMangLib\cti\system\mathf\MathFSqrt\MathFSqrt.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFSqrt
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Vector3GetHash_r.cmd_11587]
+RelativePath=JIT\SIMD\Vector3GetHash_r\Vector3GetHash_r.cmd
+WorkingDir=JIT\SIMD\Vector3GetHash_r
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[CoreFX_15913.cmd_11588]
+RelativePath=JIT\Regression\JitBlue\CoreFX_15913\CoreFX_15913\CoreFX_15913.cmd
+WorkingDir=JIT\Regression\JitBlue\CoreFX_15913\CoreFX_15913
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFMin.cmd_11589]
+RelativePath=CoreMangLib\cti\system\mathf\MathFMin\MathFMin.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFMin
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[sealedclass.cmd_11590]
+RelativePath=JIT\opt\Devirtualization\sealedclass\sealedclass.cmd
+WorkingDir=JIT\opt\Devirtualization\sealedclass
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Array4.cmd_11591]
+RelativePath=JIT\CodeGenBringUpTests\Array4\Array4.cmd
+WorkingDir=JIT\CodeGenBringUpTests\Array4
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[override.cmd_11592]
+RelativePath=JIT\opt\Devirtualization\override\override.cmd
+WorkingDir=JIT\opt\Devirtualization\override
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[enum.cmd_11593]
+RelativePath=JIT\opt\Devirtualization\enum\enum.cmd
+WorkingDir=JIT\opt\Devirtualization\enum
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Array3.cmd_11594]
+RelativePath=JIT\CodeGenBringUpTests\Array3\Array3.cmd
+WorkingDir=JIT\CodeGenBringUpTests\Array3
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFSin.cmd_11595]
+RelativePath=CoreMangLib\cti\system\mathf\MathFSin\MathFSin.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFSin
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[CheckProjects.cmd_11596]
+RelativePath=JIT\CheckProjects\CheckProjects\CheckProjects.cmd
+WorkingDir=JIT\CheckProjects\CheckProjects
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_FAIL;10635;NEW
+HostStyle=0
+
+[ArrayMD1.cmd_11597]
+RelativePath=JIT\CodeGenBringUpTests\ArrayMD1\ArrayMD1.cmd
+WorkingDir=JIT\CodeGenBringUpTests\ArrayMD1
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFLog10.cmd_11598]
+RelativePath=CoreMangLib\cti\system\mathf\MathFLog10\MathFLog10.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFLog10
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFSign.cmd_11599]
+RelativePath=CoreMangLib\cti\system\mathf\MathFSign\MathFSign.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFSign
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFE.cmd_11600]
+RelativePath=CoreMangLib\cti\system\mathf\MathFE\MathFE.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFE
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFCeiling.cmd_11601]
+RelativePath=CoreMangLib\cti\system\mathf\MathFCeiling\MathFCeiling.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFCeiling
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[GitHub_10311.cmd_11602]
+RelativePath=JIT\opt\Devirtualization\GitHub_10311\GitHub_10311.cmd
+WorkingDir=JIT\opt\Devirtualization\GitHub_10311
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[late.cmd_11603]
+RelativePath=JIT\opt\Devirtualization\late\late.cmd
+WorkingDir=JIT\opt\Devirtualization\late
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[inlinedevirt.cmd_11604]
+RelativePath=JIT\opt\Devirtualization\inlinedevirt\inlinedevirt.cmd
+WorkingDir=JIT\opt\Devirtualization\inlinedevirt
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFSinh.cmd_11605]
+RelativePath=CoreMangLib\cti\system\mathf\MathFSinh\MathFSinh.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFSinh
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFPI.cmd_11606]
+RelativePath=CoreMangLib\cti\system\mathf\MathFPI\MathFPI.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFPI
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFAbs.cmd_11607]
+RelativePath=CoreMangLib\cti\system\mathf\MathFAbs\MathFAbs.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFAbs
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[sharedoverride.cmd_11608]
+RelativePath=JIT\opt\Devirtualization\sharedoverride\sharedoverride.cmd
+WorkingDir=JIT\opt\Devirtualization\sharedoverride
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFTan.cmd_11609]
+RelativePath=CoreMangLib\cti\system\mathf\MathFTan\MathFTan.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFTan
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Vector3GetHash_ro.cmd_11610]
+RelativePath=JIT\SIMD\Vector3GetHash_ro\Vector3GetHash_ro.cmd
+WorkingDir=JIT\SIMD\Vector3GetHash_ro
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[exacttype.cmd_11611]
+RelativePath=JIT\opt\Devirtualization\exacttype\exacttype.cmd
+WorkingDir=JIT\opt\Devirtualization\exacttype
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[simple.cmd_11612]
+RelativePath=JIT\opt\Devirtualization\simple\simple.cmd
+WorkingDir=JIT\opt\Devirtualization\simple
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Array2.cmd_11613]
+RelativePath=JIT\CodeGenBringUpTests\Array2\Array2.cmd
+WorkingDir=JIT\CodeGenBringUpTests\Array2
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[GitHub_9945.cmd_11614]
+RelativePath=JIT\opt\Devirtualization\GitHub_9945\GitHub_9945.cmd
+WorkingDir=JIT\opt\Devirtualization\GitHub_9945
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[DeadThreads.cmd_11615]
+RelativePath=baseservices\threading\DeadThreads\DeadThreads\DeadThreads.cmd
+WorkingDir=baseservices\threading\DeadThreads\DeadThreads
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ldtokenmember.cmd_11616]
+RelativePath=reflection\ldtoken\ldtokenmember\ldtokenmember.cmd
+WorkingDir=reflection\ldtoken\ldtokenmember
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFLog.cmd_11617]
+RelativePath=CoreMangLib\cti\system\mathf\MathFLog\MathFLog.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFLog
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[Array1.cmd_11618]
+RelativePath=JIT\CodeGenBringUpTests\Array1\Array1.cmd
+WorkingDir=JIT\CodeGenBringUpTests\Array1
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFAcos.cmd_11619]
+RelativePath=CoreMangLib\cti\system\mathf\MathFAcos\MathFAcos.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFAcos
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFPow.cmd_11620]
+RelativePath=CoreMangLib\cti\system\mathf\MathFPow\MathFPow.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFPow
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[covariance.cmd_11621]
+RelativePath=JIT\opt\Devirtualization\covariance\covariance.cmd
+WorkingDir=JIT\opt\Devirtualization\covariance
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ArrBoundUnsigned.cmd_11622]
+RelativePath=JIT\opt\AssertionPropagation\ArrBoundUnsigned\ArrBoundUnsigned.cmd
+WorkingDir=JIT\opt\AssertionPropagation\ArrBoundUnsigned
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[GitHub_9891.cmd_11623]
+RelativePath=JIT\Regression\JitBlue\GitHub_9891\GitHub_9891\GitHub_9891.cmd
+WorkingDir=JIT\Regression\JitBlue\GitHub_9891\GitHub_9891
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[DynMethodJumpStubTests.cmd_11624]
+RelativePath=CoreMangLib\cti\system\reflection\emit\DynMethodJumpStubTests\DynMethodJumpStubTests\DynMethodJumpStubTests.cmd
+WorkingDir=CoreMangLib\cti\system\reflection\emit\DynMethodJumpStubTests\DynMethodJumpStubTests
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[MathFTanh.cmd_11625]
+RelativePath=CoreMangLib\cti\system\mathf\MathFTanh\MathFTanh.cmd
+WorkingDir=CoreMangLib\cti\system\mathf\MathFTanh
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ArrayMD2.cmd_11626]
+RelativePath=JIT\CodeGenBringUpTests\ArrayMD2\ArrayMD2.cmd
+WorkingDir=JIT\CodeGenBringUpTests\ArrayMD2
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[contravariance.cmd_11627]
+RelativePath=JIT\opt\Devirtualization\contravariance\contravariance.cmd
+WorkingDir=JIT\opt\Devirtualization\contravariance
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[k-nucleotide.cmd_11628]
+RelativePath=JIT\Performance\CodeQuality\BenchmarksGame\k-nucleotide\k-nucleotide\k-nucleotide.cmd
+WorkingDir=JIT\Performance\CodeQuality\BenchmarksGame\k-nucleotide\k-nucleotide
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[ArrayObj.cmd_11629]
+RelativePath=JIT\CodeGenBringUpTests\ArrayObj\ArrayObj.cmd
+WorkingDir=JIT\CodeGenBringUpTests\ArrayObj
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
+[GitHub_9945_2.cmd_11630]
+RelativePath=JIT\opt\Devirtualization\GitHub_9945_2\GitHub_9945_2.cmd
+WorkingDir=JIT\opt\Devirtualization\GitHub_9945_2
+Expected=0
+MaxAllowedDurationSeconds=600
+Categories=EXPECTED_PASS;NEW
+HostStyle=0
+
index e542278..4ed8032 100644 (file)
@@ -34,7 +34,7 @@ from collections import defaultdict
 
 g_arm64ci_path = os.path.join(os.environ["USERPROFILE"], "bin")
 g_dotnet_url = "https://go.microsoft.com/fwlink/?LinkID=831469"
-g_test_url = "https://clrjit.blob.core.windows.net/arm64ci/CoreCLRTests-28d04376fe54aea392d75d478bd468f14d134e67.zip"
+g_test_url = "https://clrjit.blob.core.windows.net/arm64ci/CoreCLR-Pri1Testing.zip"
 g_x64_client_url = "https://clrjit.blob.core.windows.net/arm64ci/x64_client.zip"
 
 ################################################################################
index 16fe10c..67b7076 100644 (file)
@@ -23,10 +23,11 @@ pushd linker\corebuild
 call restore.cmd -RuntimeIdentifier=%rid%
 set DoNotEmbedDescriptors=1
 cd ..\linker
-..\corebuild\Tools\dotnetcli\dotnet.exe publish -r %rid% -c netcore_Relase
+..\corebuild\Tools\dotnetcli\dotnet.exe publish -r %rid% -c netcore_Release
 popd
 
 echo Built %cd%\linker\linker\bin\netcore_Release\netcoreapp2.0\%rid%\publish\illink.exe
+
 :Done
 exit /b 0
 
index d80a82e..1bc7670 100755 (executable)
@@ -15,7 +15,7 @@ function print_usage {
 # Argument variables
 clone=
 setenv=
-os='ubuntu.16.04'
+os='ubuntu'
 arch='x64'
 
 for i in "$@"
@@ -27,7 +27,6 @@ do
             ;;
        
         --clone)
-           echo "Need to clone"
             clone=1
             ;;
        
@@ -50,7 +49,6 @@ done
 rid="$os-$arch"
 
 if [ ! -z "$clone" ]; then
-    echo "Of Course Not here" 
     git clone --recursive https://github.com/mono/linker
 fi
 
index 07cf288..deebd2f 100755 (executable)
@@ -34,6 +34,7 @@ PARSER.add_argument("-lst_file", dest="old_list_file", nargs='?', default=None)
 PARSER.add_argument("-test_dir", dest="test_dir", nargs='?', default=None)
 PARSER.add_argument("-commit_hash", dest="commit_hash", nargs='?', default=None)
 PARSER.add_argument("-failures_csv", dest="failures_csv", nargs='?', default=None)
+PARSER.add_argument("--unset_new", dest="unset_new", action="store_true", default=False)
 ARGS = PARSER.parse_args(sys.argv[1:])
 
 ################################################################################
@@ -61,12 +62,12 @@ def create_list_file(file_name, metadata):
     old_metadata = [item for item in metadata if item[1] != -1]
 
     with open(file_name, "w") as file_handle:
-        file_handle.write("## This list file has been produced automatically. Any changes\n")
-        file_handle.write("## are subject to being overwritten when reproducing this file.\n")
-        file_handle.write("## \n")
-        file_handle.write("## Last Updated: %s\n" % current_time_str)
-        file_handle.write("## Commit: %s\n" % ARGS.commit_hash)
-        file_handle.write("## \n")
+        file_handle.write("## This list file has been produced automatically. Any changes" + os.pathsep)
+        file_handle.write("## are subject to being overwritten when reproducing this file." + os.pathsep))
+        file_handle.write("## " + os.pathsep))
+        file_handle.write("## Last Updated: %s%s" % (current_time_str, os.pathsep))
+        file_handle.write("## Commit: %s%s" % (ARGS.commit_hash, os.pathsep))
+        file_handle.write("## " + os.pathsep))
 
         order = ["RelativePath", "WorkingDir", "Expected", 
                 "MaxAllowedDurationSeconds", "Categories", "HostStyle"]
@@ -87,9 +88,9 @@ def create_list_file(file_name, metadata):
 
                 attribute_str = ""
                 for key in order:
-                    attribute_str += "%s=%s\n" % (key, item[key])
+                    attribute_str += "%s=%s%s" % (key, item[key], os.pathsep))
 
-                file_handle.write(attribute_str + "\n")
+                file_handle.write(attribute_str + os.pathsep))
 
         write_metadata(old_metadata)
         write_metadata(new_metadata, old_metadata[-1][1] + 1)
@@ -273,6 +274,7 @@ def main(args):
     test_dir = args.test_dir
     old_list_file = args.old_list_file
     commit_hash = args.commit_hash
+    unset_new = args.unset_new
 
     if commit_hash is None:
         print "Error please provide a commit hash."
@@ -332,8 +334,9 @@ def main(args):
                         new_split = new_metadata["Categories"].split(";")
                         old_split = old_metadata["Categories"].split(";")
 
-                        if "NEW" in old_split:
-                            old_split.remove("NEW")
+                        if unset_new:
+                            if "NEW" in old_split:
+                                old_split.remove("NEW")
 
                         # If an old test is marked as a failing test. Make
                         # sure that we carry that information along.
@@ -348,7 +351,14 @@ def main(args):
                         joined_categories = set(old_split + new_split)
 
                         overwritten = True
-                        old_metadata[attribute] = ";".join(joined_categories)
+                        ordered_categories = []
+                        for item in old_split:
+                            if item in joined_categories:
+                                ordered_categories.append(item)
+                                joined_categories.remove(item)
+
+                        old_metadata[attribute] = ";".join(ordered_categories)
+                        old_metadata[attribute] = old_metadata[attribute] + ";" + ";".join(joined_categories) if len(joined_categories) > 0 else old_metadata[attribute]
                         old_test_metadata[test_name] = (old_metadata, index)
 
                     elif new_metadata[attribute] != old_metadata[attribute]:
@@ -364,7 +374,19 @@ def main(args):
                     if overwritten:
                         update_count += 1
 
+        tests_removed = 0
+        tests_to_remove = []
+        for old_test_name in old_test_metadata:
+            # Remove all old unreferenced tests
+            if old_test_name not in test_metadata:
+                tests_to_remove.append(old_test_name)
+                tests_removed += 1
+
+        for test_name in tests_to_remove:
+            old_test_metadata.pop(test_name)
+
         print "Added %d tests." % new_test_count
+        print "Removed %d tests." % tests_removed
         print "Finished join. %d tests updated." % update_count
 
         test_metadata = old_test_metadata
index be437ec..679f2d7 100644 (file)
@@ -837,6 +837,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Localloc", "JIT\CodeGenBrin
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocLarge", "JIT\CodeGenBringUpTests\LocallocLarge.csproj", "{C5578A39-72FF-4D25-99DA-96A8A99C6740}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocB_N", "JIT\CodeGenBringUpTests\LocallocB_N.csproj", "{38302715-A140-493E-AEF4-3E8F9EE99195}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocB_N_PSP", "JIT\CodeGenBringUpTests\LocallocB_N_PSP.csproj", "{6222AF08-F765-44C2-B48C-3C040D62303F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB117", "JIT\CodeGenBringUpTests\LocallocCnstB117.csproj", "{5A0F2889-91F1-4670-A4AF-9AF0598E22B7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB117_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB117_PSP.csproj", "{C82D33B6-5779-4E19-8220-1DEA587203B1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB1", "JIT\CodeGenBringUpTests\LocallocCnstB1.csproj", "{4240086D-0722-4E93-A6DD-BF779715CE73}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB1_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB1_PSP.csproj", "{18F8266B-2F59-4058-8FE6-6B8368CD0D0F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5001", "JIT\CodeGenBringUpTests\LocallocCnstB5001.csproj", "{E7B36F3A-CD18-4F21-8898-CA43C5FDEA1E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5001_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB5001_PSP.csproj", "{1EB5785A-2050-4AD1-820B-F46CCCC3C65A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5", "JIT\CodeGenBringUpTests\LocallocCnstB5.csproj", "{061E4E38-14A9-4305-AD27-5A01A95E9FCE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB5_PSP.csproj", "{5F015026-51D0-4EF7-B538-24E8864F31D6}"
+EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LongArgsAndReturn", "JIT\CodeGenBringUpTests\LongArgsAndReturn.csproj", "{FC3E9CEC-7659-471A-8B2E-8CFB3FBFDB4E}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lt1", "JIT\CodeGenBringUpTests\Lt1.csproj", "{A7850EBD-6701-473E-8686-99535F0794A6}"
@@ -33450,6 +33470,16 @@ Global
                {C6DC8E85-DCD2-49A0-977D-CE9795552632} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
                {8BA7A4A1-EBB6-44CD-828B-F2BA5523691A} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
                {650B07D3-9BC0-4EF8-8557-44200EC13261} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {38302715-A140-493E-AEF4-3E8F9EE99195} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {6222AF08-F765-44C2-B48C-3C040D62303F} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {5A0F2889-91F1-4670-A4AF-9AF0598E22B7} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {C82D33B6-5779-4E19-8220-1DEA587203B1} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {4240086D-0722-4E93-A6DD-BF779715CE73} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {18F8266B-2F59-4058-8FE6-6B8368CD0D0F} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {E7B36F3A-CD18-4F21-8898-CA43C5FDEA1E} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {1EB5785A-2050-4AD1-820B-F46CCCC3C65A} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {061E4E38-14A9-4305-AD27-5A01A95E9FCE} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
+               {5F015026-51D0-4EF7-B538-24E8864F31D6} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
                {C5578A39-72FF-4D25-99DA-96A8A99C6740} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
                {FC3E9CEC-7659-471A-8B2E-8CFB3FBFDB4E} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
                {A7850EBD-6701-473E-8686-99535F0794A6} = {954F04D0-2FFD-4923-BE9A-2F9F58145708}
index 62cda21..f015cc7 100644 (file)
@@ -222,7 +222,7 @@ then
   # Include all .exe files in this directory as entry points (some tests had multiple .exe file modules)
   for bin in *.exe *.dll; 
   do 
-    Assemblies="$Assemblies -a $bin"
+    Assemblies="$Assemblies -a ${bin%.*}"
   done
 
   # Run dotnet-linker
index 6e7cc3a..4c12f32 100644 (file)
@@ -31,7 +31,7 @@
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
+    <ProjectReference Include="..\..\Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj">
       <Project>{c8c0dc74-fac4-45b1-81fe-70c4808366e0}</Project>
       <Name>CoreCLRTestLibrary</Name>
     </ProjectReference>
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocB_N.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocB_N.cs
new file mode 100644 (file)
index 0000000..3d01df6
--- /dev/null
@@ -0,0 +1,68 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocB_N(int n)
+    {
+        byte* a = stackalloc byte[n];
+
+        for (int i = 0; i < n; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            if (!CHECK(a[i], (byte) i)) return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocB_N(1);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N - Test 1: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N(5);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N - Test 2: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N(117);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N - Test 3: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N(5001);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N - Test 4: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocB_N.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocB_N.csproj
new file mode 100644 (file)
index 0000000..4b23894
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{38302715-A140-493E-AEF4-3E8F9EE99195}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocB_N.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.cs
new file mode 100644 (file)
index 0000000..4dd836e
--- /dev/null
@@ -0,0 +1,77 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocB_N_PSP(int n)
+    {
+        byte* a = stackalloc byte[n];
+        int i;
+        for (i = 0; i < n; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        i = 0;
+        try
+        {
+            for (; i < n; i++)
+            {
+                if (!CHECK(a[i], (byte) i)) return i;
+            }
+        }
+        catch
+        {
+            Console.WriteLine("ERROR!!!");
+            return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocB_N_PSP(1);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N_PSP - Test 1: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N_PSP(5);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N_PSP - Test 2: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N_PSP(117);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N_PSP - Test 3: Failed on index: " + ret);
+            return Fail;
+        }
+
+        ret = LocallocB_N_PSP(5001);
+        if (ret != -1) {
+            Console.WriteLine("LocallocB_N_PSP - Test 4: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocB_N_PSP.csproj
new file mode 100644 (file)
index 0000000..079264c
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{6222AF08-F765-44C2-B48C-3C040D62303F}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocB_N_PSP.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.cs
new file mode 100644 (file)
index 0000000..59a0db4
--- /dev/null
@@ -0,0 +1,49 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB1()
+    {
+        byte* a = stackalloc byte[1];
+        for (int i = 0; i < 1; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        for (int i = 0; i < 1; i++)
+        {
+            if (!CHECK(a[i], (byte) i)) return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB1();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB1: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1.csproj
new file mode 100644 (file)
index 0000000..669255e
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{4240086D-0722-4E93-A6DD-BF779715CE73}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB1.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.cs
new file mode 100644 (file)
index 0000000..b399379
--- /dev/null
@@ -0,0 +1,49 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB117()
+    {
+        byte* a = stackalloc byte[117];
+        for (int i = 0; i < 117; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        for (int i = 0; i < 117; i++)
+        {
+            if (!CHECK(a[i], (byte) i)) return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB117();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB117: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117.csproj
new file mode 100644 (file)
index 0000000..239a2e6
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{5A0F2889-91F1-4670-A4AF-9AF0598E22B7}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB117.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.cs
new file mode 100644 (file)
index 0000000..4518f0a
--- /dev/null
@@ -0,0 +1,59 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB117_PSP()
+    {
+        byte* a = stackalloc byte[117];
+        int i;
+        for (i = 0; i < 117; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        i = 0;
+        try
+        {
+            for (; i < 117; i++)
+            {
+                if (!CHECK(a[i], (byte) i)) return i;
+            }
+        }
+        catch
+        {
+            Console.WriteLine("ERROR!!!");
+            return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB117_PSP();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB117_PSP: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB117_PSP.csproj
new file mode 100644 (file)
index 0000000..b4dbad3
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{C82D33B6-5779-4E19-8220-1DEA587203B1}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB117_PSP.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.cs
new file mode 100644 (file)
index 0000000..834d1d8
--- /dev/null
@@ -0,0 +1,59 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB1_PSP()
+    {
+        byte* a = stackalloc byte[1];
+        int i;
+        for (i = 0; i < 1; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        i = 0;
+        try
+        {
+            for (; i < 1; i++)
+            {
+                if (!CHECK(a[i], (byte) i)) return i;
+            }
+        }
+        catch
+        {
+            Console.WriteLine("ERROR!!!");
+            return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB1_PSP();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB1_PSP: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB1_PSP.csproj
new file mode 100644 (file)
index 0000000..696a5c5
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{18F8266B-2F59-4058-8FE6-6B8368CD0D0F}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB1_PSP.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.cs
new file mode 100644 (file)
index 0000000..81c34b4
--- /dev/null
@@ -0,0 +1,49 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB5()
+    {
+        byte* a = stackalloc byte[5];
+        for (int i = 0; i < 5; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        for (int i = 0; i < 5; i++)
+        {
+            if (!CHECK(a[i], (byte) i)) return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB5();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB5: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5.csproj
new file mode 100644 (file)
index 0000000..7d3c080
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{061E4E38-14A9-4305-AD27-5A01A95E9FCE}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB5.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.cs
new file mode 100644 (file)
index 0000000..27557bd
--- /dev/null
@@ -0,0 +1,49 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB5001()
+    {
+        byte* a = stackalloc byte[5001];
+        for (int i = 0; i < 5001; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        for (int i = 0; i < 5001; i++)
+        {
+            if (!CHECK(a[i], (byte) i)) return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB5001();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB5001: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001.csproj
new file mode 100644 (file)
index 0000000..65b3ff1
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{E7B36F3A-CD18-4F21-8898-CA43C5FDEA1E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB5001.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.cs
new file mode 100644 (file)
index 0000000..ce411de
--- /dev/null
@@ -0,0 +1,59 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB5001_PSP()
+    {
+        byte* a = stackalloc byte[5001];
+        int i;
+        for (i = 0; i < 5001; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        i = 0;
+        try
+        {
+            for (; i < 5001; i++)
+            {
+                if (!CHECK(a[i], (byte) i)) return i;
+            }
+        }
+        catch
+        {
+            Console.WriteLine("ERROR!!!");
+            return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB5001_PSP();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB5001_PSP: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5001_PSP.csproj
new file mode 100644 (file)
index 0000000..40c3b17
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{1EB5785A-2050-4AD1-820B-F46CCCC3C65A}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB5001_PSP.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.cs b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.cs
new file mode 100644 (file)
index 0000000..f19b4fc
--- /dev/null
@@ -0,0 +1,59 @@
+// 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;
+public class BringUpTest
+{
+    const int Pass = 100;
+    const int Fail = -1;
+
+    // Reduce all values to byte
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe bool CHECK(byte check, byte expected) {
+        return check == expected;
+    }
+
+    [MethodImplAttribute(MethodImplOptions.NoInlining)]
+    public static unsafe int LocallocCnstB5_PSP()
+    {
+        byte* a = stackalloc byte[5];
+        int i;
+        for (i = 0; i < 5; i++)
+        {
+            a[i] = (byte) i;
+        }
+
+        i = 0;
+        try
+        {
+            for (; i < 5; i++)
+            {
+                if (!CHECK(a[i], (byte) i)) return i;
+            }
+        }
+        catch
+        {
+            Console.WriteLine("ERROR!!!");
+            return i;
+        }
+
+        return -1;
+    }
+
+    public static int Main()
+    {
+        int ret;
+
+        ret = LocallocCnstB5_PSP();
+        if (ret != -1) {
+            Console.WriteLine("LocallocCnstB5_PSP: Failed on index: " + ret);
+            return Fail;
+        }
+
+        return Pass;
+    }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.csproj b/tests/src/JIT/CodeGenBringUpTests/LocallocCnstB5_PSP.csproj
new file mode 100644 (file)
index 0000000..10e269b
--- /dev/null
@@ -0,0 +1,33 @@
+<?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>{5F015026-51D0-4EF7-B538-24E8864F31D6}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </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>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LocallocCnstB5_PSP.cs" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
\ No newline at end of file
index 55cb0a0..1c354b7 100644 (file)
   {
     // Code size       154 (0x9a)
     .maxstack  3
-    .locals init ([0] class [System.Console]System.Exception e)
+    .locals init ([0] class [mscorlib]System.Exception e)
     IL_0000:  ldstr      "Executing Condition18.Test2 - Caller(imperative se"
     + "curity): Arguments: None - ReturnType: 3 byte struct; Callee: Arguments"
     + ": None - ReturnType: 3 byte struct"
index 3e35252..179b052 100644 (file)
@@ -91,8 +91,6 @@ public class Driver<K, V>
         ConditionalWeakTable<K,V> tbl = new ConditionalWeakTable<K,V>();
 
         // Try to remove key from an empty dictionary
-        Random r = new Random();
-
         // Remove should return false
         Test.Eval(!tbl.Remove(keys[0]), "Err_005 Expected Remove to return false");
 
@@ -147,7 +145,6 @@ public class Driver<K, V>
 
         // Try to get non existing key
         // TryGetValue should return false and value should contian default(TValue)
-        Random r = new Random();
         Test.Eval(!tbl.TryGetValue(key, out val), "Err_011 Expected TryGetValue to return false");
         Test.Eval(val == null, "Err_012 Expected val to be null");
     }