Merge pull request #7189 from pgavlin/x86-cmp-long
authorPat Gavlin <pgavlin@gmail.com>
Wed, 14 Sep 2016 23:40:41 +0000 (16:40 -0700)
committerGitHub <noreply@github.com>
Wed, 14 Sep 2016 23:40:41 +0000 (16:40 -0700)
Implement long compare lowering for x86.

58 files changed:
cross/arm/sources.list.jessie [new file with mode: 0644]
cross/arm/sources.list.xenial [new file with mode: 0644]
cross/arm64/sources.list.xenial [new file with mode: 0644]
cross/build-rootfs.sh
dependencies.props
perf.groovy
src/debug/daccess/nidump.cpp
src/gcdump/gcdumpnonx86.cpp
src/gcdump/i386/gcdumpx86.cpp
src/inc/eetwain.h
src/inc/gcdecoder.cpp
src/inc/gcdump.h
src/inc/gcinfo.h
src/inc/gcinfotypes.h
src/jit/codegen.h
src/jit/codegenclassic.h
src/jit/codegencommon.cpp
src/jit/codegenlegacy.cpp
src/jit/codegenxarch.cpp
src/jit/decomposelongs.cpp
src/jit/gcencode.cpp
src/jit/importer.cpp
src/jit/jitgcinfo.h
src/jit/lower.cpp
src/jit/lowerarm64.cpp
src/jit/lsra.cpp
src/jit/morph.cpp
src/mscorlib/model.xml
src/mscorlib/src/System/Array.cs
src/mscorlib/src/System/Collections/Generic/List.cs
src/mscorlib/src/System/IO/Stream.cs
src/mscorlib/src/System/Random.cs
src/mscorlib/src/System/String.Manipulation.cs
src/vm/callhelpers.cpp
src/vm/codeman.h
src/vm/debughelp.cpp
src/vm/eedbginterfaceimpl.cpp
src/vm/eetwain.cpp
src/vm/excep.cpp
src/vm/gccover.cpp
src/vm/gcenv.ee.cpp
src/vm/object.cpp
src/vm/proftoeeinterfaceimpl.cpp
src/vm/stackwalk.cpp
src/vm/threadsuspend.cpp
tests/issues.targets
tests/scripts/perf-prep.sh
tests/scripts/run-xunit-perf.sh
tests/src/Common/test_dependencies/project.json
tests/src/JIT/config/benchmark+roslyn/project.json
tests/src/JIT/config/benchmark+serialize/project.json
tests/src/JIT/config/benchmark/project.json
tests/src/JIT/config/extra/project.json
tests/src/JIT/config/minimal/project.json
tests/src/JIT/config/threading+thread/project.json
tests/src/JIT/config/threading/project.json
tests/x86_jit32_issues.targets
tests/x86_legacy_backend_issues.targets

diff --git a/cross/arm/sources.list.jessie b/cross/arm/sources.list.jessie
new file mode 100644 (file)
index 0000000..4d142ac
--- /dev/null
@@ -0,0 +1,3 @@
+# Debian (sid)   # UNSTABLE
+deb http://ftp.debian.org/debian/ sid main contrib non-free
+deb-src http://ftp.debian.org/debian/ sid main contrib non-free
diff --git a/cross/arm/sources.list.xenial b/cross/arm/sources.list.xenial
new file mode 100644 (file)
index 0000000..eacd86b
--- /dev/null
@@ -0,0 +1,11 @@
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
\ No newline at end of file
diff --git a/cross/arm64/sources.list.xenial b/cross/arm64/sources.list.xenial
new file mode 100644 (file)
index 0000000..eacd86b
--- /dev/null
@@ -0,0 +1,11 @@
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
+
+deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
+deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
\ No newline at end of file
index b786420..897f0b2 100755 (executable)
@@ -4,7 +4,7 @@ usage()
 {
     echo "Usage: $0 [BuildArch] [UbuntuCodeName]"
     echo "BuildArch can be: arm, arm-softfp, arm64"
-    echo "UbuntuCodeName - optional, Code name for Ubuntu, can be: trusty(default), vivid, wily. If BuildArch is arm-softfp, UbuntuCodeName is ignored."
+    echo "UbuntuCodeName - optional, Code name for Ubuntu, can be: trusty(default), vivid, wily, xenial. If BuildArch is arm-softfp, UbuntuCodeName is ignored."
 
     exit 1
 }
@@ -61,6 +61,15 @@ for i in "$@"
             __UbuntuCodeName=wily
         fi
         ;;
+        xenial)
+        if [ "$__UbuntuCodeName" != "jessie" ]; then
+            __UbuntuCodeName=xenial
+        fi
+        ;;
+        jessie)
+        __UbuntuCodeName=jessie
+        __UbuntuRepo="http://ftp.debian.org/debian/"
+        ;;
         *)
         __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i"
         ;;
index 6b33803..726575b 100644 (file)
@@ -1,20 +1,20 @@
 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <!-- Source of truth for dependency tooling: the commit hash of the dotnet/versions master branch as of the last auto-upgrade. -->
   <PropertyGroup>
-    <CoreFxCurrentRef>2e3cca76502a1514e9cdc566df216a1afbf07872</CoreFxCurrentRef>
-    <CoreClrCurrentRef>2e3cca76502a1514e9cdc566df216a1afbf07872</CoreClrCurrentRef>
-    <ExternalCurrentRef>2e3cca76502a1514e9cdc566df216a1afbf07872</ExternalCurrentRef>
+    <CoreFxCurrentRef>42466c1981bc38372593bdb7c4da6de8547f9271</CoreFxCurrentRef>
+    <CoreClrCurrentRef>42466c1981bc38372593bdb7c4da6de8547f9271</CoreClrCurrentRef>
+    <ExternalCurrentRef>42466c1981bc38372593bdb7c4da6de8547f9271</ExternalCurrentRef>
   </PropertyGroup>
 
   <!-- Auto-upgraded properties for each build info dependency. -->
   <PropertyGroup>
-    <CoreFxExpectedPrerelease>beta-24431-01</CoreFxExpectedPrerelease>
-    <ExternalExpectedPrerelease>beta-24430-00</ExternalExpectedPrerelease>
+    <CoreFxExpectedPrerelease>beta-24513-02</CoreFxExpectedPrerelease>
+    <ExternalExpectedPrerelease>beta-24513-00</ExternalExpectedPrerelease>
   </PropertyGroup>
 
   <!-- Full package version strings that are used in other parts of the build. -->
   <PropertyGroup>
-    <CoreClrPackageVersion>1.1.0-beta-24431-01</CoreClrPackageVersion>
+    <CoreClrPackageVersion>1.1.0-beta-24513-04</CoreClrPackageVersion>
     <XunitPackageVersion>2.2.0-beta2-build3300</XunitPackageVersion>
   </PropertyGroup>
 
index 71a93f4..b1072f7 100644 (file)
@@ -27,15 +27,17 @@ def static getOSGroup(def os) {
 
 [true, false].each { isPR ->
     ['Windows_NT'].each { os ->
+        def architecture = 'x64'
+        def configuration = 'Release'
         def newJob = job(Utilities.getFullJobName(project, "perf_${os}", isPR)) {
             // Set the label.
             label('performance')
             steps {
                     // Batch
                     batchFile("C:\\tools\\nuget install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory C:\\tools -Prerelease")
-                    batchFile("python C:\\tools\\Microsoft.BenchView.JSONFormat.0.1.0-pre008\\tools\\machinedata.py")
-                    batchFile("set __TestIntermediateDir=int&&build.cmd release x64")
-                    batchFile("tests\\runtest.cmd release x64")
+                    batchFile("python C:\\tools\\Microsoft.BenchView.JSONFormat.0.1.0-pre010\\tools\\machinedata.py")
+                    batchFile("set __TestIntermediateDir=int&&build.cmd release ${architecture}")
+                    batchFile("tests\\runtest.cmd release ${architecture}")
                     batchFile("tests\\scripts\\run-xunit-perf.cmd")
             }
         }
@@ -47,6 +49,17 @@ def static getOSGroup(def os) {
         Utilities.addArchival(newJob, archiveSettings)
 
         Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
+
+        // For perf, we need to keep the run results longer
+        newJob.with {
+            // Enable the log rotator
+            logRotator {
+                artifactDaysToKeep(7)
+                daysToKeep(300)
+                artifactNumToKeep(25)
+                numToKeep(1000)
+            }
+        }
         if (isPR) {
             TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
             builder.setGithubContext("${os} Perf Tests")
@@ -69,23 +82,40 @@ def static getOSGroup(def os) {
         def osGroup = getOSGroup(os)
         def architecture = 'x64'
         def configuration = 'Release'
-        def newJob = job(Utilities.getFullJobName(project, "perf_${osGroup}", isPR)) {
+        def newJob = job(Utilities.getFullJobName(project, "perf_${os}", isPR)) {
             steps {
                 shell("sudo bash ./tests/scripts/perf-prep.sh --branch=${projectName}")
-                shell("./init-tools.sh")
+                shell("sudo ./init-tools.sh")
                 shell("""sudo bash ./tests/scripts/run-xunit-perf.sh \\
                 --testRootDir=\"\${WORKSPACE}/bin/tests/Windows_NT.${architecture}.${configuration}\" \\
                 --testNativeBinDir=\"\${WORKSPACE}/bin/obj/${osGroup}.${architecture}.${configuration}/tests\" \\
                 --coreClrBinDir=\"\${WORKSPACE}/bin/Product/${osGroup}.${architecture}.${configuration}\" \\
                 --mscorlibDir=\"\${WORKSPACE}/bin/Product/${osGroup}.${architecture}.${configuration}\" \\
-                --coreFxBinDir=\"\${WORKSPACE}/bin/${osGroup}.AnyCPU.Release;\${WORKSPACE}/bin/Unix.AnyCPU.Release;\${WORKSPACE}/bin/AnyOS.AnyCPU.Release\" \\
-                --coreFxNativeBinDir=\"\${WORKSPACE}/bin/${osGroup}.${architecture}.Release\"""")
+                --coreFxBinDir=\"\${WORKSPACE}/bin/${osGroup}.AnyCPU.${configuration};\${WORKSPACE}/bin/Unix.AnyCPU.${configuration};\${WORKSPACE}/bin/AnyOS.AnyCPU.${configuration}\" \\
+                --coreFxNativeBinDir=\"\${WORKSPACE}/bin/${osGroup}.${architecture}.${configuration}\"""")
             }
         }
 
         Utilities.setMachineAffinity(newJob, os, 'latest-or-auto') // Just run against Linux VM\92s for now.
 
+        // Save machinedata.json to /artifact/bin/ Jenkins dir
+        def archiveSettings = new ArchivalSettings()
+        archiveSettings.addFiles('sandbox/perf-*.xml')
+        archiveSettings.addFiles('machinedata.json')
+        Utilities.addArchival(newJob, archiveSettings)
+
         Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
+
+        // For perf, we need to keep the run results longer
+        newJob.with {
+            // Enable the log rotator
+            logRotator {
+                artifactDaysToKeep(7)
+                daysToKeep(300)
+                artifactNumToKeep(25)
+                numToKeep(1000)
+            }
+        }
         if (isPR) {
             TriggerBuilder builder = TriggerBuilder.triggerOnPullRequest()
             builder.setGithubContext("${os} Perf Tests")
index 32eab49..5c6c4e4 100644 (file)
@@ -3120,7 +3120,7 @@ void NativeImageDumper::DumpCompleteMethod(PTR_Module module, MethodIterator& mi
 #ifdef _TARGET_X86_
         InfoHdr hdr;
         stringOutFn( "method info Block:\n" );
-        curGCInfoPtr += gcDump.DumpInfoHdr(PTR_CBYTE(gcInfoToken.Info), &hdr, &methodSize, 0);
+        curGCInfoPtr += gcDump.DumpInfoHdr(curGCInfoPtr, &hdr, &methodSize, 0);
         stringOutFn( "\n" );
 #endif
 
@@ -9439,10 +9439,12 @@ void NativeImageDumper::DumpReadyToRunMethod(PCODE pEntryPoint, PTR_RUNTIME_FUNC
         g_holdStringOutData.Clear();
         GCDump gcDump(GCINFO_VERSION);
         gcDump.gcPrintf = stringOutFn;
-#if !defined(_TARGET_X86_) && defined(USE_GC_INFO_DECODER)
         UINT32 r2rversion = m_pReadyToRunHeader->MajorVersion;
         UINT32 gcInfoVersion = GCInfoToken::ReadyToRunVersionToGcInfoVersion(r2rversion);
-        GcInfoDecoder gcInfoDecoder({ curGCInfoPtr, gcInfoVersion }, DECODE_CODE_LENGTH);
+        GCInfoToken gcInfoToken = { curGCInfoPtr, gcInfoVersion };
+
+#if !defined(_TARGET_X86_) && defined(USE_GC_INFO_DECODER)
+        GcInfoDecoder gcInfoDecoder(gcInfoToken, DECODE_CODE_LENGTH);
         methodSize = gcInfoDecoder.GetCodeLength();
 #endif
 
index 7343ac9..c2f41c9 100644 (file)
@@ -505,7 +505,7 @@ size_t      GCDump::DumpGCTable(PTR_CBYTE      gcInfoBlock,
 
 /*****************************************************************************/
 
-void    GCDump::DumpPtrsInFrame(PTR_CBYTE   infoBlock,
+void    GCDump::DumpPtrsInFrame(PTR_CBYTE   gcInfoBlock,
                                 PTR_CBYTE   codeBlock,
                                 unsigned    offs,
                                 bool        verifyGCTables)
index 70334de..0c90397 100644 (file)
@@ -60,12 +60,13 @@ const char *        CalleeSavedRegName(unsigned reg)
 
 /*****************************************************************************/
 
-unsigned            GCDump::DumpInfoHdr (PTR_CBYTE      table,
+unsigned            GCDump::DumpInfoHdr (PTR_CBYTE      gcInfoBlock,
                                          InfoHdr*       header,
                                          unsigned *     methodSize,
                                          bool           verifyGCTables)
 {
     unsigned        count;
+    PTR_CBYTE       table       = gcInfoBlock;
     PTR_CBYTE       tableStart  = table;
     PTR_CBYTE       bp          = table;
 
@@ -76,7 +77,7 @@ unsigned            GCDump::DumpInfoHdr (PTR_CBYTE      table,
 
     table += decodeUnsigned(table, methodSize);
 
-    table = decodeHeader(table, header);
+    table = decodeHeader(table, gcInfoVersion, header);
 
     BOOL hasArgTabOffset = FALSE;
     if (header->untrackedCnt == HAS_UNTRACKED)
@@ -107,6 +108,12 @@ unsigned            GCDump::DumpInfoHdr (PTR_CBYTE      table,
         header->syncEndOffset = count;
     }
 
+    if (header->revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET)
+    {
+        table += decodeUnsigned(table, &count);
+        header->revPInvokeOffset = count;
+    }
+
     //
     // First print out all the basic information
     //
@@ -931,12 +938,12 @@ DONE_REGTAB:
 
 /*****************************************************************************/
 
-void                GCDump::DumpPtrsInFrame(PTR_CBYTE   infoBlock,
+void                GCDump::DumpPtrsInFrame(PTR_CBYTE   gcInfoBlock,
                                             PTR_CBYTE   codeBlock,
                                             unsigned    offs,
                                             bool        verifyGCTables)
 {
-    PTR_CBYTE       table = infoBlock;
+    PTR_CBYTE       table = gcInfoBlock;
 
     size_t          methodSize;
     size_t          stackSize;
@@ -963,7 +970,7 @@ void                GCDump::DumpPtrsInFrame(PTR_CBYTE   infoBlock,
     // Typically only uses one-byte to store everything.
     //
     InfoHdr header;
-    table = decodeHeader(table, &header);
+    table = decodeHeader(table, gcInfoVersion, &header);
     
     if (header.untrackedCnt == HAS_UNTRACKED)
     {
@@ -994,6 +1001,13 @@ void                GCDump::DumpPtrsInFrame(PTR_CBYTE   infoBlock,
         header.syncEndOffset = offset;
         _ASSERTE(offset != INVALID_SYNC_OFFSET);
     }
+    if (header.revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET)
+    {
+        unsigned offset;
+        table += decodeUnsigned(table, &offset);
+        header.revPInvokeOffset = offset;
+        _ASSERTE(offset != INVALID_REV_PINVOKE_OFFSET);
+    }
 
     prologSize = header.prologSize;
     epilogSize = header.epilogSize;
index 6e183c5..502d181 100644 (file)
@@ -278,16 +278,16 @@ virtual void * GetGSCookieAddr(PREGDISPLAY     pContext,
   Returns true if the given IP is in the given method's prolog or an epilog.
 */
 virtual bool IsInPrologOrEpilog(DWORD  relPCOffset,
-                                PTR_VOID methodInfoPtr,
+                                GCInfoToken gcInfoToken,
                                 size_t* prologSize) = 0;
 
 /*
   Returns true if the given IP is in the synchronized region of the method (valid for synchronized methods only)
 */
 virtual bool IsInSynchronizedRegion(
-                DWORD           relOffset,
-                PTR_VOID        methodInfoPtr,
-                unsigned        flags) = 0;
+                DWORD       relOffset,
+                GCInfoToken gcInfoToken,
+                unsigned    flags) = 0;
 
 /*
   Returns the size of a given function as reported in the GC info (does
@@ -297,9 +297,15 @@ virtual bool IsInSynchronizedRegion(
 virtual size_t GetFunctionSize(GCInfoToken gcInfoToken) = 0;
 
 /*
+Returns the ReturnKind of a given function as reported in the GC info.
+*/
+
+virtual ReturnKind GetReturnKind(GCInfoToken gcInfotoken) = 0;
+
+/*
   Returns the size of the frame (barring localloc)
 */
-virtual unsigned int GetFrameSize(PTR_VOID methodInfoPtr) = 0;
+virtual unsigned int GetFrameSize(GCInfoToken gcInfoToken) = 0;
 
 #ifndef DACCESS_COMPILE
 
@@ -307,16 +313,16 @@ virtual unsigned int GetFrameSize(PTR_VOID methodInfoPtr) = 0;
 
 virtual const BYTE*     GetFinallyReturnAddr(PREGDISPLAY pReg)=0;
 
-virtual BOOL            IsInFilter(void *methodInfoPtr,
+virtual BOOL            IsInFilter(GCInfoToken gcInfoToken,
                                    unsigned offset,
                                    PCONTEXT pCtx,
                                    DWORD curNestLevel) = 0;
 
-virtual BOOL            LeaveFinally(void *methodInfoPtr,
+virtual BOOL            LeaveFinally(GCInfoToken gcInfoToken,
                                      unsigned offset,
                                      PCONTEXT pCtx) = 0;
 
-virtual void            LeaveCatch(void *methodInfoPtr,
+virtual void            LeaveCatch(GCInfoToken gcInfoToken,
                                    unsigned offset,
                                    PCONTEXT pCtx)=0;
 
@@ -535,18 +541,18 @@ void * GetGSCookieAddr(PREGDISPLAY     pContext,
 */
 virtual
 bool IsInPrologOrEpilog(
-                DWORD           relOffset,
-                PTR_VOID        methodInfoPtr,
-                size_t*         prologSize);
+                DWORD       relOffset,
+                GCInfoToken gcInfoToken,
+                size_t*     prologSize);
 
 /*
   Returns true if the given IP is in the synchronized region of the method (valid for synchronized functions only)
 */
 virtual
 bool IsInSynchronizedRegion(
-                DWORD           relOffset,
-                PTR_VOID        methodInfoPtr,
-                unsigned        flags);
+                DWORD       relOffset,
+                GCInfoToken gcInfoToken,
+                unsigned    flags);
 
 /*
   Returns the size of a given function.
@@ -555,23 +561,27 @@ virtual
 size_t GetFunctionSize(GCInfoToken gcInfoToken);
 
 /*
+Returns the ReturnKind of a given function.
+*/
+virtual ReturnKind GetReturnKind(GCInfoToken gcInfotoken);
+
+/*
   Returns the size of the frame (barring localloc)
 */
 virtual
-unsigned int GetFrameSize(
-                PTR_VOID        methodInfoPtr);
+unsigned int GetFrameSize(GCInfoToken gcInfoToken);
 
 #ifndef DACCESS_COMPILE
 
 virtual const BYTE* GetFinallyReturnAddr(PREGDISPLAY pReg);
-virtual BOOL LeaveFinally(void *methodInfoPtr,
+virtual BOOL LeaveFinally(GCInfoToken gcInfoToken,
                           unsigned offset,
                           PCONTEXT pCtx);
-virtual BOOL IsInFilter(void *methodInfoPtr,
+virtual BOOL IsInFilter(GCInfoToken gcInfoToken,
                         unsigned offset,
                         PCONTEXT pCtx,
                           DWORD curNestLevel);
-virtual void LeaveCatch(void *methodInfoPtr,
+virtual void LeaveCatch(GCInfoToken gcInfoToken,
                          unsigned offset,
                          PCONTEXT pCtx);
 
@@ -646,8 +656,9 @@ struct hdrInfo
 {
     unsigned int        methodSize;     // native code bytes
     unsigned int        argSize;        // in bytes
-    unsigned int        stackSize;      /* including callee saved registers */
-    unsigned int        rawStkSize;     /* excluding callee saved registers */
+    unsigned int        stackSize;      // including callee saved registers
+    unsigned int        rawStkSize;     // excluding callee saved registers
+    ReturnKind          returnKind;     // The ReturnKind for this method.
 
     unsigned int        prologSize;
 
@@ -689,6 +700,7 @@ struct hdrInfo
     unsigned int        syncStartOffset; // start/end code offset of the protected region in synchronized methods.
     unsigned int        syncEndOffset;   // INVALID_SYNC_OFFSET if there not synchronized method
     unsigned int        syncEpilogStart; // The start of the epilog. Synchronized methods are guaranteed to have no more than one epilog.
+    unsigned int        revPInvokeOffset; // INVALID_REV_PINVOKE_OFFSET if there is no Reverse PInvoke frame
 
     enum { NOT_IN_PROLOG = -1, NOT_IN_EPILOG = -1 };
     
index d337fae..ae67236 100644 (file)
@@ -86,19 +86,20 @@ size_t FASTCALL decodeSigned(PTR_CBYTE src, int* val)
 #pragma optimize("tgy", on)
 #endif
 
-PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
+PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, UINT32 version, InfoHdr* header)
 {
     LIMITED_METHOD_DAC_CONTRACT;
 
-    BYTE byte = *table++;
-    BYTE encoding = byte & 0x7f;
-    
+    BYTE nextByte = *table++;
+    BYTE encoding = nextByte & 0x7f;
+    const BYTE maskHaveMoreBytesBit = MORE_BYTES_TO_FOLLOW - 1;
     GetInfoHdr(encoding, header);
-
-    while (byte & 0x80)
+    while (nextByte & MORE_BYTES_TO_FOLLOW)
     {
-        byte = *table++;
-        encoding = byte & 0x7f;
+        nextByte = *table++;
+        encoding = nextByte & maskHaveMoreBytesBit;
+        // encoding here always corresponds to codes in InfoHdrAdjust set
+
         if (encoding < NEXT_FOUR_START)
         {
             if (encoding < SET_ARGCOUNT)
@@ -126,6 +127,7 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
             else if (encoding < FIRST_FLIP)
             {
                 header->untrackedCnt = encoding - SET_UNTRACKED;
+                _ASSERTE(header->untrackedCnt != HAS_UNTRACKED);
             }
             else switch (encoding)
             {
@@ -145,22 +147,22 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
                 header->ebpSaved ^= 1;
                 break;
             case FLIP_EBP_FRAME:
-                header->ebpFrame  ^= 1;
+                header->ebpFrame ^= 1;
                 break;
             case FLIP_INTERRUPTIBLE:
-                header->interruptible  ^= 1;
+                header->interruptible ^= 1;
                 break;
             case FLIP_DOUBLE_ALIGN:
-                header->doubleAlign  ^= 1;
+                header->doubleAlign ^= 1;
                 break;
             case FLIP_SECURITY:
-                header->security  ^= 1;
+                header->security ^= 1;
                 break;
             case FLIP_HANDLERS:
-                header->handlers  ^= 1;
+                header->handlers ^= 1;
                 break;
             case FLIP_LOCALLOC:
-                header->localloc  ^= 1;
+                header->localloc ^= 1;
                 break;
             case FLIP_EDITnCONTINUE:
                 header->editNcontinue ^= 1;
@@ -172,10 +174,10 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
                 header->untrackedCnt = HAS_UNTRACKED;
                 break;
             case FLIP_VARARGS:
-                header->varargs  ^= 1;
+                header->varargs ^= 1;
                 break;
             case FLIP_PROF_CALLBACKS:
-                header->profCallbacks  ^= 1;
+                header->profCallbacks ^= 1;
                 break;
             case FLIP_HAS_GENERICS_CONTEXT:
                 header->genericsContext ^= 1;
@@ -189,6 +191,27 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
             case FLIP_SYNC:
                 header->syncStartOffset ^= HAS_SYNC_OFFSET;
                 break;
+            case FLIP_REV_PINVOKE_FRAME:
+                _ASSERTE(GCInfoEncodesRevPInvokeFrame(version));
+                header->revPInvokeOffset ^= HAS_REV_PINVOKE_FRAME_OFFSET;
+                break;
+
+            case NEXT_OPCODE:
+                _ASSERTE((nextByte & MORE_BYTES_TO_FOLLOW) && "Must have another code");
+                nextByte = *table++;
+                encoding = nextByte & maskHaveMoreBytesBit;
+                // encoding here always corresponds to codes in InfoHdrAdjust2 set
+
+                if (encoding < SET_RET_KIND_MAX)
+                {
+                    _ASSERTE(GCInfoEncodesReturnKind(version));
+                    header->returnKind = (ReturnKind)encoding;
+                }
+                else
+                {
+                    assert(!"Unexpected encoding");
+                }
+                break;
             }
         }
         else
@@ -202,14 +225,14 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
             case 5:
                 assert(NEXT_FOUR_FRAMESIZE == 0x50);
                 lowBits = encoding & 0xf;
-                header->frameSize  <<= 4;
-                header->frameSize   += lowBits;
+                header->frameSize <<= 4;
+                header->frameSize += lowBits;
                 break;
             case 6:
                 assert(NEXT_FOUR_ARGCOUNT == 0x60);
                 lowBits = encoding & 0xf;
-                header->argCount   <<= 4;
-                header->argCount    += lowBits;
+                header->argCount <<= 4;
+                header->argCount += lowBits;
                 break;
             case 7:
                 if ((encoding & 0x8) == 0)
@@ -217,14 +240,14 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
                     assert(NEXT_THREE_PROLOGSIZE == 0x70);
                     lowBits = encoding & 0x7;
                     header->prologSize <<= 3;
-                    header->prologSize  += lowBits;
+                    header->prologSize += lowBits;
                 }
                 else
                 {
                     assert(NEXT_THREE_EPILOGSIZE == 0x78);
                     lowBits = encoding & 0x7;
                     header->epilogSize <<= 3;
-                    header->epilogSize  += lowBits;
+                    header->epilogSize += lowBits;
                 }
                 break;
             }
@@ -293,154 +316,155 @@ const InfoHdrSmall infoHdrShortcut[128] = {
 //        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 //        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  genericsContext
 //        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   genericsContextIsMethodDesc
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   Arg count
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |                                 Counted occurances
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   Frame size                    |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |                             |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   untrackedCnt              |   Header encoding
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |                         |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |  varPtrTable            |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |                     |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |  gsCookieOffs       |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |   |                 |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |   | syncOffs        |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |   |  |  |           |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |   |  |  |           |   |
-//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |   |   |  |  |           |   |
-//        v   v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v   v   v   v   v   v   v  v  v           v   v
-       {  0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    1139  00
-       {  0,  1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //  128738  01
-       {  0,  1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    3696  02
-       {  0,  1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     402  03
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    4259  04
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  1,  0          },  //    3379  05
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //    2058  06
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  1,  0          },  //     728  07
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  2,  0          },  //     984  08
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  3,  0,  0,  0          },  //     606  09
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  4,  0,  0,  0          },  //    1110  0a
-       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  4,  0,  1,  0          },  //     414  0b
-       {  1,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //    1553  0c
-       {  1,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  0, YES         },  //     584  0d
-       {  1,  2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //    2182  0e
-       {  1,  2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    3445  0f
-       {  1,  2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1369  10
-       {  1,  2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     515  11
-       {  1,  2, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //   21127  12
-       {  1,  2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    3517  13
-       {  1,  2, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     750  14
-       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1876  15
-       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  1,  0          },  //    1665  16
-       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     729  17
-       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  2,  0          },  //     484  18
-       {  1,  4, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //     331  19
-       {  2,  3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     361  1a
-       {  2,  3, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     964  1b
-       {  2,  3, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    3713  1c
-       {  2,  3, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     466  1d
-       {  2,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1325  1e
-       {  2,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     712  1f
-       {  2,  3, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     588  20
-       {  2,  3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //   20542  21
-       {  2,  3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    3802  22
-       {  2,  3, 3, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     798  23
-       {  2,  5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1900  24
-       {  2,  5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     385  25
-       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1617  26
-       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  1,  0          },  //    1743  27
-       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     909  28
-       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  1,  0          },  //     602  29
-       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  2,  0          },  //     352  2a
-       {  2,  6, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     657  2b
-       {  2,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  0,  0, YES         },  //    1283  2c
-       {  2,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //    1286  2d
-       {  3,  4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1495  2e
-       {  3,  4, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    1989  2f
-       {  3,  4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1154  30
-       {  3,  4, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    9300  31
-       {  3,  4, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //     392  32
-       {  3,  4, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    1720  33
-       {  3,  6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1246  34
-       {  3,  6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     800  35
-       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1179  36
-       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  1,  0          },  //    1368  37
-       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     349  38
-       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  2,  0          },  //     505  39
-       {  3,  6, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //     629  3a
-       {  3,  8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  9,  2, YES         },  //     365  3b
-       {  4,  5, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //     487  3c
-       {  4,  5, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    1752  3d
-       {  4,  5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1959  3e
-       {  4,  5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    2436  3f
-       {  4,  5, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     861  40
-       {  4,  7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1459  41
-       {  4,  7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     950  42
-       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //    1491  43
-       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  1,  0          },  //     879  44
-       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  0,  0,  0          },  //     408  45
-       {  5,  4, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //    4870  46
-       {  5,  6, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //     359  47
-       {  5,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0,  0          },  //     915  48
-       {  5,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  4,  0,  0          },  //     412  49
-       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1288  4a
-       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //    1591  4b
-       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  0, YES         },  //     361  4c
-       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  1,  0,  0          },  //     623  4d
-       {  5,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  0,  0          },  //    1239  4e
-       {  6,  0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     457  4f
-       {  6,  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     606  50
-       {  6,  4, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0, YES         },  //    1073  51
-       {  6,  4, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0, YES         },  //     508  52
-       {  6,  6, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //     330  53
-       {  6,  6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //    1709  54
-       {  6,  7, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0,  0          },  //    1164  55
-       {  7,  4, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0          },  //     556  56
-       {  7,  5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  3,  0, YES         },  //     529  57
-       {  7,  5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  5,  0, YES         },  //    1423  58
-       {  7,  8, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  3,  0, YES         },  //    2455  59
-       {  7,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0,  0          },  //     956  5a
-       {  7,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0, YES         },  //    1399  5b
-       {  7,  8, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  3,  0, YES         },  //     587  5c
-       {  7, 10, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  6,  1, YES         },  //     743  5d
-       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  2,  0,  0          },  //    1004  5e
-       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  2,  1, YES         },  //     487  5f
-       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  2,  0,  0          },  //     337  60
-       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  3,  0, YES         },  //     361  61
-       {  8,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  1,  0          },  //     560  62
-       {  8,  6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0,  0          },  //    1377  63
-       {  9,  4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  1,  0          },  //     877  64
-       {  9,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  0,  0          },  //    3041  65
-       {  9,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  0,  0, YES         },  //     349  66
-       { 10,  5, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  4,  1,  0          },  //    2061  67
-       { 10,  5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  1,  0          },  //     577  68
-       { 11,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  4,  1,  0          },  //    1195  69
-       { 12,  5, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0,  0          },  //     491  6a
-       { 13,  8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  9,  0, YES         },  //     627  6b
-       { 13,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  2,  1,  0          },  //    1099  6c
-       { 13, 10, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  2,  6,  1, YES         },  //     488  6d
-       { 14,  7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     574  6e
-       { 16,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  4,  0, YES         },  //    1281  6f
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  0,  0, YES         },  //    1881  70
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     339  71
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  3,  0,  0          },  //    2594  72
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  4,  0,  0          },  //     339  73
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  4,  0, YES         },  //    2107  74
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  5,  0, YES         },  //    2372  75
-       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  6,  0, YES         },  //    1078  76
-       { 16,  7, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  4,  0, YES         },  //     384  77
-       { 16,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  1,  4,  1, YES         },  //    1541  78
-       { 16,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  2,  4,  1, YES         },  //     975  79
-       { 19,  7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  5,  0, YES         },  //     546  7a
-       { 24,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0,  0,  5,  0, YES         },  //     675  7b
-       { 45,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  1,  0,  0,  0          },  //     902  7c
-       { 51,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 13,  0, YES         },  //     432  7d
-       { 51,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  1,  0, YES         },  //     361  7e
-       { 51,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 11,  0,  0          },  //     703  7f
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  genericsContextIsMethodDesc
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  returnKind
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Arg count
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |                                 Counted occurences
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   Frame size                    |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |                             |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   untrackedCnt              |   Header encoding
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |                         |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |  varPtrTable            |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |                     |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |  gsCookieOffs       |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |                 |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   | syncOffs        |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |  |  |           |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |  |  |           |   |
+//        |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   |   |   |   |  |  |           |   |
+//        v   v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v  v   v   v   v   v  v  v           v   v
+       {  0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    1139  00
+       {  0,  1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //  128738  01
+       {  0,  1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    3696  02
+       {  0,  1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     402  03
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    4259  04
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  1,  0          },  //    3379  05
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //    2058  06
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  1,  0          },  //     728  07
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  2,  0          },  //     984  08
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,  0,  0,  0          },  //     606  09
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,  0,  0,  0          },  //    1110  0a
+       {  0,  3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,  0,  1,  0          },  //     414  0b
+       {  1,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //    1553  0c
+       {  1,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  1,  0, YES         },  //     584  0d
+       {  1,  2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //    2182  0e
+       {  1,  2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    3445  0f
+       {  1,  2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1369  10
+       {  1,  2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     515  11
+       {  1,  2, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //   21127  12
+       {  1,  2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    3517  13
+       {  1,  2, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     750  14
+       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1876  15
+       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  1,  0          },  //    1665  16
+       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     729  17
+       {  1,  4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  2,  0          },  //     484  18
+       {  1,  4, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //     331  19
+       {  2,  3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     361  1a
+       {  2,  3, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     964  1b
+       {  2,  3, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    3713  1c
+       {  2,  3, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     466  1d
+       {  2,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1325  1e
+       {  2,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     712  1f
+       {  2,  3, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     588  20
+       {  2,  3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //   20542  21
+       {  2,  3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    3802  22
+       {  2,  3, 3, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     798  23
+       {  2,  5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1900  24
+       {  2,  5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     385  25
+       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1617  26
+       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  1,  0          },  //    1743  27
+       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     909  28
+       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  1,  0          },  //     602  29
+       {  2,  5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  2,  0          },  //     352  2a
+       {  2,  6, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     657  2b
+       {  2,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, YES         },  //    1283  2c
+       {  2,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //    1286  2d
+       {  3,  4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1495  2e
+       {  3,  4, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    1989  2f
+       {  3,  4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1154  30
+       {  3,  4, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    9300  31
+       {  3,  4, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //     392  32
+       {  3,  4, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    1720  33
+       {  3,  6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1246  34
+       {  3,  6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     800  35
+       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1179  36
+       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  1,  0          },  //    1368  37
+       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     349  38
+       {  3,  6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  2,  0          },  //     505  39
+       {  3,  6, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //     629  3a
+       {  3,  8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  9,  2, YES         },  //     365  3b
+       {  4,  5, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //     487  3c
+       {  4,  5, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    1752  3d
+       {  4,  5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1959  3e
+       {  4,  5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    2436  3f
+       {  4,  5, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     861  40
+       {  4,  7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1459  41
+       {  4,  7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     950  42
+       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //    1491  43
+       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  1,  0          },  //     879  44
+       {  4,  7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  0,  0,  0          },  //     408  45
+       {  5,  4, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //    4870  46
+       {  5,  6, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //     359  47
+       {  5,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0,  0          },  //     915  48
+       {  5,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  4,  0,  0          },  //     412  49
+       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1288  4a
+       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //    1591  4b
+       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  1,  0, YES         },  //     361  4c
+       {  5,  6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  1,  0,  0          },  //     623  4d
+       {  5,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  1,  0,  0          },  //    1239  4e
+       {  6,  0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     457  4f
+       {  6,  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     606  50
+       {  6,  4, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0, YES         },  //    1073  51
+       {  6,  4, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0, YES         },  //     508  52
+       {  6,  6, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //     330  53
+       {  6,  6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //    1709  54
+       {  6,  7, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0,  0          },  //    1164  55
+       {  7,  4, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0          },  //     556  56
+       {  7,  5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  3,  0, YES         },  //     529  57
+       {  7,  5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  5,  0, YES         },  //    1423  58
+       {  7,  8, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  3,  0, YES         },  //    2455  59
+       {  7,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0,  0          },  //     956  5a
+       {  7,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0, YES         },  //    1399  5b
+       {  7,  8, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  3,  0, YES         },  //     587  5c
+       {  7, 10, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  6,  1, YES         },  //     743  5d
+       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  2,  0,  0          },  //    1004  5e
+       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  2,  1, YES         },  //     487  5f
+       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  2,  0,  0          },  //     337  60
+       {  7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  3,  0, YES         },  //     361  61
+       {  8,  3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  1,  0          },  //     560  62
+       {  8,  6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0,  0          },  //    1377  63
+       {  9,  4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  1,  0          },  //     877  64
+       {  9,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  0,  0          },  //    3041  65
+       {  9,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, YES         },  //     349  66
+       { 10,  5, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  4,  1,  0          },  //    2061  67
+       { 10,  5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  1,  0          },  //     577  68
+       { 11,  6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  4,  1,  0          },  //    1195  69
+       { 12,  5, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0,  0          },  //     491  6a
+       { 13,  8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  9,  0, YES         },  //     627  6b
+       { 13,  8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  2,  1,  0          },  //    1099  6c
+       { 13, 10, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,  6,  1, YES         },  //     488  6d
+       { 14,  7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     574  6e
+       { 16,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  4,  0, YES         },  //    1281  6f
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, YES         },  //    1881  70
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     339  71
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  3,  0,  0          },  //    2594  72
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  4,  0,  0          },  //     339  73
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  4,  0, YES         },  //    2107  74
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  5,  0, YES         },  //    2372  75
+       { 16,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  6,  0, YES         },  //    1078  76
+       { 16,  7, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  4,  0, YES         },  //     384  77
+       { 16,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,  4,  1, YES         },  //    1541  78
+       { 16,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,  4,  1, YES         },  //     975  79
+       { 19,  7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  5,  0, YES         },  //     546  7a
+       { 24,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  5,  0, YES         },  //     675  7b
+       { 45,  9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  0,  0,  0          },  //     902  7c
+       { 51,  7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,  0, YES         },  //     432  7d
+       { 51,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1,  0, YES         },  //     361  7e
+       { 51,  7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,  0,  0          },  //     703  7f
 };
 
-
 bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
 {
 #ifdef _ASSERTE
@@ -448,7 +472,8 @@ bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
     _ASSERTE(target.untrackedCnt != HAS_UNTRACKED &&
                 target.varPtrTableSize != HAS_VARPTR &&
                 target.gsCookieOffset != HAS_GS_COOKIE_OFFSET &&
-                target.syncStartOffset != HAS_SYNC_OFFSET);
+                target.syncStartOffset != HAS_SYNC_OFFSET && 
+                target.revPInvokeOffset != HAS_REV_PINVOKE_FRAME_OFFSET);
 #endif
 
     // compare two InfoHdr's up to but not including the untrackCnt field
@@ -470,7 +495,13 @@ bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
     if (target.gsCookieOffset != INVALID_GS_COOKIE_OFFSET)
         return false;
 
-    return target.syncStartOffset == INVALID_SYNC_OFFSET;
+    if (target.syncStartOffset != INVALID_SYNC_OFFSET)
+        return false;
+
+    if (target.revPInvokeOffset!= INVALID_REV_PINVOKE_OFFSET)
+        return false;
+
+    return true;
 }
 
 
@@ -503,7 +534,7 @@ const unsigned callCommonDelta[4] = { 6,8,10,12 };
  *   EDI = 0x1, ESI = 0x2, EBX = 0x4, EBP = 0x8
  *
  */
-const unsigned callPatternTable[80] = {               // # of occurances
+const unsigned callPatternTable[80] = {               // # of occurences
     0x0a000200, //   30109
     0x0c000200, //   22970
     0x0c000201, //   19005
index cd73940..3271ca1 100644 (file)
@@ -45,7 +45,7 @@ public:
      * Return value     : Size in bytes of the header encoding
      */
 
-    unsigned FASTCALL   DumpInfoHdr (PTR_CBYTE      gcInfoBlock,
+    unsigned FASTCALL   DumpInfoHdr (PTR_CBYTE   gcInfoBlock,
                                      InfoHdr    *   header,         /* OUT */
                                      unsigned   *   methodSize,     /* OUT */
                                      bool           verifyGCTables = false);
@@ -53,7 +53,7 @@ public:
 
     /*-------------------------------------------------------------------------
      * Dumps the GC tables to 'stdout'
-     * table            : The GCInfoToken
+     * gcInfoBlock      : Start of the GC info block
      * verifyGCTables   : If the JIT has been compiled with VERIFY_GC_TABLES
      * Return value     : Size in bytes of the GC table encodings
      */
@@ -70,10 +70,10 @@ public:
      * verifyGCTables   : If the JIT has been compiled with VERIFY_GC_TABLES
      */
 
-    void     FASTCALL   DumpPtrsInFrame(PTR_CBYTE   infoBlock,
-                                     PTR_CBYTE      codeBlock,
-                                     unsigned       offs,
-                                     bool           verifyGCTables = false);
+    void     FASTCALL   DumpPtrsInFrame(PTR_CBYTE   gcInfoBlock,
+                                        PTR_CBYTE   codeBlock,
+                                        unsigned    offs,
+                                        bool        verifyGCTables = false);
 
 
 public:
index 8d249a3..acfc072 100644 (file)
@@ -32,8 +32,8 @@ const unsigned   this_OFFSET_FLAG  = 0x2;  // the offset is "this"
 // The current GCInfo Version
 //-----------------------------------------------------------------------------
 
-#ifdef _TARGET_X86_
-// X86 GcInfo encoding is yet to be changed.
+#if defined(_TARGET_X86_) && !defined(FEATURE_CORECLR)
+// X86 GcInfo encoding is yet to be changed for Desktop JIT32.         
 #define GCINFO_VERSION 1
 #else
 #define GCINFO_VERSION 2
@@ -41,6 +41,17 @@ const unsigned   this_OFFSET_FLAG  = 0x2;  // the offset is "this"
 
 #define MIN_GCINFO_VERSION_WITH_RETURN_KIND 2
 #define MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME 2
+
+inline BOOL GCInfoEncodesReturnKind(UINT32 version=GCINFO_VERSION)
+{
+    return version >= MIN_GCINFO_VERSION_WITH_RETURN_KIND;
+}
+
+inline BOOL GCInfoEncodesRevPInvokeFrame(UINT32 version=GCINFO_VERSION)
+{
+    return version >= MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME;
+}
+
 //-----------------------------------------------------------------------------
 // GCInfoToken: A wrapper that contains the GcInfo data and version number.
 //
@@ -62,11 +73,11 @@ struct GCInfoToken
 
     BOOL IsReturnKindAvailable() 
     {
-        return (Version >= MIN_GCINFO_VERSION_WITH_RETURN_KIND);
+        return GCInfoEncodesReturnKind(Version);
     }
     BOOL IsReversePInvokeFrameAvailable() 
     {
-        return (Version >= MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME);
+        return GCInfoEncodesRevPInvokeFrame(Version);
     }
 
     static UINT32 ReadyToRunVersionToGcInfoVersion(UINT32 readyToRunMajorVersion)
index cd19759..1edb5f3 100644 (file)
@@ -376,12 +376,15 @@ enum infoHdrAdjustConstants {
     SET_PROLOGSIZE_MAX = 16,
     SET_EPILOGSIZE_MAX = 10,  // Change to 6
     SET_EPILOGCNT_MAX = 4,
-    SET_UNTRACKED_MAX = 3
+    SET_UNTRACKED_MAX = 3,
+    SET_RET_KIND_MAX = 4,   // 2 bits for ReturnKind
+    MORE_BYTES_TO_FOLLOW = 0x80 // If the High-bit of a header or adjustment byte 
+                               // is set, then there are more adjustments to follow.
 };
 
 //
-// Enum to define the 128 codes that are used to incrementally adjust the InfoHdr structure
-//
+// Enum to define codes that are used to incrementally adjust the InfoHdr structure.
+// First set of opcodes
 enum infoHdrAdjust {
 
     SET_FRAMESIZE = 0,                                            // 0x00
@@ -412,18 +415,25 @@ enum infoHdrAdjust {
     FLIP_SYNC,                // 0x4B
     FLIP_HAS_GENERICS_CONTEXT,// 0x4C
     FLIP_GENERICS_CONTEXT_IS_METHODDESC,// 0x4D
+    FLIP_REV_PINVOKE_FRAME,   // 0x4E
+    NEXT_OPCODE,              // 0x4F -- see next Adjustment enumeration
+    NEXT_FOUR_START = 0x50,
+    NEXT_FOUR_FRAMESIZE = 0x50,
+    NEXT_FOUR_ARGCOUNT = 0x60,
+    NEXT_THREE_PROLOGSIZE = 0x70,
+    NEXT_THREE_EPILOGSIZE = 0x78
+};
 
-                                        // 0x4E .. 0x4f unused
-
-                                        NEXT_FOUR_START = 0x50,
-                                        NEXT_FOUR_FRAMESIZE = 0x50,
-                                        NEXT_FOUR_ARGCOUNT = 0x60,
-                                        NEXT_THREE_PROLOGSIZE = 0x70,
-                                        NEXT_THREE_EPILOGSIZE = 0x78
+// Second set of opcodes, when first code is 0x4F
+enum infoHdrAdjust2 {
+    SET_RETURNKIND = 0,  // 0x00-SET_RET_KIND_MAX Set ReturnKind to value
 };
 
 #define HAS_UNTRACKED               ((unsigned int) -1)
 #define HAS_VARPTR                  ((unsigned int) -1)
+
+#define INVALID_REV_PINVOKE_OFFSET   0
+#define HAS_REV_PINVOKE_FRAME_OFFSET ((unsigned int) -1)
 // 0 is not a valid offset for EBP-frames as all locals are at a negative offset
 // For ESP frames, the cookie is above (at a higher address than) the buffers, 
 // and so cannot be at offset 0.
@@ -463,6 +473,7 @@ struct InfoHdrSmall {
     unsigned char  profCallbacks : 1; // 4 [0]
     unsigned char  genericsContext : 1;//4 [1]      function reports a generics context parameter is present
     unsigned char  genericsContextIsMethodDesc : 1;//4[2]
+    unsigned char  returnKind : 2; // 4 [4]  Available GcInfo v2 onwards, previously undefined 
     unsigned short argCount;          // 5,6        in bytes
     unsigned int   frameSize;         // 7,8,9,10   in bytes
     unsigned int   untrackedCnt;      // 11,12,13,14
@@ -483,8 +494,8 @@ struct InfoHdr : public InfoHdrSmall {
     unsigned int   gsCookieOffset;    // 19,20,21,22
     unsigned int   syncStartOffset;   // 23,24,25,26
     unsigned int   syncEndOffset;     // 27,28,29,30
-
-                                      // 31 bytes total
+    unsigned int   revPInvokeOffset;  // 31,32,33,34 Available GcInfo v2 onwards, previously undefined 
+                                      // 35 bytes total
 
                                       // Checks whether "this" is compatible with "target".
                                       // It is not an exact bit match as "this" could have some 
@@ -498,7 +509,8 @@ struct InfoHdr : public InfoHdrSmall {
         _ASSERTE(target.untrackedCnt != HAS_UNTRACKED &&
             target.varPtrTableSize != HAS_VARPTR &&
             target.gsCookieOffset != HAS_GS_COOKIE_OFFSET &&
-            target.syncStartOffset != HAS_SYNC_OFFSET);
+            target.syncStartOffset != HAS_SYNC_OFFSET && 
+            target.revPInvokeOffset != HAS_REV_PINVOKE_FRAME_OFFSET);
 #endif
 
         // compare two InfoHdr's up to but not including the untrackCnt field
@@ -525,6 +537,10 @@ struct InfoHdr : public InfoHdrSmall {
             (target.syncStartOffset == INVALID_SYNC_OFFSET))
             return false;
 
+        if ((revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET) !=
+            (target.revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET))
+            return false;
+
         return true;
     }
 };
@@ -551,15 +567,16 @@ inline void GetInfoHdr(int index, InfoHdr * header)
 {
     *((InfoHdrSmall *)header) = infoHdrShortcut[index];
 
-    header->gsCookieOffset = 0;
-    header->syncStartOffset = 0;
-    header->syncEndOffset = 0;
+    header->gsCookieOffset = INVALID_GS_COOKIE_OFFSET;
+    header->syncStartOffset = INVALID_SYNC_OFFSET;
+    header->syncEndOffset = INVALID_SYNC_OFFSET;
+    header->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET;
 }
 
-PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header);
+PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, UINT32 version, InfoHdr* header);
 
 BYTE FASTCALL encodeHeaderFirst(const InfoHdr& header, InfoHdr* state, int* more, int *pCached);
-BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state);
+BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state, BYTE &codeSet);
 
 size_t FASTCALL decodeUnsigned(PTR_CBYTE src, unsigned* value);
 size_t FASTCALL decodeUDelta(PTR_CBYTE src, unsigned* value, unsigned lastValue);
index 0c4a311..9a85f59 100755 (executable)
@@ -494,6 +494,11 @@ protected:
 //
 //-------------------------------------------------------------------------
 
+    void genSinglePush();
+    void genSinglePop();
+    regMaskTP genPushRegs(regMaskTP regs, regMaskTP* byrefRegs, regMaskTP* noRefRegs);
+    void genPopRegs(regMaskTP regs, regMaskTP byrefRegs, regMaskTP noRefRegs);
+
 /*****************************************************************************/
 #ifdef DEBUGGING_SUPPORT
 /*****************************************************************************/
index 81b7b34..3a88c83 100644 (file)
@@ -63,10 +63,6 @@ void genPInvokeCallEpilog(LclVarDsc* varDsc, regMaskTP retVal);
 
 regNumber genLclHeap(GenTreePtr size);
 
-void genSinglePush();
-
-void genSinglePop();
-
 void genDyingVars(VARSET_VALARG_TP beforeSet, VARSET_VALARG_TP afterSet);
 
 bool genContainsVarDeath(GenTreePtr from, GenTreePtr to, unsigned varNum);
@@ -287,9 +283,6 @@ void genCodeForJumpTable(GenTreePtr tree);
 void genCodeForSwitchTable(GenTreePtr tree);
 void genCodeForSwitch(GenTreePtr tree);
 
-regMaskTP genPushRegs(regMaskTP regs, regMaskTP* byrefRegs, regMaskTP* noRefRegs);
-void genPopRegs(regMaskTP regs, regMaskTP byrefRegs, regMaskTP noRefRegs);
-
 size_t genPushArgList(GenTreePtr call);
 
 #ifdef _TARGET_ARM_
index 56ab2e7..64fb841 100755 (executable)
@@ -10853,6 +10853,159 @@ unsigned CodeGen::getFirstArgWithStackSlot()
 
 #endif // !LEGACY_BACKEND && (_TARGET_XARCH_ || _TARGET_ARM64_)
 
+//------------------------------------------------------------------------
+// genSinglePush: Report a change in stack level caused by a single word-sized push instruction
+//
+void CodeGen::genSinglePush()
+{
+    genStackLevel += sizeof(void*);
+}
+
+//------------------------------------------------------------------------
+// genSinglePop: Report a change in stack level caused by a single word-sized pop instruction
+//
+void CodeGen::genSinglePop()
+{
+    genStackLevel -= sizeof(void*);
+}
+
+//------------------------------------------------------------------------
+// genPushRegs: Push the given registers.
+//
+// Arguments:
+//    regs - mask or registers to push
+//    byrefRegs - OUT arg. Set to byref registers that were pushed.
+//    noRefRegs - OUT arg. Set to non-GC ref registers that were pushed.
+//
+// Return Value:
+//    Mask of registers pushed.
+//
+// Notes:
+//    This function does not check if the register is marked as used, etc.
+//
+regMaskTP CodeGen::genPushRegs(regMaskTP regs, regMaskTP* byrefRegs, regMaskTP* noRefRegs)
+{
+    *byrefRegs = RBM_NONE;
+    *noRefRegs = RBM_NONE;
+
+    if (regs == RBM_NONE)
+        return RBM_NONE;
+
+#if FEATURE_FIXED_OUT_ARGS
+
+    NYI("Don't call genPushRegs with real regs!");
+    return RBM_NONE;
+
+#else // FEATURE_FIXED_OUT_ARGS
+
+    noway_assert(genTypeStSz(TYP_REF) == genTypeStSz(TYP_I_IMPL));
+    noway_assert(genTypeStSz(TYP_BYREF) == genTypeStSz(TYP_I_IMPL));
+
+    regMaskTP pushedRegs = regs;
+
+    for (regNumber reg = REG_INT_FIRST; regs != RBM_NONE; reg = REG_NEXT(reg))
+    {
+        regMaskTP regBit = regMaskTP(1) << reg;
+
+        if ((regBit & regs) == RBM_NONE)
+            continue;
+
+        var_types type;
+        if (regBit & gcInfo.gcRegGCrefSetCur)
+        {
+            type = TYP_REF;
+        }
+        else if (regBit & gcInfo.gcRegByrefSetCur)
+        {
+            *byrefRegs |= regBit;
+            type = TYP_BYREF;
+        }
+        else if (noRefRegs != NULL)
+        {
+            *noRefRegs |= regBit;
+            type = TYP_I_IMPL;
+        }
+        else
+        {
+            continue;
+        }
+
+        inst_RV(INS_push, reg, type);
+
+        genSinglePush();
+        gcInfo.gcMarkRegSetNpt(regBit);
+
+        regs &= ~regBit;
+    }
+
+    return pushedRegs;
+
+#endif // FEATURE_FIXED_OUT_ARGS
+}
+
+//------------------------------------------------------------------------
+// genPopRegs: Pop the registers that were pushed by genPushRegs().
+//
+// Arguments:
+//    regs - mask of registers to pop
+//    byrefRegs - The byref registers that were pushed by genPushRegs().
+//    noRefRegs - The non-GC ref registers that were pushed by genPushRegs().
+//
+// Return Value:
+//    None
+//
+void CodeGen::genPopRegs(regMaskTP regs, regMaskTP byrefRegs, regMaskTP noRefRegs)
+{
+    if (regs == RBM_NONE)
+        return;
+
+#if FEATURE_FIXED_OUT_ARGS
+
+    NYI("Don't call genPopRegs with real regs!");
+
+#else // FEATURE_FIXED_OUT_ARGS
+
+    noway_assert((regs & byrefRegs) == byrefRegs);
+    noway_assert((regs & noRefRegs) == noRefRegs);
+    noway_assert((regs & (gcInfo.gcRegGCrefSetCur | gcInfo.gcRegByrefSetCur)) == RBM_NONE);
+
+    noway_assert(genTypeStSz(TYP_REF) == genTypeStSz(TYP_INT));
+    noway_assert(genTypeStSz(TYP_BYREF) == genTypeStSz(TYP_INT));
+
+    // Walk the registers in the reverse order as genPushRegs()
+    for (regNumber reg = REG_INT_LAST; regs != RBM_NONE; reg = REG_PREV(reg))
+    {
+        regMaskTP regBit = regMaskTP(1) << reg;
+
+        if ((regBit & regs) == RBM_NONE)
+            continue;
+
+        var_types type;
+        if (regBit & byrefRegs)
+        {
+            type = TYP_BYREF;
+        }
+        else if (regBit & noRefRegs)
+        {
+            type = TYP_INT;
+        }
+        else
+        {
+            type = TYP_REF;
+        }
+
+        inst_RV(INS_pop, reg, type);
+        genSinglePop();
+
+        if (type != TYP_INT)
+            gcInfo.gcMarkRegPtrVal(reg, type);
+
+        regs &= ~regBit;
+    }
+
+#endif // FEATURE_FIXED_OUT_ARGS
+}
+
 /*****************************************************************************/
 #ifdef DEBUGGING_SUPPORT
 
index ea40eb2..742c2ee 100644 (file)
@@ -243,18 +243,6 @@ GenTreePtr CodeGen::genGetAddrModeBase(GenTreePtr tree)
         return NULL;
 }
 
-// inline
-void CodeGen::genSinglePush()
-{
-    genStackLevel += sizeof(void*);
-}
-
-// inline
-void CodeGen::genSinglePop()
-{
-    genStackLevel -= sizeof(void*);
-}
-
 #if FEATURE_STACK_FP_X87
 // inline
 void CodeGenInterface::genResetFPstkLevel(unsigned newValue /* = 0 */)
@@ -15792,132 +15780,6 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize)
 
 /*****************************************************************************
  *
- *  Push the given registers.
- *  This function does not check if the register is marked as used, etc.
- */
-
-regMaskTP CodeGen::genPushRegs(regMaskTP regs, regMaskTP* byrefRegs, regMaskTP* noRefRegs)
-{
-    *byrefRegs = RBM_NONE;
-    *noRefRegs = RBM_NONE;
-
-    // noway_assert((regs & regSet.rsRegMaskFree()) == regs); // Don't care. Caller is responsible for all this
-
-    if (regs == RBM_NONE)
-        return RBM_NONE;
-
-#if FEATURE_FIXED_OUT_ARGS
-
-    NYI("Don't call genPushRegs with real regs!");
-    return RBM_NONE;
-
-#else // FEATURE_FIXED_OUT_ARGS
-
-    noway_assert(genTypeStSz(TYP_REF) == genTypeStSz(TYP_I_IMPL));
-    noway_assert(genTypeStSz(TYP_BYREF) == genTypeStSz(TYP_I_IMPL));
-
-    regMaskTP pushedRegs = regs;
-
-    for (regNumber reg = REG_INT_FIRST; regs != RBM_NONE; reg = REG_NEXT(reg))
-    {
-        regMaskTP regBit = regMaskTP(1) << reg;
-
-        if ((regBit & regs) == RBM_NONE)
-            continue;
-
-        var_types type;
-        if (regBit & gcInfo.gcRegGCrefSetCur)
-        {
-            type = TYP_REF;
-        }
-        else if (regBit & gcInfo.gcRegByrefSetCur)
-        {
-            *byrefRegs |= regBit;
-            type = TYP_BYREF;
-        }
-        else if (noRefRegs != NULL)
-        {
-            *noRefRegs |= regBit;
-            type = TYP_I_IMPL;
-        }
-        else
-        {
-            continue;
-        }
-
-        inst_RV(INS_push, reg, type);
-
-        genSinglePush();
-        gcInfo.gcMarkRegSetNpt(regBit);
-
-        regs &= ~regBit;
-    }
-
-    return pushedRegs;
-
-#endif // FEATURE_FIXED_OUT_ARGS
-}
-
-/*****************************************************************************
- *
- * Pop the registers pushed by genPushRegs()
- */
-
-void CodeGen::genPopRegs(regMaskTP regs, regMaskTP byrefRegs, regMaskTP noRefRegs)
-{
-    if (regs == RBM_NONE)
-        return;
-
-#if FEATURE_FIXED_OUT_ARGS
-
-    NYI("Don't call genPopRegs with real regs!");
-
-#else // FEATURE_FIXED_OUT_ARGS
-
-    noway_assert((regs & byrefRegs) == byrefRegs);
-    noway_assert((regs & noRefRegs) == noRefRegs);
-    // noway_assert((regs & regSet.rsRegMaskFree()) == regs); // Don't care. Caller is responsible for all this
-    noway_assert((regs & (gcInfo.gcRegGCrefSetCur | gcInfo.gcRegByrefSetCur)) == RBM_NONE);
-
-    noway_assert(genTypeStSz(TYP_REF) == genTypeStSz(TYP_INT));
-    noway_assert(genTypeStSz(TYP_BYREF) == genTypeStSz(TYP_INT));
-
-    // Walk the registers in the reverse order as genPushRegs()
-    for (regNumber reg = REG_INT_LAST; regs != RBM_NONE; reg = REG_PREV(reg))
-    {
-        regMaskTP regBit = regMaskTP(1) << reg;
-
-        if ((regBit & regs) == RBM_NONE)
-            continue;
-
-        var_types type;
-        if (regBit & byrefRegs)
-        {
-            type = TYP_BYREF;
-        }
-        else if (regBit & noRefRegs)
-        {
-            type = TYP_INT;
-        }
-        else
-        {
-            type = TYP_REF;
-        }
-
-        inst_RV(INS_pop, reg, type);
-        genSinglePop();
-
-        if (type != TYP_INT)
-            gcInfo.gcMarkRegPtrVal(reg, type);
-
-        regs &= ~regBit;
-    }
-
-#endif // FEATURE_FIXED_OUT_ARGS
-}
-
-/*****************************************************************************
- *
  *  Push the given argument list, right to left; returns the total amount of
  *  stuff pushed.
  */
index 75cc56d..402d800 100644 (file)
@@ -231,6 +231,8 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
     }
 
     regNumber regGSCheck;
+    regMaskTP regMaskGSCheck = RBM_NONE;
+
     if (!pushReg)
     {
         // Non-tail call: we can use any callee trash register that is not
@@ -251,8 +253,11 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
     else
     {
 #ifdef _TARGET_X86_
-        NYI_X86("Tail calls from methods that need GS check");
-        regGSCheck = REG_NA;
+        // It doesn't matter which register we pick, since we're going to save and restore it
+        // around the check.
+        // TODO-CQ: Can we optimize the choice of register to avoid doing the push/pop sometimes?
+        regGSCheck     = REG_EAX;
+        regMaskGSCheck = RBM_EAX;
 #else  // !_TARGET_X86_
         // Tail calls from methods that need GS check:  We need to preserve registers while
         // emitting GS cookie check for a tail prefixed call or a jmp. To emit GS cookie
@@ -287,8 +292,13 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
 #endif // !_TARGET_X86_
     }
 
+    regMaskTP   byrefPushedRegs = RBM_NONE;
+    regMaskTP   norefPushedRegs = RBM_NONE;
+    regMaskTP   pushedRegs      = RBM_NONE;
+
     if (compiler->gsGlobalSecurityCookieAddr == nullptr)
     {
+#if defined(_TARGET_AMD64_)
         // If GS cookie value fits within 32-bits we can use 'cmp mem64, imm32'.
         // Otherwise, load the value into a reg and use 'cmp mem64, reg64'.
         if ((int)compiler->gsGlobalSecurityCookieVal != (ssize_t)compiler->gsGlobalSecurityCookieVal)
@@ -297,7 +307,9 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
             getEmitter()->emitIns_S_R(INS_cmp, EA_PTRSIZE, regGSCheck, compiler->lvaGSSecurityCookie, 0);
         }
         else
+#endif // defined(_TARGET_AMD64_)
         {
+            assert((int)compiler->gsGlobalSecurityCookieVal == (ssize_t)compiler->gsGlobalSecurityCookieVal);
             getEmitter()->emitIns_S_I(INS_cmp, EA_PTRSIZE, compiler->lvaGSSecurityCookie, 0,
                                       (int)compiler->gsGlobalSecurityCookieVal);
         }
@@ -305,6 +317,9 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
     else
     {
         // Ngen case - GS cookie value needs to be accessed through an indirection.
+
+        pushedRegs = genPushRegs(regMaskGSCheck, &byrefPushedRegs, &norefPushedRegs);
+
         instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, regGSCheck, (ssize_t)compiler->gsGlobalSecurityCookieAddr);
         getEmitter()->emitIns_R_AR(ins_Load(TYP_I_IMPL), EA_PTRSIZE, regGSCheck, regGSCheck, 0);
         getEmitter()->emitIns_S_R(INS_cmp, EA_PTRSIZE, regGSCheck, compiler->lvaGSSecurityCookie, 0);
@@ -315,6 +330,8 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
     inst_JMP(jmpEqual, gsCheckBlk);
     genEmitHelperCall(CORINFO_HELP_FAIL_FAST, 0, EA_UNKNOWN);
     genDefineTempLabel(gsCheckBlk);
+
+    genPopRegs(pushedRegs, byrefPushedRegs, norefPushedRegs);
 }
 
 /*****************************************************************************
@@ -1299,8 +1316,8 @@ void CodeGen::genCodeForDivMod(GenTreeOp* treeNode)
 
 #ifdef _TARGET_X86_
     bool dividendIsLong = varTypeIsLong(dividend->TypeGet());
-    GenTree* dividendLo;
-    GenTree* dividendHi;
+    GenTree* dividendLo = nullptr;
+    GenTree* dividendHi = nullptr;
 
     if (dividendIsLong)
     {
@@ -6225,6 +6242,14 @@ void CodeGen::genCallInstruction(GenTreePtr node)
 
 #endif // defined(_TARGET_X86_)
 
+    if (call->IsTailCallViaHelper())
+    {
+        if (compiler->getNeedsGSSecurityCookie())
+        {
+            genEmitGSCookieCheck(true);
+        }
+    }
+
     if (target != nullptr)
     {
         if (target->isContainedIndir())
index 026d05a..4b5f367 100644 (file)
@@ -235,18 +235,6 @@ GenTree* DecomposeLongs::DecomposeNode(GenTree* tree)
             nextNode = DecomposeMul(use);
             break;
 
-        case GT_DIV:
-            NYI("Arithmetic binary operators on TYP_LONG - GT_DIV");
-            break;
-
-        case GT_MOD:
-            NYI("Arithmetic binary operators on TYP_LONG - GT_MOD");
-            break;
-
-        case GT_UDIV:
-            NYI("Arithmetic binary operators on TYP_LONG - GT_UDIV");
-            break;
-
         case GT_UMOD:
             nextNode = DecomposeUMod(use);
             break;
@@ -257,15 +245,6 @@ GenTree* DecomposeLongs::DecomposeNode(GenTree* tree)
             nextNode = DecomposeShift(use);
             break;
 
-        case GT_ROL:
-        case GT_ROR:
-            NYI("Arithmetic binary operators on TYP_LONG - ROTATE");
-            break;
-
-        case GT_MULHI:
-            NYI("Arithmetic binary operators on TYP_LONG - MULHI");
-            break;
-
         case GT_LOCKADD:
         case GT_XADD:
         case GT_XCHG:
index f20183b..f2627e0 100644 (file)
@@ -23,6 +23,89 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
 #include "gcinfotypes.h"
 
+ReturnKind GCTypeToReturnKind(CorInfoGCType gcType)
+{
+    switch (gcType)
+    {
+    case TYPE_GC_NONE:
+        return RT_Scalar;
+    case TYPE_GC_REF:
+        return RT_Object;
+    case TYPE_GC_BYREF:
+        return RT_ByRef;
+    default:
+        _ASSERTE(!"TYP_GC_OTHER is unexpected");
+        return RT_Illegal;
+    }
+}
+
+ReturnKind GCInfo::getReturnKind()
+{
+    switch (compiler->info.compRetType)
+    {
+    case TYP_REF:
+    case TYP_ARRAY:
+        return RT_Object;
+    case TYP_BYREF:
+        return RT_ByRef;
+    case TYP_STRUCT:
+    {
+        CORINFO_CLASS_HANDLE structType = compiler->info.compMethodInfo->args.retTypeClass;
+        var_types retType = compiler->getReturnTypeForStruct(structType);
+
+        switch (retType)
+        {
+        case TYP_ARRAY:
+            _ASSERTE(false && "TYP_ARRAY unexpected from getReturnTypeForStruct()");
+            // fall through
+        case TYP_REF:
+            return RT_Object;
+
+        case TYP_BYREF:
+            return RT_ByRef;
+
+        case TYP_STRUCT:
+            if (compiler->IsHfa(structType))
+            {
+#ifdef _TARGET_X86_
+                _ASSERTE(false && "HFAs not expected for X86");
+#endif // _TARGET_X86_
+
+                return RT_Scalar;
+            }
+            else
+            {
+                // Multi-reg return
+                BYTE gcPtrs[2] = { TYPE_GC_NONE, TYPE_GC_NONE };
+                compiler->info.compCompHnd->getClassGClayout(structType, gcPtrs);
+
+                ReturnKind first = GCTypeToReturnKind((CorInfoGCType)gcPtrs[0]);
+                ReturnKind second = GCTypeToReturnKind((CorInfoGCType)gcPtrs[1]);
+
+                return GetStructReturnKind(first, second);
+            }
+
+#ifdef _TARGET_X86_
+        case TYP_FLOAT:
+        case TYP_DOUBLE:
+            return RT_Float;
+#endif // _TARGET_X86_
+        default:
+            return RT_Scalar;
+        }
+    }
+
+#ifdef _TARGET_X86_
+    case TYP_FLOAT:
+    case TYP_DOUBLE:
+        return RT_Float;
+#endif // _TARGET_X86_
+
+    default:
+        return RT_Scalar;
+    }
+}
+
 #ifdef JIT32_GCENCODER
 
 #include "emit.h"
@@ -104,18 +187,21 @@ static void regenLog(unsigned encoding, InfoHdr* header, InfoHdr* state)
 
     fprintf(logFile, "InfoHdr( %2d, %2d, %1d, %1d, %1d,"
                      " %1d, %1d, %1d, %1d, %1d,"
-                     " %1d, %1d, %1d, %1d, %1d,"
-                     " %1d, %2d, %2d, %2d, %2d,"
-                     " %2d, %2d), \n",
+                     " %1d, %1d, %1d, %1d, %1d, %1d,"
+                     " %1d, %1d, %1d,"
+                     " %1d, %2d, %2d,"
+                     " %2d, %2d, %2d, %2d, %2d, %2d), \n",
             state->prologSize, state->epilogSize, state->epilogCount, state->epilogAtEnd, state->ediSaved,
             state->esiSaved, state->ebxSaved, state->ebpSaved, state->ebpFrame, state->interruptible,
             state->doubleAlign, state->security, state->handlers, state->localloc, state->editNcontinue, state->varargs,
-            state->profCallbacks, state->argCount, state->frameSize,
+            state->profCallbacks, state->genericsContext, state->genericsContextIsMethodDesc, 
+            state->returnKind, state->argCount, state->frameSize,
             (state->untrackedCnt <= SET_UNTRACKED_MAX) ? state->untrackedCnt : HAS_UNTRACKED,
             (state->varPtrTableSize == 0) ? 0 : HAS_VARPTR,
             (state->gsCookieOffset == INVALID_GS_COOKIE_OFFSET) ? 0 : HAS_GS_COOKIE_OFFSET,
             (state->syncStartOffset == INVALID_SYNC_OFFSET) ? 0 : HAS_SYNC_OFFSET,
-            (state->syncStartOffset == INVALID_SYNC_OFFSET) ? 0 : HAS_SYNC_OFFSET);
+            (state->syncStartOffset == INVALID_SYNC_OFFSET) ? 0 : HAS_SYNC_OFFSET,
+            (state->revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET) ? 0 : HAS_REV_PINVOKE_FRAME_OFFSET);
 
     fflush(logFile);
 
@@ -265,9 +351,11 @@ static int bigEncoding4(unsigned cur, unsigned tgt, unsigned max)
     return cnt;
 }
 
-BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state)
+BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state, BYTE &codeSet)
 {
     BYTE encoding = 0xff;
+    codeSet = 1; // codeSet is 1 or 2, depending on whether the returned encoding 
+                 // corresponds to InfoHdrAdjust, or InfoHdrAdjust2 enumerations.
 
     if (state->argCount != header.argCount)
     {
@@ -547,6 +635,16 @@ BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state)
         goto DO_RETURN;
     }
 
+    if (state->returnKind != header.returnKind)
+    {
+        _ASSERTE(GCInfoEncodesReturnKind());
+        state->returnKind = header.returnKind;
+        codeSet = 2; // Two byte encoding
+        encoding = header.returnKind;
+        _ASSERTE(encoding < SET_RET_KIND_MAX);
+        goto DO_RETURN;
+    }
+
     if (state->gsCookieOffset != header.gsCookieOffset)
     {
         assert(state->gsCookieOffset == INVALID_GS_COOKIE_OFFSET || state->gsCookieOffset == HAS_GS_COOKIE_OFFSET);
@@ -587,10 +685,31 @@ BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state)
         }
     }
 
+    if (state->revPInvokeOffset != header.revPInvokeOffset)
+    {
+        _ASSERTE(GCInfoEncodesRevPInvokeFrame());
+        assert(state->revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET || state->revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET);
+
+        if (state->revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET)
+        {
+            // header.revPInvokeOffset is non-zero. 
+            state->revPInvokeOffset = HAS_REV_PINVOKE_FRAME_OFFSET;
+            encoding = FLIP_REV_PINVOKE_FRAME;
+            goto DO_RETURN;
+        }
+        else if (header.revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET)
+        {
+            state->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET;
+            encoding = FLIP_REV_PINVOKE_FRAME;
+            goto DO_RETURN;
+        }
+    }
+
 DO_RETURN:
-    assert(encoding < 0x80);
+    _ASSERTE(encoding < MORE_BYTES_TO_FOLLOW);
     if (!state->isHeaderMatch(header))
-        encoding |= 0x80;
+        encoding |= MORE_BYTES_TO_FOLLOW;
+
     return encoding;
 }
 
@@ -806,6 +925,14 @@ static int measureDistance(const InfoHdr& header, const InfoHdrSmall* p, int clo
             return distance;
     }
 
+    if (p->returnKind != header.returnKind)
+    {
+        // Setting the ReturnKind requires two bytes of encoding.
+        distance += 2;
+        if (distance >= closeness)
+            return distance;
+    }
+
     if (header.gsCookieOffset != INVALID_GS_COOKIE_OFFSET)
     {
         distance += 1;
@@ -820,6 +947,13 @@ static int measureDistance(const InfoHdr& header, const InfoHdrSmall* p, int clo
             return distance;
     }
 
+    if (header.revPInvokeOffset != INVALID_REV_PINVOKE_OFFSET)
+    {
+        distance += 1;
+        if (distance >= closeness)
+            return distance;
+    }
+
     return distance;
 }
 
@@ -1165,6 +1299,12 @@ size_t GCInfo::gcInfoBlockHdrSave(
     header->genericsContextIsMethodDesc =
         header->genericsContext && (compiler->info.compMethodInfo->options & (CORINFO_GENERICS_CTXT_FROM_METHODDESC));
     header->gsCookieOffset = INVALID_GS_COOKIE_OFFSET;
+
+    ReturnKind returnKind = getReturnKind();
+    _ASSERTE(IsValidReturnKind(returnKind) && "Return Kind must be valid");
+    _ASSERTE(!IsStructReturnKind(returnKind) && "Struct Return Kinds Unexpected for JIT32");
+    header->returnKind = returnKind;
+
     if (compiler->getNeedsGSSecurityCookie())
     {
         assert(compiler->lvaGSSecurityCookie != BAD_VAR_NUM);
@@ -1189,6 +1329,7 @@ size_t GCInfo::gcInfoBlockHdrSave(
         // synchronized methods can't have more than 1 epilog
         assert(header->epilogCount <= 1);
     }
+    header->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET;
 
     assert((compiler->compArgSize & 0x3) == 0);
 
@@ -1224,12 +1365,22 @@ size_t GCInfo::gcInfoBlockHdrSave(
         *dest++ = headerEncoding;
 
         BYTE encoding = headerEncoding;
-        while (encoding & 0x80)
+        BYTE codeSet = 1;
+        while (encoding & MORE_BYTES_TO_FOLLOW)
         {
-            encoding = encodeHeaderNext(*header, &state);
+            encoding = encodeHeaderNext(*header, &state, codeSet);
+
 #if REGEN_SHORTCUTS
             regenLog(headerEncoding, header, &state);
 #endif
+            _ASSERTE(codeSet == 1 || codeSet == 2 && 
+                     "Encoding must correspond to InfoHdrAdjust or InfoHdrAdjust2");
+            if (codeSet == 2)
+            {
+                *dest++ = NEXT_OPCODE | MORE_BYTES_TO_FOLLOW;
+                ++size;
+            }
+
             *dest++ = encoding;
             ++size;
         }
@@ -3277,7 +3428,7 @@ void GCInfo::gcFindPtrsInFrame(const void* infoBlock, const void* codeBlock, uns
     GCDump gcDump(GCINFO_VERSION);
     gcDump.gcPrintf = gcDump_logf; // use my printf (which logs to VM)
 
-    gcDump.DumpPtrsInFrame((const BYTE*)infoBlock, (const BYTE*)codeBlock, offs, verifyGCTables);
+    gcDump.DumpPtrsInFrame((PTR_CBYTE)infoBlock, (const BYTE*)codeBlock, offs, verifyGCTables);
 }
 
 #endif // DUMP_GC_TABLES
@@ -3504,23 +3655,6 @@ public:
 
 #endif // DEBUG
 
-ReturnKind GCTypeToReturnKind(CorInfoGCType gcType)
-{
-
-    switch (gcType)
-    {
-        case TYPE_GC_NONE:
-            return RT_Scalar;
-        case TYPE_GC_REF:
-            return RT_Object;
-        case TYPE_GC_BYREF:
-            return RT_ByRef;
-        default:
-            _ASSERTE(!"TYP_GC_OTHER is unexpected");
-            return RT_Illegal;
-    }
-}
-
 void GCInfo::gcInfoBlockHdrSave(GcInfoEncoder* gcInfoEncoder, unsigned methodSize, unsigned prologSize)
 {
 #ifdef DEBUG
@@ -3536,65 +3670,7 @@ void GCInfo::gcInfoBlockHdrSave(GcInfoEncoder* gcInfoEncoder, unsigned methodSiz
 
     gcInfoEncoderWithLog->SetCodeLength(methodSize);
 
-    ReturnKind returnKind = RT_Illegal;
-
-    switch (compiler->info.compRetType)
-    {
-        case TYP_REF:
-        case TYP_ARRAY:
-            returnKind = RT_Object;
-            break;
-        case TYP_BYREF:
-            returnKind = RT_ByRef;
-            break;
-        case TYP_STRUCT:
-        {
-            CORINFO_CLASS_HANDLE structType = compiler->info.compMethodInfo->args.retTypeClass;
-            var_types retType = compiler->getReturnTypeForStruct(structType);
-
-            switch (retType)
-            {
-            case TYP_ARRAY:
-                _ASSERTE(false && "TYP_ARRAY unexpected from getReturnTypeForStruct()");
-
-            case TYP_REF:
-                returnKind = RT_Object;
-                break;
-
-            case TYP_BYREF:
-                returnKind = RT_ByRef;
-                break;
-
-            case TYP_STRUCT:
-                if (compiler->IsHfa(structType))
-                {
-                    returnKind = RT_Scalar;
-                }
-                else
-                {
-                    // Multi-reg return
-                    BYTE gcPtrs[2] = { TYPE_GC_NONE, TYPE_GC_NONE };
-                    compiler->info.compCompHnd->getClassGClayout(structType, gcPtrs);
-
-                    ReturnKind first = GCTypeToReturnKind((CorInfoGCType)gcPtrs[0]);
-                    ReturnKind second = GCTypeToReturnKind((CorInfoGCType)gcPtrs[1]);
-
-                    returnKind = GetStructReturnKind(first, second);
-                }
-                break;
-
-            default:
-                returnKind = RT_Scalar;
-                break;
-            }
-            break;
-        }
-        default:
-            returnKind = RT_Scalar;
-    }
-
-    _ASSERTE(returnKind != RT_Illegal);
-    gcInfoEncoderWithLog->SetReturnKind(returnKind);
+    gcInfoEncoderWithLog->SetReturnKind(getReturnKind());
 
     if (compiler->isFramePointerUsed())
     {
index fdf070b..dbc67c9 100644 (file)
@@ -12503,6 +12503,10 @@ void Compiler::impImportBlockCode(BasicBlock* block)
 
                 if (compIsForInlining())
                 {
+                    if (compDonotInline())
+                    {
+                        return;
+                    }
                     // We rule out inlinees with explicit tail calls in fgMakeBasicBlocks.
                     assert((prefixFlags & PREFIX_TAILCALL_EXPLICIT) == 0);
                 }
index b93ac33..3f8d8af 100644 (file)
@@ -380,6 +380,9 @@ private:
 public:
     void gcUpdateForRegVarMove(regMaskTP srcMask, regMaskTP dstMask, LclVarDsc* varDsc);
 #endif // !LEGACY_BACKEND
+
+private:
+    ReturnKind getReturnKind();
 };
 
 inline unsigned char encodeUnsigned(BYTE* dest, unsigned value)
index 6a90c45..e059407 100644 (file)
@@ -1728,7 +1728,10 @@ GenTree* Lowering::LowerTailCallViaHelper(GenTreeCall* call, GenTree* callTarget
     assert(!comp->opts.compNeedSecurityCheck);               // tail call from methods that need security check
     assert(!call->IsUnmanaged());                            // tail calls to unamanaged methods
     assert(!comp->compLocallocUsed);                         // tail call from methods that also do localloc
+
+#ifdef _TARGET_AMD64_
     assert(!comp->getNeedsGSSecurityCookie());               // jit64 compat: tail calls from methods that need GS check
+#endif // _TARGET_AMD64_
 
     // We expect to see a call that meets the following conditions
     assert(call->IsTailCallViaHelper());
index 1b9e40e..d80691a 100644 (file)
@@ -523,12 +523,12 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
         break;
 
         case GT_BLK:
-        case GT_OBJ:
         case GT_DYN_BLK:
             // These should all be eliminated prior to Lowering.
             assert(!"Non-store block node in Lowering");
             info->srcCount = 0;
             info->dstCount = 0;
+            break;
 
         case GT_STORE_BLK:
         case GT_STORE_OBJ:
index 72bed5f..6f01718 100644 (file)
@@ -6968,10 +6968,7 @@ void LinearScan::allocateRegisters()
             }
             else
             {
-                // This must be a localVar or a single-reg fixed use or a tree temp with conflicting def & use.
-
-                assert(currentInterval && (currentInterval->isLocalVar || currentRefPosition->isFixedRegRef ||
-                                           currentInterval->hasConflictingDefUse));
+                assert(currentInterval != nullptr);
 
                 // It's already in a register, but not one we need.
                 // If it is a fixed use that is not marked "delayRegFree", there is already a FixedReg to ensure that
index 3c0a4fd..4a93f90 100644 (file)
@@ -14248,10 +14248,10 @@ GenTreePtr Compiler::fgRecognizeAndMorphBitwiseRotation(GenTreePtr tree)
 #ifndef _TARGET_64BIT_
                             if (!shiftIndexWithoutAdd->IsCnsIntOrI() && (rotatedValueBitSize == 64))
                             {
-                                // TODO: we need to handle variable-sized long shifts specially on x86.
+                                // TODO-X86-CQ: we need to handle variable-sized long shifts specially on x86.
                                 // GT_LSH, GT_RSH, and GT_RSZ have helpers for this case. We may need
                                 // to add helpers for GT_ROL and GT_ROR.
-                                NYI("Rotation of a long value by variable amount");
+                                return tree;
                             }
 #endif
 
index 7af08b7..4a5991e 100644 (file)
       <Member Name="Resize&lt;T&gt;(T[]@,System.Int32)" />
       <Member Name="Reverse(System.Array)" />
       <Member Name="Reverse(System.Array,System.Int32,System.Int32)" />
+      <Member Name="Reverse&lt;T&gt;(T[])" />
+      <Member Name="Reverse&lt;T&gt;(T[],System.Int32,System.Int32)" />
       <Member Name="SetValue(System.Object,System.Int32)" />
       <Member Name="SetValue(System.Object,System.Int32,System.Int32)" />
       <Member Name="SetValue(System.Object,System.Int32,System.Int32,System.Int32)" />
       <Member Name="Remove(System.Int32,System.Int32)" />
       <Member Name="Replace(System.Char,System.Char)" />
       <Member Name="Replace(System.String,System.String)" />
-      <Member Name="Split(System.Char)" />
       <Member Name="Split(System.Char,System.Int32,System.StringSplitOptions)" />
       <Member Name="Split(System.Char,System.StringSplitOptions)"/>
       <Member Name="Split(System.Char[])" />
       <Member Name="Split(System.Char[],System.Int32)" />
       <Member Name="Split(System.Char[],System.Int32,System.StringSplitOptions)" />
       <Member Name="Split(System.Char[],System.StringSplitOptions)"/>
-      <Member Name="Split(System.String)" />
       <Member Name="Split(System.String,System.Int32,System.StringSplitOptions)" />
       <Member Name="Split(System.String,System.StringSplitOptions)"/>
       <Member Name="Split(System.String[],System.Int32,System.StringSplitOptions)" />
index 0879049..d81f99c 100644 (file)
@@ -1614,7 +1614,41 @@ namespace System {
         [MethodImplAttribute(MethodImplOptions.InternalCall)]
         [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
         private static extern bool TrySZReverse(Array array, int index, int count);
-        
+
+        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
+        public static void Reverse<T>(T[] array)
+        {
+            if (array == null)
+                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
+            Contract.EndContractBlock();
+            Reverse(array, 0, array.Length);
+        }
+
+        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
+        public static void Reverse<T>(T[] array, int index, int length)
+        {
+            if (array == null)
+                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
+            if (index < 0)
+                ThrowHelper.ThrowIndexArgumentOutOfRange_NeedNonNegNumException();
+            if (length < 0)
+                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
+            if (array.Length - index < length)
+                ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
+            Contract.EndContractBlock();
+
+            int i = index;
+            int j = index + length - 1;
+            while (i < j)
+            {
+                T temp = array[i];
+                array[i] = array[j];
+                array[j] = temp;
+                i++;
+                j--;
+            }
+        }
+
         // Sorts the elements of an array. The sort compares the elements to each
         // other using the IComparable interface, which must be implemented
         // by all elements of the array.
index ae3356d..2629394 100644 (file)
@@ -719,9 +719,7 @@ namespace System.Collections.Generic {
                         Array.Copy(_items, index+count, _items, index*2, _size-index);
                     }
                     else {
-                        T[] itemsToInsert = new T[count];
-                        c.CopyTo(itemsToInsert, 0);
-                        itemsToInsert.CopyTo(_items, index);                    
+                        c.CopyTo(_items, index);
                     }
                     _size += count;
                 }                
@@ -930,22 +928,7 @@ namespace System.Collections.Generic {
                 ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
             Contract.EndContractBlock();
 
-            // The non-generic Array.Reverse is not used because it does not perform
-            // well for non-primitive value types.
-            // If/when a generic Array.Reverse<T> becomes available, the below code
-            // can be deleted and replaced with a call to Array.Reverse<T>.
-            int i = index;
-            int j = index + count - 1;
-            T[] array = _items;
-            while (i < j)
-            {
-                T temp = array[i];
-                array[i] = array[j];
-                array[j] = temp;
-                i++;
-                j--;
-            }
-
+            Array.Reverse(_items, index, count);
             _version++;
         }
         
index a1f2936..7b7b0d3 100644 (file)
@@ -176,9 +176,10 @@ namespace System.IO {
             Contract.Requires(destination.CanWrite);
 
             byte[] buffer = new byte[bufferSize];
-            int bytesRead;
-            while ((bytesRead = await ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0)
+            while (true)
             {
+                int bytesRead = await ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
+                if (bytesRead == 0) break;
                 await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
             }
         }
index adede6a..b8ff967 100644 (file)
@@ -52,7 +52,7 @@ namespace System {
       }
     
       public Random(int Seed) {
-        int ii;
+        int ii = 0;
         int mj, mk;
     
         //Initialize our Seed array.
@@ -61,7 +61,7 @@ namespace System {
         SeedArray[55]=mj;
         mk=1;
         for (int i=1; i<55; i++) {  //Apparently the range [1..55] is special (Knuth) and so we're wasting the 0'th position.
-          ii = (21*i)%55;
+          if ((ii += 21) >= 55) ii -= 55;
           SeedArray[ii]=mk;
           mk = mj - mk;
           if (mk<0) mk+=MBIG;
@@ -69,8 +69,10 @@ namespace System {
         }
         for (int k=1; k<5; k++) {
           for (int i=1; i<56; i++) {
-        SeedArray[i] -= SeedArray[1+(i+30)%55];
-        if (SeedArray[i]<0) SeedArray[i]+=MBIG;
+            int n = i + 30; 
+            if (n >= 55) n -= 55; 
+            SeedArray[i] -= SeedArray[1 + n];        
+            if (SeedArray[i]<0) SeedArray[i]+=MBIG;
           }
         }
         inext=0;
index e9568a6..8f456b6 100644 (file)
@@ -944,19 +944,13 @@ namespace System
         }
 
         [ComVisible(false)]
-        public String[] Split(char separator) {
-            Contract.Ensures(Contract.Result<String[]>() != null);
-            return SplitInternal(separator, Int32.MaxValue, StringSplitOptions.None);
-        }
-
-        [ComVisible(false)]
-        public String[] Split(char separator, StringSplitOptions options) {
+        public String[] Split(char separator, StringSplitOptions options = StringSplitOptions.None) {
             Contract.Ensures(Contract.Result<String[]>() != null);
             return SplitInternal(separator, Int32.MaxValue, options);
         }
 
         [ComVisible(false)]
-        public String[] Split(char separator, int count, StringSplitOptions options) {
+        public String[] Split(char separator, int count, StringSplitOptions options = StringSplitOptions.None) {
             Contract.Ensures(Contract.Result<String[]>() != null);
             return SplitInternal(separator, count, options);
         }
@@ -1075,19 +1069,13 @@ namespace System
         }
 
         [ComVisible(false)]
-        public String[] Split(String separator) {
-            Contract.Ensures(Contract.Result<String[]>() != null);
-            return SplitInternal(separator ?? String.Empty, null, Int32.MaxValue, StringSplitOptions.None);
-        }
-
-        [ComVisible(false)]
-        public String[] Split(String separator, StringSplitOptions options) {
+        public String[] Split(String separator, StringSplitOptions options = StringSplitOptions.None) {
             Contract.Ensures(Contract.Result<String[]>() != null);
             return SplitInternal(separator ?? String.Empty, null, Int32.MaxValue, options);
         }
 
         [ComVisible(false)]
-        public String[] Split(String separator, Int32 count, StringSplitOptions options) {
+        public String[] Split(String separator, Int32 count, StringSplitOptions options = StringSplitOptions.None) {
             Contract.Ensures(Contract.Result<String[]>() != null);
             return SplitInternal(separator ?? String.Empty, null, count, options);
         }
index 9152f71..addd519 100644 (file)
@@ -16,6 +16,8 @@
 // To include declaration of "SignatureNative"
 #include "runtimehandles.h"
 
+#include "invokeutil.h"
+#include "argdestination.h"
 
 #if defined(FEATURE_MULTICOREJIT) && defined(_DEBUG)
 
@@ -536,7 +538,7 @@ void MethodDescCallSite::CallTargetWorker(const ARG_SLOT *pArguments, ARG_SLOT *
         }
 #endif
 
-        int    ofs;
+        int ofs;
         for (; TransitionBlock::InvalidOffset != (ofs = m_argIt.GetNextOffset()); arg++)
         {
 #ifdef CALLDESCR_REGTYPEMAP
@@ -567,46 +569,56 @@ void MethodDescCallSite::CallTargetWorker(const ARG_SLOT *pArguments, ARG_SLOT *
             }
 #endif // CHECK_APP_DOMAIN_LEAKS
 
-#if defined(UNIX_AMD64_ABI) && defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
-            _ASSERTE(ofs != TransitionBlock::StructInRegsOffset);
-#endif
-            PVOID pDest = pTransitionBlock + ofs;
+            ArgDestination argDest(pTransitionBlock, ofs, m_argIt.GetArgLocDescForStructInRegs());
 
             UINT32 stackSize = m_argIt.GetArgSize();
-            switch (stackSize)
+            // We need to pass in a pointer, but be careful of the ARG_SLOT calling convention. We might already have a pointer in the ARG_SLOT.
+            PVOID pSrc = stackSize > sizeof(ARG_SLOT) ? (LPVOID)ArgSlotToPtr(pArguments[arg]) : (LPVOID)ArgSlotEndianessFixup((ARG_SLOT*)&pArguments[arg], stackSize);
+
+#if defined(UNIX_AMD64_ABI) && defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+            if (argDest.IsStructPassedInRegs())
+            {
+                TypeHandle th;
+                m_argIt.GetArgType(&th);
+
+                argDest.CopyStructToRegisters(pSrc, th.AsMethodTable()->GetNumInstanceFieldBytes(), 0);
+            }
+            else
+#endif // UNIX_AMD64_ABI && FEATURE_UNIX_AMD64_STRUCT_PASSING
             {
-                case 1:
-                case 2:
-                case 4:
-                    *((INT32*)pDest) = (INT32)pArguments[arg];
-                    break;
-
-                case 8:
-                    *((INT64*)pDest) = pArguments[arg];
-                    break;
-
-                default:
-                    // The ARG_SLOT contains a pointer to the value-type
-#ifdef ENREGISTERED_PARAMTYPE_MAXSIZE
-                    if (m_argIt.IsArgPassedByRef())
-                    {
-                        // We need to pass in a pointer, but be careful of the ARG_SLOT calling convention.
-                        // We might already have a pointer in the ARG_SLOT
-                       *(PVOID*)pDest = stackSize>sizeof(ARG_SLOT) ?
-                                (LPVOID)ArgSlotToPtr(pArguments[arg]) :
-                                (LPVOID)ArgSlotEndianessFixup((ARG_SLOT*)&pArguments[arg], stackSize);
-                    }
-                    else
-#endif // ENREGISTERED_PARAMTYPE_MAXSIZE
-                    if (stackSize>sizeof(ARG_SLOT))
-                    {
-                        CopyMemory(pDest, ArgSlotToPtr(pArguments[arg]), stackSize);
-                    }
-                    else
-                    {
-                        CopyMemory(pDest, (LPVOID) (&pArguments[arg]), stackSize);
-                    }
-                    break;
+                PVOID pDest = argDest.GetDestinationAddress();
+
+                switch (stackSize)
+                {
+                    case 1:
+                    case 2:
+                    case 4:
+                        *((INT32*)pDest) = (INT32)pArguments[arg];
+                        break;
+
+                    case 8:
+                        *((INT64*)pDest) = pArguments[arg];
+                        break;
+
+                    default:
+                        // The ARG_SLOT contains a pointer to the value-type
+    #ifdef ENREGISTERED_PARAMTYPE_MAXSIZE
+                        if (m_argIt.IsArgPassedByRef())
+                        {
+                            *(PVOID*)pDest = pSrc;
+                        }
+                        else
+    #endif // ENREGISTERED_PARAMTYPE_MAXSIZE
+                        if (stackSize > sizeof(ARG_SLOT))
+                        {
+                            CopyMemory(pDest, ArgSlotToPtr(pArguments[arg]), stackSize);
+                        }
+                        else
+                        {
+                            CopyMemory(pDest, (LPVOID) (&pArguments[arg]), stackSize);
+                        }
+                        break;
+                }
             }
         }
 
index f143dd6..3b383cf 100644 (file)
@@ -1801,7 +1801,7 @@ public:
     ULONG       GetFixedStackSize()
     {
         WRAPPER_NO_CONTRACT;
-        return GetCodeManager()->GetFrameSize(GetGCInfo());
+        return GetCodeManager()->GetFrameSize(GetGCInfoToken());
     }
 #endif // WIN64EXCEPTIONS
 
index df76945..9db0ce5 100644 (file)
@@ -1198,12 +1198,12 @@ void DumpGCInfo(MethodDesc* method)
     _ASSERTE(codeInfo.GetRelOffset() == 0);
 
     ICodeManager* codeMan = codeInfo.GetCodeManager();
-    GCInfoToken table = codeInfo.GetGCInfoToken();
+    GCInfoToken gcInfoToken = codeInfo.GetGCInfoToken();
 
-    unsigned methodSize = (unsigned)codeMan->GetFunctionSize(table);
+    unsigned methodSize = (unsigned)codeMan->GetFunctionSize(gcInfoToken);
 
-    GCDump gcDump(table.Version);
-    PTR_CBYTE gcInfo = PTR_CBYTE(table.Info);
+    GCDump gcDump(gcInfoToken.Version);
+    PTR_CBYTE gcInfo = PTR_CBYTE(gcInfoToken.Info);
 
     gcDump.gcPrintf = printfToDbgOut;
 
index 93decc9..ff63d84 100644 (file)
@@ -501,9 +501,9 @@ BOOL EEDbgInterfaceImpl::IsInPrologOrEpilog(const BYTE *address,
 
     if (codeInfo.IsValid())
     {
-        LPVOID methodInfo = codeInfo.GetGCInfo();
+        GCInfoToken gcInfoToken = codeInfo.GetGCInfoToken();
 
-        if (codeInfo.GetCodeManager()->IsInPrologOrEpilog(codeInfo.GetRelOffset(), methodInfo, prologSize))
+        if (codeInfo.GetCodeManager()->IsInPrologOrEpilog(codeInfo.GetRelOffset(), gcInfoToken, prologSize))
         {
             return TRUE;
         }
index 032bda7..2ce7b59 100644 (file)
@@ -142,13 +142,15 @@ __forceinline int decodeSigned(PTR_CBYTE& src)
 
 /*****************************************************************************
  *
- *  Decodes the methodInfoPtr and returns the decoded information
- *  in the hdrInfo struct.  The EIP parameter is the PC location
- *  within the active method.
+ *  Decodes the X86 GcInfo header and returns the decoded information
+ *  in the hdrInfo struct. 
+ *  curOffset is the code offset within the active method used in the 
+ *  computation of PrologOffs/EpilogOffs.
+ *  Returns the size of the header (number of bytes decoded).
  */
-static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
-                                   unsigned    curOffset,
-                                   hdrInfo   * infoPtr)
+static size_t   DecodeGCHdrInfo(GCInfoToken gcInfoToken,
+                                unsigned    curOffset,
+                                hdrInfo   * infoPtr)
 {
     CONTRACTL {
         NOTHROW;
@@ -157,7 +159,7 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
         SUPPORTS_DAC;
     } CONTRACTL_END;
 
-    PTR_CBYTE table = PTR_CBYTE(methodInfoPtr);
+    PTR_CBYTE table = (PTR_CBYTE) gcInfoToken.Info;
 #if VERIFY_GC_TABLES
     _ASSERTE(*castto(table, unsigned short *)++ == 0xFEEF);
 #endif
@@ -170,7 +172,7 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
     /* Decode the InfoHdr */
 
     InfoHdr header;
-    table = decodeHeader(table, &header);
+    table = decodeHeader(table, gcInfoToken.Version, &header);
 
     BOOL hasArgTabOffset = FALSE;
     if (header.untrackedCnt == HAS_UNTRACKED)
@@ -199,6 +201,10 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
         _ASSERTE(header.syncStartOffset < header.syncEndOffset);
     }
 
+    if (header.revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET)
+    {
+        header.revPInvokeOffset = fastDecodeUnsigned(table);
+    }
 
     /* Some sanity checks on header */
 
@@ -220,6 +226,7 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
     infoPtr->argSize         = header.argCount * 4;
     infoPtr->ebpFrame        = header.ebpFrame;
     infoPtr->interruptible   = header.interruptible;
+    infoPtr->returnKind      = (ReturnKind) header.returnKind;
 
     infoPtr->prologSize      = header.prologSize;
     infoPtr->epilogSize      = header.epilogSize;
@@ -232,6 +239,7 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
 
     infoPtr->syncStartOffset = header.syncStartOffset;
     infoPtr->syncEndOffset   = header.syncEndOffset;
+    infoPtr->revPInvokeOffset = header.revPInvokeOffset;
 
     infoPtr->doubleAlign     = header.doubleAlign;
     infoPtr->securityCheck   = header.security;
@@ -352,7 +360,7 @@ static size_t   crackMethodInfoHdr(PTR_VOID    methodInfoPtr,
              (infoPtr->gsCookieOffset < infoPtr->stackSize) &&
              ((header.gsCookieOffset % sizeof(void*)) == 0));
     
-    return  table - PTR_CBYTE(methodInfoPtr);
+    return  table - PTR_CBYTE(gcInfoToken.Info);
 }
 
 /*****************************************************************************/
@@ -715,7 +723,7 @@ void EECodeManager::FixContext( ContextType     ctxType,
 
     /* Extract the necessary information from the info block header */
 
-    stateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(pCodeInfo->GetGCInfo(),
+    stateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(pCodeInfo->GetGCInfoToken(),
                                        dwRelOffset,
                                        &stateBuf->hdrInfoBody);
     pState->dwIsSet = 1;
@@ -836,11 +844,11 @@ HRESULT EECodeManager::FixContextForEnC(PCONTEXT         pCtx,
 
     hdrInfo  oldInfo, newInfo;
 
-    crackMethodInfoHdr(pOldCodeInfo->GetGCInfo(),
+    DecodeGCHdrInfo(pOldCodeInfo->GetGCInfoToken(),
                        pOldCodeInfo->GetRelOffset(),
                        &oldInfo);
 
-    crackMethodInfoHdr(pNewCodeInfo->GetGCInfo(),
+    DecodeGCHdrInfo(pNewCodeInfo->GetGCInfoToken(),
                        pNewCodeInfo->GetRelOffset(),
                        &newInfo);
 
@@ -1545,7 +1553,7 @@ bool EECodeManager::IsGcSafe( EECodeInfo     *pCodeInfo,
 
     /* Extract the necessary information from the info block header */
 
-    table = (BYTE *)crackMethodInfoHdr(pCodeInfo->GetGCInfo(),
+    table = (BYTE *)DecodeGCHdrInfo(pCodeInfo->GetGCInfoToken(),
                                        dwRelOffset,
                                        &info);
 
@@ -3905,8 +3913,9 @@ bool EECodeManager::UnwindStackFrame(PREGDISPLAY     pContext,
 
     PTR_CBYTE methodStart = PTR_CBYTE(pCodeInfo->GetSavedMethodCode());
 
-    PTR_VOID       methodInfoPtr = pCodeInfo->GetGCInfo();
-    DWORD          curOffs = pCodeInfo->GetRelOffset();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
+    PTR_VOID    methodInfoPtr = gcInfoToken.Info;
+    DWORD       curOffs = pCodeInfo->GetRelOffset();
 
     _ASSERTE(sizeof(CodeManStateBuf) <= sizeof(pState->stateBuf));
     CodeManStateBuf * stateBuf = (CodeManStateBuf*)pState->stateBuf;
@@ -3915,7 +3924,7 @@ bool EECodeManager::UnwindStackFrame(PREGDISPLAY     pContext,
     {
         /* Extract the necessary information from the info block header */
 
-        stateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(methodInfoPtr,
+        stateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken,
                                                           curOffs,
                                                           &stateBuf->hdrInfoBody);
     }
@@ -4097,7 +4106,7 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
         GC_NOTRIGGER;
     } CONTRACTL_END;
 
-    PTR_VOID  methodInfoPtr = pCodeInfo->GetGCInfo();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
     unsigned  curOffs = pCodeInfo->GetRelOffset();
 
     unsigned  EBP     = *pContext->pEbp;
@@ -4108,7 +4117,7 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
     unsigned  count;
 
     hdrInfo   info;
-    PTR_CBYTE table = PTR_CBYTE(methodInfoPtr);
+    PTR_CBYTE table = PTR_CBYTE(gcInfoToken.Info);
 #if 0
     printf("EECodeManager::EnumGcRefs - EIP = %08x ESP = %08x  offset = %x  GC Info is at %08x\n", *pContext->pPC, ESP, curOffs, table);
 #endif
@@ -4116,14 +4125,14 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
 
     /* Extract the necessary information from the info block header */
 
-    table += crackMethodInfoHdr(methodInfoPtr,
-                                curOffs,
-                                &info);
+    table += DecodeGCHdrInfo(gcInfoToken,
+                             curOffs,
+                             &info);
 
     _ASSERTE( curOffs <= info.methodSize);
 
 #ifdef  _DEBUG
-//    if ((methodInfoPtr == (void*)0x37760d0) && (curOffs == 0x264))
+//    if ((gcInfoToken.Info == (void*)0x37760d0) && (curOffs == 0x264))
 //        __asm int 3;
 
     if (trEnumGCRefs) {
@@ -4220,11 +4229,11 @@ bool EECodeManager::EnumGcRefs( PREGDISPLAY     pContext,
 
             /* Extract the necessary information from the info block header */
 
-            table = PTR_CBYTE(methodInfoPtr);
+            table = PTR_CBYTE(gcInfoToken.Info);
 
-            table += crackMethodInfoHdr(methodInfoPtr,
-                                        curOffs,
-                                        &info);
+            table += DecodeGCHdrInfo(gcInfoToken,
+                                     curOffs,
+                                     &info);
         }
     }
 
@@ -5030,9 +5039,9 @@ OBJECTREF* EECodeManager::GetAddrOfSecurityObject(CrawlFrame *pCF)
     CodeManStateBuf * stateBuf = (CodeManStateBuf*)pState->stateBuf;
 
     /* Extract the necessary information from the info block header */
-    stateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(gcInfoToken.Info, // <TODO>truncation</TODO>
-                                                      relOffset,
-                                                      &stateBuf->hdrInfoBody);
+    stateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken, // <TODO>truncation</TODO>
+                                                   relOffset,
+                                                   &stateBuf->hdrInfoBody);
 
     pState->dwIsSet = 1;
     if  (stateBuf->hdrInfoBody.securityCheck)
@@ -5109,10 +5118,10 @@ OBJECTREF EECodeManager::GetInstance( PREGDISPLAY    pContext,
     } CONTRACTL_END;
 
 #ifdef _TARGET_X86_
-    PTR_VOID       methodInfoPtr = pCodeInfo->GetGCInfo();
-    unsigned       relOffset = pCodeInfo->GetRelOffset();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
+    unsigned    relOffset = pCodeInfo->GetRelOffset();
 
-    PTR_CBYTE    table = PTR_CBYTE(methodInfoPtr);
+    PTR_CBYTE   table = PTR_CBYTE(gcInfoToken.Info);
     hdrInfo     info;
     unsigned    stackDepth;
     TADDR       taArgBase;
@@ -5120,9 +5129,9 @@ OBJECTREF EECodeManager::GetInstance( PREGDISPLAY    pContext,
 
     /* Extract the necessary information from the info block header */
 
-    table += crackMethodInfoHdr(methodInfoPtr,
-                                relOffset,
-                                &info);
+    table += DecodeGCHdrInfo(gcInfoToken,
+                             relOffset,
+                             &info);
 
     // We do not have accurate information in the prolog or the epilog
     if (info.prologOffs != hdrInfo::NOT_IN_PROLOG ||
@@ -5236,14 +5245,15 @@ GenericParamContextType EECodeManager::GetParamContextType(PREGDISPLAY     pCont
 
 #ifdef _TARGET_X86_
     /* Extract the necessary information from the info block header */
-    PTR_VOID       methodInfoPtr = pCodeInfo->GetGCInfo();
-    unsigned       relOffset = pCodeInfo->GetRelOffset();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
+    PTR_VOID    methodInfoPtr = pCodeInfo->GetGCInfo();
+    unsigned    relOffset = pCodeInfo->GetRelOffset();
 
     hdrInfo     info;
-    PTR_CBYTE    table = PTR_CBYTE(methodInfoPtr);
-    table += crackMethodInfoHdr(methodInfoPtr,
-                                relOffset,
-                                &info);
+    PTR_CBYTE   table = PTR_CBYTE(gcInfoToken.Info);
+    table += DecodeGCHdrInfo(gcInfoToken,
+                             relOffset,
+                             &info);
 
     if (!info.genericsContext || 
         info.prologOffs != hdrInfo::NOT_IN_PROLOG || 
@@ -5300,15 +5310,16 @@ PTR_VOID EECodeManager::GetParamTypeArg(PREGDISPLAY     pContext,
     LIMITED_METHOD_DAC_CONTRACT;
 
 #ifdef _TARGET_X86_
-    PTR_VOID       methodInfoPtr = pCodeInfo->GetGCInfo();
-    unsigned       relOffset = pCodeInfo->GetRelOffset();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
+    PTR_VOID    methodInfoPtr = pCodeInfo->GetGCInfo();
+    unsigned    relOffset = pCodeInfo->GetRelOffset();
 
     /* Extract the necessary information from the info block header */
     hdrInfo     info;
-    PTR_CBYTE    table = PTR_CBYTE(methodInfoPtr);
-    table += crackMethodInfoHdr(methodInfoPtr,
-                                relOffset,
-                                &info);
+    PTR_CBYTE   table = PTR_CBYTE(gcInfoToken.Info);
+    table += DecodeGCHdrInfo(gcInfoToken,
+                             relOffset,
+                             &info);
 
     if (!info.genericsContext || 
         info.prologOffs != hdrInfo::NOT_IN_PROLOG || 
@@ -5424,9 +5435,9 @@ void * EECodeManager::GetGSCookieAddr(PREGDISPLAY     pContext,
     
     /* Extract the necessary information from the info block header */
     hdrInfo * info = &stateBuf->hdrInfoBody;
-    stateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(gcInfoToken.Info, // <TODO>truncation</TODO>
-                                                      relOffset,
-                                                      info);
+    stateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken, // <TODO>truncation</TODO>
+                                                   relOffset,
+                                                   info);
 
     pState->dwIsSet = 1;
     
@@ -5482,9 +5493,9 @@ void * EECodeManager::GetGSCookieAddr(PREGDISPLAY     pContext,
  *
  *  Returns true if the given IP is in the given method's prolog or epilog.
  */
-bool EECodeManager::IsInPrologOrEpilog(DWORD        relPCoffset,
-                                       PTR_VOID     methodInfoPtr,
-                                       size_t*      prologSize)
+bool EECodeManager::IsInPrologOrEpilog(DWORD       relPCoffset,
+                                       GCInfoToken gcInfoToken,
+                                       size_t*     prologSize)
 {
     CONTRACTL {
         NOTHROW;
@@ -5494,7 +5505,7 @@ bool EECodeManager::IsInPrologOrEpilog(DWORD        relPCoffset,
 #ifndef USE_GC_INFO_DECODER
     hdrInfo info;
 
-    crackMethodInfoHdr(methodInfoPtr, relPCoffset, &info);
+    DecodeGCHdrInfo(gcInfoToken, relPCoffset, &info);
 
     if (prologSize)
         *prologSize = info.prologSize;
@@ -5511,10 +5522,9 @@ bool EECodeManager::IsInPrologOrEpilog(DWORD        relPCoffset,
  *
  *  Returns true if the given IP is in the synchronized region of the method (valid for synchronized functions only)
 */
-bool  EECodeManager::IsInSynchronizedRegion(
-                DWORD           relOffset,
-                PTR_VOID        methodInfoPtr,
-                unsigned        flags)
+bool  EECodeManager::IsInSynchronizedRegion(DWORD       relOffset,
+                                            GCInfoToken gcInfoToken,
+                                            unsigned    flags)
 {
     CONTRACTL {
         NOTHROW;
@@ -5524,7 +5534,7 @@ bool  EECodeManager::IsInSynchronizedRegion(
 #ifndef USE_GC_INFO_DECODER
     hdrInfo info;
 
-    crackMethodInfoHdr(methodInfoPtr, relOffset, &info);
+    DecodeGCHdrInfo(gcInfoToken, relOffset, &info);
 
     // We should be called only for synchronized methods
     _ASSERTE(info.syncStartOffset != INVALID_SYNC_OFFSET && info.syncEndOffset != INVALID_SYNC_OFFSET);
@@ -5558,9 +5568,8 @@ size_t EECodeManager::GetFunctionSize(GCInfoToken gcInfoToken)
 
 #if defined(_TARGET_X86_)
     hdrInfo info;
-    PTR_VOID  methodInfoPtr = gcInfoToken.Info;
 
-    crackMethodInfoHdr(methodInfoPtr, 0, &info);
+    DecodeGCHdrInfo(gcInfoToken, 0, &info);
 
     return info.methodSize;
 #elif defined(USE_GC_INFO_DECODER)
@@ -5578,15 +5587,47 @@ size_t EECodeManager::GetFunctionSize(GCInfoToken gcInfoToken)
     PORTABILITY_ASSERT("EECodeManager::GetFunctionSize is not implemented on this platform.");
     return 0;
 #endif
+}
 
+/*****************************************************************************
+*
+*  Returns the size of a given function.
+*/
+ReturnKind EECodeManager::GetReturnKind(GCInfoToken gcInfoToken)
+{
+    CONTRACTL{
+        NOTHROW;
+    GC_NOTRIGGER;
+    SUPPORTS_DAC;
+    } CONTRACTL_END;
 
+    if (!gcInfoToken.IsReturnKindAvailable())
+    {
+        return RT_Illegal;
+    }
+
+#if defined(_TARGET_X86_)
+    hdrInfo info;
+
+    DecodeGCHdrInfo(gcInfoToken, 0, &info);
+
+    return info.returnKind;
+#elif defined(USE_GC_INFO_DECODER)
+
+    GcInfoDecoder gcInfoDecoder(gcInfoToken, DECODE_RETURN_KIND);
+    return gcInfoDecoder.GetReturnKind();
+
+#else // !_TARGET_X86_ && !USE_GC_INFO_DECODER
+    PORTABILITY_ASSERT("EECodeManager::GetReturnKind is not implemented on this platform.");
+    return 0;
+#endif
 }
 
 /*****************************************************************************
  *
  *  Returns the size of the frame of the given function.
  */
-unsigned int EECodeManager::GetFrameSize(PTR_VOID methodInfoPtr)
+unsigned int EECodeManager::GetFrameSize(GCInfoToken gcInfoToken)
 {
     CONTRACTL {
         NOTHROW;
@@ -5596,7 +5637,7 @@ unsigned int EECodeManager::GetFrameSize(PTR_VOID methodInfoPtr)
 #ifndef USE_GC_INFO_DECODER
     hdrInfo info;
 
-    crackMethodInfoHdr(methodInfoPtr, 0, &info);
+    DecodeGCHdrInfo(gcInfoToken, 0, &info);
 
     // currently only used by E&C callers need to know about doubleAlign
     // in all likelyhood
@@ -5624,10 +5665,10 @@ const BYTE* EECodeManager::GetFinallyReturnAddr(PREGDISPLAY pReg)
 #endif
 }
 
-BOOL EECodeManager::IsInFilter(void *methodInfoPtr,
-                              unsigned offset,
-                              PCONTEXT pCtx,
-                              DWORD curNestLevel)
+BOOL EECodeManager::IsInFilter(GCInfoToken gcInfoToken,
+                               unsigned offset,
+                               PCONTEXT pCtx,
+                               DWORD curNestLevel)
 {
     CONTRACTL {
         NOTHROW;
@@ -5640,9 +5681,9 @@ BOOL EECodeManager::IsInFilter(void *methodInfoPtr,
 
     hdrInfo     info;
 
-    crackMethodInfoHdr(methodInfoPtr,
-                       offset,
-                       &info);
+    DecodeGCHdrInfo(gcInfoToken,
+                    offset,
+                    &info);
 
     /* make sure that we have an ebp stack frame */
 
@@ -5668,7 +5709,7 @@ BOOL EECodeManager::IsInFilter(void *methodInfoPtr,
 }
 
 
-BOOL EECodeManager::LeaveFinally(void *methodInfoPtr,
+BOOL EECodeManager::LeaveFinally(GCInfoToken gcInfoToken,
                                 unsigned offset,
                                 PCONTEXT pCtx)
 {
@@ -5681,9 +5722,9 @@ BOOL EECodeManager::LeaveFinally(void *methodInfoPtr,
 
     hdrInfo info;
 
-    crackMethodInfoHdr(methodInfoPtr,
-                       offset,
-                       &info);
+    DecodeGCHdrInfo(gcInfoToken,
+                    offset,
+                    &info);
 
     DWORD       nestingLevel;
     GetHandlerFrameInfo(&info, pCtx->Ebp, pCtx->Esp, (DWORD) IGNORE_VAL, NULL, &nestingLevel);
@@ -5707,7 +5748,7 @@ BOOL EECodeManager::LeaveFinally(void *methodInfoPtr,
 #endif
 }
 
-void EECodeManager::LeaveCatch(void *methodInfoPtr,
+void EECodeManager::LeaveCatch(GCInfoToken gcInfoToken,
                                 unsigned offset,
                                 PCONTEXT pCtx)
 {
@@ -5724,7 +5765,7 @@ void EECodeManager::LeaveCatch(void *methodInfoPtr,
     bool        hasInnerFilter;
     hdrInfo     info;
 
-    crackMethodInfoHdr(methodInfoPtr, offset, &info);
+    DecodeGCHdrInfo(gcInfoToken, offset, &info);
     GetHandlerFrameInfo(&info, pCtx->Ebp, pCtx->Esp, (DWORD) IGNORE_VAL,
                         &baseSP, &nestingLevel, &hasInnerFilter);
 //    _ASSERTE(frameType == FR_HANDLER);
@@ -5774,17 +5815,17 @@ TADDR EECodeManager::GetAmbientSP(PREGDISPLAY     pContext,
     } CONTRACTL_END;
 
 #ifdef _TARGET_X86_
-    PTR_VOID  methodInfoPtr = pCodeInfo->GetGCInfo();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
 
     _ASSERTE(sizeof(CodeManStateBuf) <= sizeof(pState->stateBuf));
     CodeManStateBuf * stateBuf = (CodeManStateBuf*)pState->stateBuf;
-    PTR_CBYTE table = PTR_CBYTE(methodInfoPtr);
+    PTR_CBYTE table = PTR_CBYTE(gcInfoToken.Info);
 
     /* Extract the necessary information from the info block header */
 
-    stateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(methodInfoPtr,
-                                       dwRelOffset,
-                                       &stateBuf->hdrInfoBody);
+    stateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken,
+                                                   dwRelOffset,
+                                                   &stateBuf->hdrInfoBody);
     table += stateBuf->hdrInfoSize;
 
     pState->dwIsSet = 1;
@@ -5868,8 +5909,8 @@ ULONG32 EECodeManager::GetStackParameterSize(EECodeInfo * pCodeInfo)
     } CONTRACTL_END;
 
 #if defined(_TARGET_X86_)
-    PTR_VOID       methodInfoPtr = pCodeInfo->GetGCInfo();
-    unsigned       dwOffset = pCodeInfo->GetRelOffset();
+    GCInfoToken gcInfoToken = pCodeInfo->GetGCInfoToken();
+    unsigned    dwOffset = pCodeInfo->GetRelOffset();
 
     CodeManState state;
     state.dwIsSet = 0;
@@ -5878,7 +5919,7 @@ ULONG32 EECodeManager::GetStackParameterSize(EECodeInfo * pCodeInfo)
     CodeManStateBuf * pStateBuf = reinterpret_cast<CodeManStateBuf *>(state.stateBuf);
 
     hdrInfo * pHdrInfo = &(pStateBuf->hdrInfoBody);
-    pStateBuf->hdrInfoSize = (DWORD)crackMethodInfoHdr(methodInfoPtr, dwOffset, pHdrInfo);
+    pStateBuf->hdrInfoSize = (DWORD)DecodeGCHdrInfo(gcInfoToken, dwOffset, pHdrInfo);
 
     // We need to subtract 4 here because ESPIncrOnReturn() includes the stack slot containing the return
     // address.
index d26f2d6..4f72702 100644 (file)
@@ -1679,7 +1679,7 @@ bool FinallyIsUnwinding(EHRangeTreeNode *pNode,
 BOOL LeaveCatch(ICodeManager* pEECM,
                 Thread *pThread,
                 CONTEXT *pCtx,
-                void *methodInfoPtr,
+                GCInfoToken gcInfoToken,
                 unsigned offset)
 {
     CONTRACTL
@@ -1703,7 +1703,7 @@ BOOL LeaveCatch(ICodeManager* pEECM,
     PopNestedExceptionRecords(esp, pCtx, pThread->GetExceptionListPtr());
 
     // Do JIT-specific work
-    pEECM->LeaveCatch(methodInfoPtr, offset, pCtx);
+    pEECM->LeaveCatch(gcInfoToken, offset, pCtx);
 
     SetSP(pCtx, (UINT_PTR)esp);
     return TRUE;
@@ -1762,7 +1762,7 @@ HRESULT IsLegalTransition(Thread *pThread,
                           ICodeManager* pEECM,
                           PREGDISPLAY pReg,
                           SLOT addrStart,
-                          void *methodInfoPtr,
+                          GCInfoToken gcInfoToken,
                           PCONTEXT pCtx)
 {
     CONTRACTL
@@ -1875,7 +1875,7 @@ HRESULT IsLegalTransition(Thread *pThread,
                         if (!LeaveCatch(pEECM,
                                         pThread,
                                         pFilterCtx,
-                                        methodInfoPtr,
+                                        gcInfoToken,
                                         offFrom))
                             return E_FAIL;
                     }
@@ -1930,7 +1930,7 @@ HRESULT IsLegalTransition(Thread *pThread,
 
                         if (!fCanSetIPOnly)
                         {
-                            if (!pEECM->LeaveFinally(methodInfoPtr,
+                            if (!pEECM->LeaveFinally(gcInfoToken,
                                                      offFrom,
                                                      pFilterCtx))
                                 return E_FAIL;
@@ -2041,7 +2041,7 @@ HRESULT SetIPFromSrcToDst(Thread *pThread,
     EECodeInfo codeInfo((TADDR)(addrStart));
 
     ICodeManager * pEECM = codeInfo.GetCodeManager();
-    LPVOID methodInfoPtr = codeInfo.GetGCInfo();
+    GCInfoToken gcInfoToken = codeInfo.GetGCInfoToken();
 
     // Do both checks here so compiler doesn't complain about skipping
     // initialization b/c of goto.
@@ -2097,7 +2097,7 @@ retryForCommit:
                                pEECM,
                                pReg,
                                addrStart,
-                               methodInfoPtr,
+                               gcInfoToken,
                                pCtx);
 
         if (FAILED(hr))
@@ -2120,7 +2120,7 @@ retryForCommit:
                                pEECM,
                                pReg,
                                addrStart,
-                               methodInfoPtr,
+                               gcInfoToken,
                                pCtx);
 
         if (FAILED(hr))
@@ -2143,7 +2143,7 @@ retryForCommit:
                                pEECM,
                                pReg,
                                addrStart,
-                               methodInfoPtr,
+                               gcInfoToken,
                                pCtx);
 
         if (FAILED(hr))
index 89f271c..24f9435 100644 (file)
@@ -80,7 +80,7 @@ void SetupAndSprinkleBreakpoints(
 
     gcCover->methodRegion      = methodRegionInfo;
     gcCover->codeMan           = pCodeInfo->GetCodeManager();
-    gcCover->gcInfoToken           = pCodeInfo->GetGCInfoToken();
+    gcCover->gcInfoToken       = pCodeInfo->GetGCInfoToken();
     gcCover->callerThread      = 0;
     gcCover->doingEpilogChecks = true;    
 
@@ -583,7 +583,7 @@ void GCCoverageInfo::SprinkleBreakpoints(
 #ifdef _TARGET_X86_
         // we will whack every instruction in the prolog and epilog to make certain
         // our unwinding logic works there.  
-        if (codeMan->IsInPrologOrEpilog((cur - codeStart) + (DWORD)regionOffsetAdj, gcInfoToken.Info, NULL)) {
+        if (codeMan->IsInPrologOrEpilog((cur - codeStart) + (DWORD)regionOffsetAdj, gcInfoToken, NULL)) {
             *cur = INTERRUPT_INSTR;
         }
 #endif
@@ -1527,7 +1527,7 @@ void DoGcStress (PCONTEXT regs, MethodDesc *pMD)
     /* are we in a prolog or epilog?  If so just test the unwind logic
        but don't actually do a GC since the prolog and epilog are not
        GC safe points */
-    if (gcCover->codeMan->IsInPrologOrEpilog(offset, gcCover->gcInfoToken.Info, NULL))
+    if (gcCover->codeMan->IsInPrologOrEpilog(offset, gcCover->gcInfoToken, NULL))
     {
         // We are not at a GC safe point so we can't Suspend EE (Suspend EE will yield to GC).
         // But we still have to update the GC Stress instruction. We do it directly without suspending
index 8dc1692..b294581 100644 (file)
@@ -125,7 +125,7 @@ inline bool SafeToReportGenericParamContext(CrawlFrame* pCF)
 #ifndef USE_GC_INFO_DECODER
 
     ICodeManager * pEECM = pCF->GetCodeManager();
-    if (pEECM != NULL && pEECM->IsInPrologOrEpilog(pCF->GetRelOffset(), pCF->GetGCInfo(), NULL))
+    if (pEECM != NULL && pEECM->IsInPrologOrEpilog(pCF->GetRelOffset(), pCF->GetGCInfoToken(), NULL))
     {
         return false;
     }
index c4fbc40..531c001 100644 (file)
@@ -2121,9 +2121,11 @@ STRINGREF __stdcall StringObject::StringInitCharHelper(LPCSTR pszSource, int len
     if (!pszSource || length == 0) {
         return StringObject::GetEmptyString();
     }
+#ifndef FEATURE_PAL
     else if ((size_t)pszSource < 64000) {
         COMPlusThrow(kArgumentException, W("Arg_MustBeStringPtrNotAtom"));
     }    
+#endif // FEATURE_PAL
 
     // Make sure we can read from the pointer.
     // This is better than try to read from the pointer and catch the access violation exceptions.
index fee883f..20dceed 100644 (file)
@@ -7081,12 +7081,13 @@ Loop:
 
             // GC info will assist us in determining whether this is a non-EBP frame and
             // info about pushed arguments.
-            PTR_VOID gcInfo = codeInfo.GetGCInfo();
+            GCInfoToken gcInfoToken = codeInfo.GetGCInfoToken();
+            PTR_VOID gcInfo = gcInfoToken.Info;
             InfoHdr header;
             unsigned uiMethodSizeDummy;
             PTR_CBYTE table = PTR_CBYTE(gcInfo);
             table += decodeUnsigned(table, &uiMethodSizeDummy);
-            table = decodeHeader(table, &header);
+            table = decodeHeader(table, gcInfoToken.Version, &header);
 
             // Ok, GCInfo, can we do a simple EBP walk or what?
 
index 3b0b472..29b5617 100644 (file)
@@ -2416,7 +2416,7 @@ StackWalkAction StackFrameIterator::NextRaw(void)
                 OBJECTREF      orUnwind = NULL;
 
                 if (m_crawl.GetCodeManager()->IsInSynchronizedRegion(m_crawl.GetRelOffset(),
-                                                                    m_crawl.GetGCInfo(), 
+                                                                    m_crawl.GetGCInfoToken(), 
                                                                     m_crawl.GetCodeManagerFlags()))
                 {
                     if (pMD->IsStatic())
@@ -3158,7 +3158,7 @@ void StackFrameIterator::PreProcessingForManagedFrames(void)
          m_crawl.pFunc->IsSynchronized() && 
          !m_crawl.pFunc->IsStatic()      &&
          m_crawl.GetCodeManager()->IsInSynchronizedRegion(m_crawl.GetRelOffset(), 
-                                                         m_crawl.GetGCInfo(), 
+                                                         m_crawl.GetGCInfoToken(), 
                                                          m_crawl.GetCodeManagerFlags()))
     {
         BEGIN_GCX_ASSERT_COOP;
index 0458b7d..732529f 100644 (file)
@@ -7275,18 +7275,8 @@ ReturnKind GetReturnKindFromMethodTable(Thread *pThread, EECodeInfo *codeInfo)
 
 ReturnKind GetReturnKind(Thread *pThread, EECodeInfo *codeInfo)
 {
-    ReturnKind returnKind = RT_Illegal;
-
-#ifdef _TARGET_X86_  
-    // X86 GCInfo updates yet to be implemented.
-#else
     GCInfoToken gcInfoToken = codeInfo->GetGCInfoToken();
-    if (gcInfoToken.IsReturnKindAvailable()) 
-    {
-        GcInfoDecoder gcInfoDecoder(gcInfoToken, DECODE_RETURN_KIND);
-        returnKind = gcInfoDecoder.GetReturnKind();
-    }
-#endif // _TARGET_X86_
+    ReturnKind returnKind = codeInfo->GetCodeManager()->GetReturnKind(gcInfoToken);
 
     if (!IsValidReturnKind(returnKind))
     {
@@ -7312,7 +7302,7 @@ VOID * GetHijackAddr(Thread *pThread, EECodeInfo *codeInfo)
 #ifdef _TARGET_X86_
     if (returnKind == RT_Float)
     {
-        return reinterpret_cast<VOID *>(OnHijackTripThread);
+        return reinterpret_cast<VOID *>(OnHijackFPTripThread);
     }
 #endif // _TARGET_X86_
 
index ee45e58..41be913 100644 (file)
             <Issue>3392</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\div\u8div_cs_do\u8div_cs_do.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2413</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\div\u8div_cs_ro\u8div_cs_ro.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2413</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\rem\u8rem_cs_do\u8rem_cs_do.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2412</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\rem\u8rem_cs_ro\u8rem_cs_ro.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2412</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\tailcall_v4\smallFrame\smallFrame.cmd">
             <Issue>tail. call pop ret is only supported on amd64</Issue>
             <Issue>needs triage</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\opt\Tailcall\TailcallVerifyWithPrefix\TailcallVerifyWithPrefix.cmd">
-            <Issue>x86 JIT doesn't support implicit tail call optimization or tail. call pop ret sequence</Issue>
+            <Issue>2420. x86 JIT doesn't support implicit tail call optimization or tail. call pop ret sequence</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Performance\CodeQuality\Roslyn\CscBench\CscBench.cmd">
-            <Issue>6844</Issue>
+            <Issue>7038,7173</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\Dev11\External\dev11_239804\ShowLocallocAlignment\ShowLocallocAlignment.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>7163</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\managed\Compilation\Compilation\Compilation.cmd">
             <Issue>needs triage</Issue>
index 3c232b0..800b5cb 100644 (file)
@@ -44,6 +44,18 @@ echo "branch = $perfBranch"
 echo "architecture = $perfArch"
 echo "configuration = $perfConfig"
 
+# Install nuget to download benchview package, which includes the script machinedata.py for machine data collection
+wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
+chmod u+x ./nuget.exe
+./nuget.exe install Microsoft.BenchView.JSONFormat -Source http://benchviewtestfeed.azurewebsites.net/nuget -OutputDirectory ./tests/scripts -Prerelease
+
+# Install python 3.5.2 to run machinedata.py for machine data collection
+sudo add-apt-repository ppa:fkrull/deadsnakes
+sudo apt-get update
+sudo apt-get --assume-yes install python3.5
+python3.5 --version
+python3.5 ./tests/scripts/Microsoft.BenchView.JSONFormat.0.1.0-pre010/tools/machinedata.py
+
 # Set up the copies
 # Coreclr build containing the tests and mscorlib
 curl http://dotnet-ci.cloudapp.net/job/$perfBranch/job/master/job/release_windows_nt/lastSuccessfulBuild/artifact/bin/tests/tests.zip -o tests.zip
index e56194c..39202ec 100644 (file)
@@ -386,18 +386,9 @@ echo "CORE_ROOT dir = $CORE_ROOT"
 
 DO_SETUP=TRUE
 
-dir $testNativeBinDir/../../../../..
-echo 'dir $testNativeBinDir/../../../../..'
-dir $testNativeBinDir/../../../../../packages
-echo 'dir $testNativeBinDir/../../../../../packages'
-dir $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli
-echo 'dir $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli'
-dir $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli/1.0.0-alpha-build0035
-echo 'dir $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli/1.0.0-alpha-build0035'
-
 if [ ${DO_SETUP} == "TRUE" ]; then
-cp  $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli/1.0.0-alpha-build0035/lib/netstandard1.3/Microsoft.DotNet.xunit.performance.runner.cli.dll .
-cp  $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.run.core/1.0.0-alpha-build0035/lib/dotnet/*.dll .
+cp  $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.runner.cli/1.0.0-alpha-build0040/lib/netstandard1.3/Microsoft.DotNet.xunit.performance.runner.cli.dll .
+cp  $testNativeBinDir/../../../../../packages/Microsoft.DotNet.xunit.performance.run.core/1.0.0-alpha-build0040/lib/dotnet/*.dll .
 fi
 
 # Run coreclr performance tests
@@ -414,5 +405,7 @@ cp $testcase .
 
 chmod u+x ./corerun
 ./corerun Microsoft.DotNet.xunit.performance.runner.cli.dll $test -runner xunit.console.netcore.exe -runnerhost ./corerun -verbose -runid perf-$testname
-
 done
+
+mkdir ../../../../../sandbox
+cp *.xml ../../../../../sandbox
index 12262ef..3a741d1 100644 (file)
@@ -7,67 +7,67 @@
     "Microsoft.DotNet.xunit.performance": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.analysis": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.runner.Windows": "1.0.0-alpha-build0040",
-    "Microsoft.Win32.Primitives": "4.3.0-beta-24431-01",
+    "Microsoft.Win32.Primitives": "4.3.0-beta-24513-02",
     "Newtonsoft.Json": "7.0.1",
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "Microsoft.NETCore.Targets": "4.3.0-beta-24431-01",
-    "System.Collections.Immutable": "1.3.0-beta-24431-01",
-    "System.Threading.Thread": "4.3.0-beta-24431-01",
-    "System.Collections": "4.3.0-beta-24431-01",
-    "System.Xml.XmlSerializer": "4.3.0-beta-24431-01",
-    "System.Collections.Concurrent": "4.3.0-beta-24431-01",
-    "System.ObjectModel": "4.3.0-beta-24431-01",
-    "System.Runtime.Numerics": "4.3.0-beta-24431-01",
-    "System.Collections.NonGeneric": "4.3.0-beta-24431-01",
-    "System.Collections.Specialized": "4.3.0-beta-24431-01",
-    "System.ComponentModel": "4.3.0-beta-24431-01",
-    "System.Reflection.Emit.Lightweight": "4.3.0-beta-24431-01",
-    "System.Reflection.TypeExtensions": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Contracts": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Debug": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Process": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Tools": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Tracing": "4.3.0-beta-24431-01",
-    "System.Dynamic.Runtime": "4.3.0-beta-24431-01",
-    "System.Globalization": "4.3.0-beta-24431-01",
-    "System.Globalization.Calendars": "4.3.0-beta-24431-01",
-    "System.IO": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem.Primitives": "4.3.0-beta-24431-01",
-    "System.Linq": "4.3.0-beta-24431-01",
-    "System.Linq.Queryable": "4.3.0-beta-24431-01",
-    "System.Linq.Expressions": "4.3.0-beta-24431-01",
-    "System.Reflection": "4.3.0-beta-24431-01",
-    "System.Reflection.Extensions": "4.3.0-beta-24431-01",
-    "System.Resources.ResourceManager": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.CompilerServices.Unsafe": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Runtime.Handles": "4.3.0-beta-24431-01",
-    "System.Runtime.InteropServices": "4.3.0-beta-24431-01",
-    "System.Runtime.InteropServices.RuntimeInformation": "4.3.0-beta-24431-01",
-    "System.Runtime.Loader": "4.3.0-beta-24431-01",
-    "System.Runtime.Serialization.Json": "4.3.0-beta-24431-01",
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "Microsoft.NETCore.Targets": "1.0.3-beta-24513-02",
+    "System.Collections.Immutable": "1.3.0-beta-24513-02",
+    "System.Threading.Thread": "4.3.0-beta-24513-02",
+    "System.Collections": "4.3.0-beta-24513-02",
+    "System.Xml.XmlSerializer": "4.3.0-beta-24513-02",
+    "System.Collections.Concurrent": "4.3.0-beta-24513-02",
+    "System.ObjectModel": "4.3.0-beta-24513-02",
+    "System.Runtime.Numerics": "4.3.0-beta-24513-02",
+    "System.Collections.NonGeneric": "4.3.0-beta-24513-02",
+    "System.Collections.Specialized": "4.3.0-beta-24513-02",
+    "System.ComponentModel": "4.3.0-beta-24513-02",
+    "System.Reflection.Emit.Lightweight": "4.3.0-beta-24513-02",
+    "System.Reflection.TypeExtensions": "4.3.0-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Contracts": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Debug": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Process": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Tools": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Tracing": "4.3.0-beta-24513-02",
+    "System.Dynamic.Runtime": "4.3.0-beta-24513-02",
+    "System.Globalization": "4.3.0-beta-24513-02",
+    "System.Globalization.Calendars": "4.3.0-beta-24513-02",
+    "System.IO": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem.Primitives": "4.3.0-beta-24513-02",
+    "System.Linq": "4.3.0-beta-24513-02",
+    "System.Linq.Queryable": "4.3.0-beta-24513-02",
+    "System.Linq.Expressions": "4.3.0-beta-24513-02",
+    "System.Reflection": "4.3.0-beta-24513-02",
+    "System.Reflection.Extensions": "4.3.0-beta-24513-02",
+    "System.Resources.ResourceManager": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.CompilerServices.Unsafe": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Runtime.Handles": "4.3.0-beta-24513-02",
+    "System.Runtime.InteropServices": "4.3.0-beta-24513-02",
+    "System.Runtime.InteropServices.RuntimeInformation": "4.3.0-beta-24513-02",
+    "System.Runtime.Loader": "4.3.0-beta-24513-02",
+    "System.Runtime.Serialization.Json": "4.3.0-beta-24513-02",
     "System.Runtime.Serialization.Primitives": "4.1.1",
-    "System.Runtime.Serialization.Xml": "4.3.0-beta-24431-01",
-    "System.Security.Cryptography.Algorithms": "4.3.0-beta-24431-01",
-    "System.Text.Encoding": "4.3.0-beta-24431-01",
-    "System.Text.Encoding.Extensions": "4.3.0-beta-24431-01",
-    "System.Text.RegularExpressions": "4.3.0-beta-24431-01",
-    "System.Threading": "4.3.0-beta-24431-01",
-    "System.Threading.AccessControl": "4.3.0-beta-24431-01",
-    "System.Threading.Overlapped": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks.Parallel": "4.3.0-beta-24431-01",
-    "System.Threading.ThreadPool": "4.3.0-beta-24431-01",
-    "System.Threading.Timer": "4.3.0-beta-24431-01",
-    "System.Xml.ReaderWriter": "4.3.0-beta-24431-01",
-    "System.Xml.XDocument": "4.3.0-beta-24431-01",
-    "System.Xml.XmlDocument": "4.3.0-beta-24431-01",
-    "System.Xml.XPath": "4.3.0-beta-24431-01",
-    "System.Xml.XPath.XmlDocument": "4.3.0-beta-24431-01",
-    "System.Numerics.Vectors": "4.3.0-beta-24431-01"
+    "System.Runtime.Serialization.Xml": "4.3.0-beta-24513-02",
+    "System.Security.Cryptography.Algorithms": "4.3.0-beta-24513-02",
+    "System.Text.Encoding": "4.3.0-beta-24513-02",
+    "System.Text.Encoding.Extensions": "4.3.0-beta-24513-02",
+    "System.Text.RegularExpressions": "4.3.0-beta-24513-02",
+    "System.Threading": "4.3.0-beta-24513-02",
+    "System.Threading.AccessControl": "4.3.0-beta-24513-02",
+    "System.Threading.Overlapped": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks.Parallel": "4.3.0-beta-24513-02",
+    "System.Threading.ThreadPool": "4.3.0-beta-24513-02",
+    "System.Threading.Timer": "4.3.0-beta-24513-02",
+    "System.Xml.ReaderWriter": "4.3.0-beta-24513-02",
+    "System.Xml.XDocument": "4.3.0-beta-24513-02",
+    "System.Xml.XmlDocument": "4.3.0-beta-24513-02",
+    "System.Xml.XPath": "4.3.0-beta-24513-02",
+    "System.Xml.XPath.XmlDocument": "4.3.0-beta-24513-02",
+    "System.Numerics.Vectors": "4.3.0-beta-24513-02"
   },
   "frameworks": {
     "netcoreapp1.0": {
index bc169df..06f4040 100644 (file)
@@ -4,23 +4,23 @@
     "Microsoft.DotNet.xunit.performance": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.analysis": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.runner.Windows": "1.0.0-alpha-build0040",
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Dynamic.Runtime": "4.3.0-beta-24431-01",
-    "System.Linq": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem": "4.3.0-beta-24431-01",
-    "System.Numerics.Vectors": "4.3.0-beta-24431-01",
-    "System.Reflection": "4.3.0-beta-24431-01",
-    "System.Reflection.Extensions": "4.3.0-beta-24431-01",
-    "System.Reflection.TypeExtensions": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Runtime.Numerics": "4.3.0-beta-24431-01",
-    "System.Text.RegularExpressions": "4.3.0-beta-24431-01",
-    "System.Threading": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks.Parallel": "4.3.0-beta-24431-01",
-    "System.Security.Cryptography.Algorithms": "4.3.0-beta-24431-01",
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Dynamic.Runtime": "4.3.0-beta-24513-02",
+    "System.Linq": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem": "4.3.0-beta-24513-02",
+    "System.Numerics.Vectors": "4.3.0-beta-24513-02",
+    "System.Reflection": "4.3.0-beta-24513-02",
+    "System.Reflection.Extensions": "4.3.0-beta-24513-02",
+    "System.Reflection.TypeExtensions": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Runtime.Numerics": "4.3.0-beta-24513-02",
+    "System.Text.RegularExpressions": "4.3.0-beta-24513-02",
+    "System.Threading": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks.Parallel": "4.3.0-beta-24513-02",
+    "System.Security.Cryptography.Algorithms": "4.3.0-beta-24513-02",
     "xunit": "2.2.0-beta2-build3300",
     "xunit.console.netcore": "1.0.2-prerelease-00177",
     "xunit.runner.utility": "2.2.0-beta2-build3300"
index 00852ca..1b6d67f 100644 (file)
@@ -3,21 +3,21 @@
     "Microsoft.DotNet.xunit.performance": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.analysis": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.runner.Windows": "1.0.0-alpha-build0040",
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
     "Newtonsoft.Json": "7.0.1",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.IO": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem": "4.3.0-beta-24431-01",
-    "System.Linq": "4.3.0-beta-24431-01",
-    "System.ObjectModel": "4.3.0-beta-24431-01",
-    "System.Dynamic.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Serialization.Json": "4.3.0-beta-24431-01",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.IO": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem": "4.3.0-beta-24513-02",
+    "System.Linq": "4.3.0-beta-24513-02",
+    "System.ObjectModel": "4.3.0-beta-24513-02",
+    "System.Dynamic.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Serialization.Json": "4.3.0-beta-24513-02",
     "System.Runtime.Serialization.Primitives": "4.1.1",
-    "System.Runtime.Serialization.Xml": "4.3.0-beta-24431-01",
-    "System.Text.RegularExpressions": "4.3.0-beta-24431-01",
-    "System.Xml.XmlDocument": "4.3.0-beta-24431-01",
-    "System.Xml.XmlSerializer": "4.3.0-beta-24431-01",
+    "System.Runtime.Serialization.Xml": "4.3.0-beta-24513-02",
+    "System.Text.RegularExpressions": "4.3.0-beta-24513-02",
+    "System.Xml.XmlDocument": "4.3.0-beta-24513-02",
+    "System.Xml.XmlSerializer": "4.3.0-beta-24513-02",
     "xunit": "2.2.0-beta2-build3300",
     "xunit.console.netcore": "1.0.2-prerelease-00177",
     "xunit.runner.utility": "2.2.0-beta2-build3300"
index b11e62a..8bec3db 100644 (file)
@@ -3,24 +3,24 @@
     "Microsoft.DotNet.xunit.performance": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.analysis": "1.0.0-alpha-build0040",
     "Microsoft.DotNet.xunit.performance.runner.Windows": "1.0.0-alpha-build0040",
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Collections.NonGeneric": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem": "4.3.0-beta-24431-01",
-    "System.Linq": "4.3.0-beta-24431-01",
-    "System.Linq.Expressions": "4.3.0-beta-24431-01",
-    "System.Numerics.Vectors": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Runtime.Numerics": "4.3.0-beta-24431-01",
-    "System.Text.RegularExpressions": "4.3.0-beta-24431-01",
-    "System.Threading": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks": "4.3.0-beta-24431-01",
-    "System.Threading.Tasks.Parallel": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Process": "4.3.0-beta-24431-01",
-    "System.Xml.XmlDocument": "4.3.0-beta-24431-01",
-    "System.Xml.XPath": "4.3.0-beta-24431-01",
-    "System.Xml.XPath.XmlDocument": "4.3.0-beta-24431-01",
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Collections.NonGeneric": "4.3.0-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem": "4.3.0-beta-24513-02",
+    "System.Linq": "4.3.0-beta-24513-02",
+    "System.Linq.Expressions": "4.3.0-beta-24513-02",
+    "System.Numerics.Vectors": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Runtime.Numerics": "4.3.0-beta-24513-02",
+    "System.Text.RegularExpressions": "4.3.0-beta-24513-02",
+    "System.Threading": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks": "4.3.0-beta-24513-02",
+    "System.Threading.Tasks.Parallel": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Process": "4.3.0-beta-24513-02",
+    "System.Xml.XmlDocument": "4.3.0-beta-24513-02",
+    "System.Xml.XPath": "4.3.0-beta-24513-02",
+    "System.Xml.XPath.XmlDocument": "4.3.0-beta-24513-02",
     "xunit": "2.2.0-beta2-build3300",
     "xunit.console.netcore": "1.0.2-prerelease-00177",
     "xunit.runner.utility": "2.2.0-beta2-build3300"
index cea61e4..607b8bd 100644 (file)
@@ -1,21 +1,21 @@
 {
   "dependencies": {
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Collections": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Debug": "4.3.0-beta-24431-01",
-    "System.Runtime.InteropServices.RuntimeInformation": "4.3.0-beta-24431-01",
-    "System.Diagnostics.Process": "4.3.0-beta-24431-01",
-    "System.Globalization": "4.3.0-beta-24431-01",
-    "System.IO": "4.3.0-beta-24431-01",
-    "System.IO.FileSystem": "4.3.0-beta-24431-01",
-    "System.Reflection": "4.3.0-beta-24431-01",
-    "System.Reflection.Extensions": "4.3.0-beta-24431-01",
-    "System.Reflection.TypeExtensions": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Runtime.CompilerServices.Unsafe": "4.3.0-beta-24431-01",
-    "System.Runtime.InteropServices": "4.3.0-beta-24431-01"
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Collections": "4.3.0-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Debug": "4.3.0-beta-24513-02",
+    "System.Runtime.InteropServices.RuntimeInformation": "4.3.0-beta-24513-02",
+    "System.Diagnostics.Process": "4.3.0-beta-24513-02",
+    "System.Globalization": "4.3.0-beta-24513-02",
+    "System.IO": "4.3.0-beta-24513-02",
+    "System.IO.FileSystem": "4.3.0-beta-24513-02",
+    "System.Reflection": "4.3.0-beta-24513-02",
+    "System.Reflection.Extensions": "4.3.0-beta-24513-02",
+    "System.Reflection.TypeExtensions": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Runtime.CompilerServices.Unsafe": "4.3.0-beta-24513-02",
+    "System.Runtime.InteropServices": "4.3.0-beta-24513-02"
   },
   "frameworks": {
     "netcoreapp1.0": {}
index bb33840..d6a1b88 100644 (file)
@@ -1,10 +1,10 @@
 {
   "dependencies": {
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Runtime.InteropServices": "4.3.0-beta-24431-01"
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Runtime.InteropServices": "4.3.0-beta-24513-02"
   },
   "frameworks": {
     "netcoreapp1.0": {}
index d3d8683..c6b01f2 100644 (file)
@@ -1,12 +1,12 @@
 {
   "dependencies": {
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Numerics.Vectors": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Threading": "4.3.0-beta-24431-01",
-    "System.Threading.Thread": "4.3.0-beta-24431-01"
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Numerics.Vectors": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Threading": "4.3.0-beta-24513-02",
+    "System.Threading.Thread": "4.3.0-beta-24513-02"
   },
   "frameworks": {
     "netcoreapp1.0": {}
index 3e04f84..1c39308 100644 (file)
@@ -1,10 +1,10 @@
 {
   "dependencies": {
-    "Microsoft.NETCore.Platforms": "4.3.0-beta-24431-01",
-    "System.Console": "4.3.0-beta-24431-01",
-    "System.Runtime": "4.3.0-beta-24431-01",
-    "System.Runtime.Extensions": "4.3.0-beta-24431-01",
-    "System.Threading": "4.3.0-beta-24431-01"
+    "Microsoft.NETCore.Platforms": "1.0.2-beta-24513-02",
+    "System.Console": "4.3.0-beta-24513-02",
+    "System.Runtime": "4.3.0-beta-24513-02",
+    "System.Runtime.Extensions": "4.3.0-beta-24513-02",
+    "System.Threading": "4.3.0-beta-24513-02"
   },
   "frameworks": {
     "netcoreapp1.0": {}
index 0f57381..b169410 100644 (file)
             <Issue>5286</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\Dev11\External\dev11_239804\ShowLocallocAlignment\ShowLocallocAlignment.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>7163</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\JitBlue\GitHub_4044\GitHub_4044\GitHub_4044.cmd">
             <Issue>needs triage</Issue>
index 671e67d..7cbf5c0 100644 (file)
             <Issue>2414</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\jit64\opt\cse\HugeArray1\HugeArray1.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2408</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\jit64\regress\ndpw\21220\b21220\b21220.cmd">
             <Issue>2414</Issue>
             <Issue>3392</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\div\u8div_cs_do\u8div_cs_do.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2413</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\div\u8div_cs_ro\u8div_cs_ro.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2413</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\rem\u8rem_cs_do\u8rem_cs_do.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2412</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\divrem\rem\u8rem_cs_ro\u8rem_cs_ro.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>2412</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\tailcall_v4\smallFrame\smallFrame.cmd">
             <Issue>tail. call pop ret is only supported on amd64</Issue>
             <Issue>needs triage</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\opt\Tailcall\TailcallVerifyWithPrefix\TailcallVerifyWithPrefix.cmd">
-            <Issue>x86 JIT doesn't support implicit tail call optimization or tail. call pop ret sequence</Issue>
+            <Issue>2420. x86 JIT doesn't support implicit tail call optimization or tail. call pop ret sequence</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Performance\CodeQuality\Roslyn\CscBench\CscBench.cmd">
             <Issue>6844</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\JIT\Regression\Dev11\External\dev11_239804\ShowLocallocAlignment\ShowLocallocAlignment.cmd">
-            <Issue>needs triage</Issue>
+            <Issue>7163</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)\managed\Compilation\Compilation\Compilation.cmd">
             <Issue>needs triage</Issue>