#if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
FrameWithCookie<GCFrame> gcFrame;
-
- OBJECTREF* retPointer = 0;
- UINT numObjRefs = 1;
-#if defined(UNIX_AMD64_ABI) || defined(_TARGET_ARM64_)
- // These targets support multireg returns.
- DWORD_PTR retValArray[2];
- retPointer = (OBJECTREF*)retValArray;
-#else // ARM32, x86, AMD64 Windows.
- DWORD_PTR retVal;
- retPointer = (OBJECTREF*)&retVal;
-#endif
+ DWORD_PTR retVal = 0;
if (afterCallProtect) // Do I need to protect return value?
- {
-#if defined(UNIX_AMD64_ABI)
- numObjRefs = 2;
- retValArray[0] = regs->Rax;
- retValArray[1] = regs->Rdx;
-#elif defined(_TARGET_AMD64_)
+ {
+#ifdef _TARGET_AMD64_
retVal = regs->Rax;
#elif defined(_TARGET_X86_)
retVal = regs->Eax;
#elif defined(_TARGET_ARM_)
retVal = regs->R0;
#elif defined(_TARGET_ARM64_)
- numObjRefs = 2;
- retValArray[0] = regs->X0;
- retValArray[1] = regs->X1;
+ retVal = regs->X0;
#else
PORTABILITY_ASSERT("DoGCStress - return register");
#endif
- gcFrame.Init(pThread, retPointer, numObjRefs, TRUE);
+ gcFrame.Init(pThread, (OBJECTREF*) &retVal, 1, TRUE);
}
#endif // _TARGET_*
CONSISTENCY_CHECK(!pThread->HasPendingGCStressInstructionUpdate());
+#if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
if (afterCallProtect)
{
-#if defined(UNIX_AMD64_ABI)
- regs->Rax = retValArray[0];
- regs->Rdx = retValArray[1];
-#elif _TARGET_AMD64_
+#ifdef _TARGET_AMD64_
regs->Rax = retVal;
#elif defined(_TARGET_X86_)
regs->Eax = retVal;
#elif defined(_TARGET_ARM_)
regs->R0 = retVal;
#elif defined(_TARGET_ARM64_)
- regs->X0 = retValArray[0];
- regs->X1 = retValArray[1];
+ regs->X[0] = retVal;
#else
PORTABILITY_ASSERT("DoGCStress - return register");
#endif
gcFrame.Pop();
}
+#endif // _TARGET_*
#if !defined(USE_REDIRECT_FOR_GCSTRESS)
frame.Pop(pThread);
+++ /dev/null
-using System;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-// The test returns 2*pointer size struct where the second pointer is a managed object
-// and need a gc reference. On amd64 Unix and arm64 such structs are returned via registers.
-// The was a problem in GCStress infrastracture where it did not mark this pointer alive.
-
-namespace GitHub_23199
-{
- public class Program
- {
- [MethodImpl(MethodImplOptions.NoInlining)]
- static void Test1()
- {
- ProcessStartInfo pi = new ProcessStartInfo();
- // pi.Environment calls crossgened HashtableEnumerator::get_Entry returning struct that we need.
- Console.WriteLine(pi.Environment.Count);
- }
-
- struct A
- {
- public String a;
- public String b;
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- static A GetA()
- {
- A a = new A();
- a.a = new String("Hello");
- a.b = new string("World!");
- return a;
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- static void Test2()
- {
- A a = GetA();
- Console.WriteLine(a.a + " " + a.b);
- }
-
- static int Main(string[] args)
- {
- Test1();
- Test2();
- return 100;
- }
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <SchemaVersion>2.0</SchemaVersion>
- <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
- <OutputType>Exe</OutputType>
- <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
- <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
- </PropertyGroup>
- <!-- Default configurations to help VS understand the configurations -->
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "></PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
- <ItemGroup>
- <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
- <Visible>False</Visible>
- </CodeAnalysisDependentAssemblyPaths>
- </ItemGroup>
- <PropertyGroup>
- <DebugType>None</DebugType>
- <Optimize>True</Optimize>
- </PropertyGroup>
- <ItemGroup>
- <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="$(MSBuildProjectName).cs" />
- </ItemGroup>
- <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
- <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "></PropertyGroup>
-</Project>