Add pulling down coredistool package for gcstress test
authorSejong OH <sejooh@sejoohubuntu0.guest.corp.microsoft.com>
Sat, 20 Feb 2016 20:44:13 +0000 (12:44 -0800)
committerSejong OH <sejooh@microsoft.com>
Wed, 2 Mar 2016 12:07:54 +0000 (04:07 -0800)
Commit migrated from https://github.com/dotnet/coreclr/commit/c4613e00119c798ec9804ebb12bf3bb89e58840c

src/coreclr/src/vm/ceemain.cpp
src/coreclr/src/vm/disassembler.cpp [changed mode: 0644->0755]
src/coreclr/tests/runtest.sh
src/coreclr/tests/setup-gcstress.sh [new file with mode: 0755]

index e2419ac..668986b 100644 (file)
@@ -982,20 +982,15 @@ void EEStartupHelper(COINITIEE fFlags)
             ClrSleepEx(g_pConfig->StartupDelayMS(), FALSE);
         }
 #endif
-
+        
 #if USE_DISASSEMBLER
         if ((g_pConfig->GetGCStressLevel() & (EEConfig::GCSTRESS_INSTR_JIT | EEConfig::GCSTRESS_INSTR_NGEN)) != 0)
         {
             Disassembler::StaticInitialize();
             if (!Disassembler::IsAvailable())
             {
-#ifdef HAVE_GCCOVER
-#ifdef _DEBUG
-                printf("External disassembler is not available. Disabling GCStress for GCSTRESS_INSTR_JIT and GCSTRESS_INSTR_NGEN.\n");
-#endif // _DEBUG
-                g_pConfig->SetGCStressLevel(
-                    g_pConfig->GetGCStressLevel() & ~(EEConfig::GCSTRESS_INSTR_JIT | EEConfig::GCSTRESS_INSTR_NGEN));
-#endif // HAVE_GCCOVER
+                fprintf(stderr, "External disassembler is not available.\n");
+                IfFailGo(E_FAIL);
             }
         }
 #endif // USE_DISASSEMBLER
old mode 100644 (file)
new mode 100755 (executable)
index 9dd500c..ea44c61
@@ -70,7 +70,6 @@ bool Disassembler::IsAvailable()
 #endif // USE_COREDISTOOLS_DISASSEMBLER
 }
 
-// static
 void Disassembler::StaticInitialize()
 {
     LIMITED_METHOD_CONTRACT;
@@ -78,10 +77,35 @@ void Disassembler::StaticInitialize()
 #if USE_COREDISTOOLS_DISASSEMBLER
     _ASSERTE(!IsAvailable());
 
-    // TODO: The 'coredistools' library will eventually be part of a NuGet package, need to be able to load
-    // that using appropriate search paths
-    LPCWSTR libraryName = MAKEDLLNAME(W("coredistools"));
-    HMODULE libraryHandle = CLRLoadLibrary(libraryName);
+    HMODULE libraryHandle = nullptr;
+    PathString libPath;
+    DWORD result = WszGetModuleFileName(nullptr, libPath);
+    if (result == 0) {
+#ifdef _DEBUG
+        wprintf(
+            W("GetModuleFileName failed, function 'DisasmInstruction': error %u\n"),
+            GetLastError());
+#endif // _DEBUG
+        return;
+    }
+
+#if defined(FEATURE_PAL)
+    WCHAR delim = W('/');
+#else
+    WCHAR delim = W('\\');
+#endif
+    LPCWSTR libFileName = MAKEDLLNAME(W("coredistools"));
+    PathString::Iterator iter = libPath.End();
+    if (libPath.FindBack(iter, delim)) {
+        libPath.Truncate(++iter);
+        libPath.Append(libFileName);
+    }
+    else {
+        _ASSERTE(!"unreachable");
+    }
+
+    LPCWSTR libraryName = libPath.GetUnicode();
+    libraryHandle = CLRLoadLibrary(libraryName);
     do
     {
         if (libraryHandle == nullptr)
@@ -137,8 +161,8 @@ void Disassembler::StaticInitialize()
         return;
     } while (false);
 
-    CLRFreeLibrary(libraryHandle);
     _ASSERTE(!IsAvailable());
+    
 #endif // USE_COREDISTOOLS_DISASSEMBLER
 }
 
index b81094c..309ad83 100755 (executable)
@@ -756,8 +756,16 @@ copy_test_native_bin_to_test_root
 load_unsupported_tests
 load_failing_tests
 
+if [ -n "$COMPlus_GCStress" ]; then
+    scriptPath=$(dirname $0)
+    ${scriptPath}/setup-gcstress.sh --outputDir=$coreOverlayDir
+    if [ $? -ne 0 ] 
+    then
+        echo 'Failed to download coredistools library'
+        exit $EXIT_CODE_EXCEPTION
+    fi
+fi
  
-
 cd "$testRootDir"
 if [ -z "$testDirectories" ]
 then
@@ -789,4 +797,4 @@ if ((countFailedTests > 0)); then
     exit $EXIT_CODE_TEST_FAILURE
 fi
 
-exit $EXIT_CODE_SUCCESS
\ No newline at end of file
+exit $EXIT_CODE_SUCCESS
diff --git a/src/coreclr/tests/setup-gcstress.sh b/src/coreclr/tests/setup-gcstress.sh
new file mode 100755 (executable)
index 0000000..4d141b5
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/env bash
+
+#
+# This script should be located in coreclr/tests.
+#
+
+function print_usage {
+    echo ''
+    echo 'Download coredistool for GC stress testing'
+    echo ''
+    echo 'Command line:'
+    echo ''
+    echo './setup-gcstress.sh --outputDir=<coredistools_lib_install_path>'
+    echo ''
+    echo 'Required arguments:'
+    echo '  --outputDir=<path>         : Directory to install libcoredistools.so'
+    echo ''
+}
+
+# Argument variables
+libInstallDir=
+
+# Handle arguments
+verbose=0
+for i in "$@"
+do
+    case $i in
+        -h|--help)
+            exit $EXIT_CODE_SUCCESS
+            ;;
+        -v|--verbose)
+            verbose=1
+            ;;
+        --outputDir=*)
+            libInstallDir=${i#*=}
+            ;;
+        *)
+            echo "Unknown switch: $i"
+            print_usage
+            exit $EXIT_CODE_SUCCESS
+            ;;
+    esac
+done
+
+if [ -z "$libInstallDir" ]; then
+    echo "--libInstallDir is required."
+    print_usage
+    exit $EXIT_CODE_EXCEPTION
+fi
+
+# This script must be located in coreclr/tests.
+scriptDir=$(cd "$(dirname "$0")"; pwd -P)
+dotnetToolsDir=$scriptDir/../Tools
+dotnetCmd=${dotnetToolsDir}/dotnetcli/bin/dotnet
+packageDir=${scriptDir}/../packages
+jsonFilePath=${scriptDir}/project.json
+
+# Check tool directory
+if [ ! -e $dotnetToolsDir ]; then
+    echo 'Directory containing dotnet commandline does not exist:' $dotnetToolsDir 
+    exit 1
+fi
+if [ ! -e $dotnetCmd ]; then
+    echo 'donet commandline does not exist:' $dotnetCmd
+    exit 1
+fi
+
+# make package directory
+if [ ! -e $packageDir ]; then
+    mkdir -p $packageDir
+fi
+
+# make output directory
+if [ ! -e $libInstallDir ]; then
+    mkdir -p $libInstallDir
+fi
+
+# Write dependency information to project.json
+echo {  \
+    \"dependencies\": { \
+    \"Microsoft.NETCore.CoreDisTools\": \"1.0.0-prerelease-00001\" \
+    }, \
+    \"frameworks\": { \"dnxcore50\": { } } \
+    } > $jsonFilePath
+
+# Find runtime id 
+rid=`$dotnetCmd --version | grep 'Runtime Id:' | sed 's/^ *Runtime Id: *//g'`
+
+# Download the package
+echo Downloading CoreDisTools package
+bash -c -x "$dotnetCmd restore $jsonFilePath --source https://dotnet.myget.org/F/dotnet-core/ --packages $packageDir --runtime $rid"
+
+# Get library path
+libPath=`find $packageDir | grep $rid | grep -m 1 libcoredistools`
+if [ ! -e $libPath ]; then
+    echo 'Failed to locate the downloaded library'
+    exit 1
+fi
+
+# Copy library to output directory
+echo 'Copy library:' $libPath '-->' $libInstallDir/
+cp -f $libPath $libInstallDir
+
+# Delete temporary files
+rm -rf $jsonFilePath
+
+# Return success
+exit 0
+